设 `x_n` (`n ge 0`) 是一个数列. 定义 `x_n` 的差分为 `Delta x_n = x_(n+1) - x_n`, 其中 `Delta` 称为差分算子. 定义 `x_n` 是自己的零阶差分: `x_n = Delta^0 x_n`. 一般地, 对任意正整数 `k`, `x_n` 的 `k` 阶差分递归定义为 `Delta^k x_n = Delta( Delta^(k-1) x_n)`. 差分可以类比于微分运算.
上面定义的差分又叫向前差分. 还可以定义向后差分与中心差分 `grad x_n = x_n - x_(n-1)`, `quad delta x_n = x_(n+1/2) - x_(n-1/2)`. 下文我们只讨论向前差分.
利用差分表计算 `x_n = 2 n^2 + 3 n + 1` 的各阶差分.
1 6 15 28 45 66 91 .. 5 9 13 17 21 25 .. 4 4 4 4 4 .. 0 0 0 0 ..从 3 阶差分开始, 每一行都是零.
使用组合数进行符号计算. 将 `x_n` 改写为
`x_n = 4(n;2) + 5(n;1) + (n;0)`,
从而
`Delta x_n = 4(n;1) + 5(n;0)`,
`Delta^2 x_n = 4(n;0)`,
`Delta^3 x_n = 0`.
如同微积分中我们有一张常用函数的导数表一样, 我们来推导一些常见数列的差分.
指数函数的差分公式 直接计算, `Delta 2^n = 2^n`, `quad Delta a^n = a^n (a-1)`, `quad Delta^k a^n = a^n (a-1)^k`. `2^n` 的差分是它自己, 这一性质对应于微积分中的 `"e"^x`. 如果记 `H_n = sum_(k=1)^n 1/k`, 则 `Delta H_n = 1/(n+1)`, 这一性质对应于微积分中的 `ln x`.
下降幂与上升幂
设 `k` 为非负整数,
`n^(ul k) = prod_(0 le i lt k) (n-i) = n(n-1) cdots (n-k+1)`,
`n^(bar k) = prod_(0 le i lt k) (n+i) = n(n+1) cdots (n+k-1)`.
下降幂与二项式系数只相差系数 `k!`:
`n^(ul k)/(k!) = (n;k)`.
下面考虑负指数的下降幂. 设 `k` 为正整数, 定义
`n^(ul(-k)) = prod_(1 le i le k) (n+i)^-1`
`= 1/((n+1)(n+2) cdots (n+k))`.
特别地 `n^(ul(-1)) = 1/(n+1)`.
下降幂的差分公式 `k` 为非负整数时, 由 Pascal 公式 `(n+1; k) = (n; k) + (n; k-1)` 知 `Delta (n;k) = (n; k-1)`. 写成下降幂形式就是 `Delta n^(ul k) = k n^(ul(k-1))`. 可以验证上式对于负指数下降幂仍成立. 因此, 下降幂的差分仍是一个下降幂, 这对应于微分学的公式 `"d"/dx x^n = n x^(n-1)`. 然而 `n^k` 没有简单的差分公式, 所以在离散数学的世界里, 用下降幂代替普通的幂, 往往能简化计算.
`f(n)` | `Delta f(n)` | `f(n)` | `Delta f(n)` |
`2^n` | `2^n` | `a^n` | `a^n(a-1)` |
`(n;k)` | `(n;k-1)` | `n^(ul k)` | `k n^(ul(k-1))` |
`H_n` | `n^(ul(-1))` |
类似可证 `sum_(k=0)^(n-m) x_k (y_(k+m) - y_k)` `= [x_k y_k]_0^n - sum_(k=0)^(n-m) y_(k+m) (x_(k+m)-x_k)`.
求 `sum k 2^k`, 其中求和范围是 `0 le k lt n`.
`sum k 2^k = sum k Delta 2^k = [k 2^k]_0^n - sum 2^(k+1) Delta k` `= n 2^n - 2 sum Delta 2^k = n 2^n - 2 [2^k]_0^n` `= n 2^n - 2(2^n - 1)`.
求 `sum H_k`, 求和范围是 `0 le k lt n`.
`sum H_k = sum H_k Delta k = [k H_k]_0^n - sum (k+1) Delta H_k` `= n(H_n - 1)`.
[来自 我是的的是我] `sum_(k=1)^n (H(k))/k = 1/2(H_n^2 + H_n^((2)))`, 其中 `H_n^((r)) = sum_(k=1)^n 1/k^r` 是广义调和数.
`n = 0` 时等式显然成立; 右边差分得 `1/2[H_n^2 - H_(n-1)^2 + H_n^((2)) - H_(n-1)^((2))]` `= 1/2[1/n(2H_(n-1) + 1/n) + 1/n^2]` `= (H_n)/n`, 等于左边的差分; 等式得证.
记左边为 `S`, 于是
`S = [H_k H_(k-1)]_1^(n+1) - sum_(k=1)^n H_k/(k+1)`
`= H_(n+1) H_n - sum_(k=1)^n H_k/(k+1)`
`= H_n^2 - sum_(k=1)^(n-1) H_k/(k+1)`
`= H_n^2 + sum_(k=1)^(n-1) 1/(k+1)^2 - sum_(k=1)^(n-1) H_(k+1)/(k+1)`
`= H_n^2 + H_n^((2)) - S`.
一般地, 对任意正整数 `a, b`, 运用分部求和得 `sum_(k=1)^n H_k^((a))/k^b = H_n^((a)) H_n^((b)) + H_n^((a+b)) - sum_(k=1)^n H_k^((b))/k^a`. 特别当 `a = b` 时, `sum_(k=1)^n H_k^((a))/k^a = 1/2((H_n^((a)))^2 + H_n^((2a)))`.
应用离散微积分的方法导出朱世杰恒等式: `sum_(k=0)^n (k;p)` `= sum_(k=0)^n Delta (k; p+1)` `= (n+1; p+1) - (0; p+1)` `= (n+1; p+1)`.
使用下降幂的差分求 `sum_(k=1)^n k^2`, `sum_(k=1)^n k^3`.
本节的最后导出几个有用的公式.
组合反演公式 关于数列 `{x_n}, {y_n}`, 若 `y_n = sum_(k=0)^n (n;k) x_k`, 则 `x_n = sum_(k=0)^n (n;k) (-1)^(n-k) y_k`. 如果记 `x_n = x^n`, `y_n = y^n`, 以上结论形式地记为 `y^n = (x+1)^n` `rArr x^n = (y-1)^n`. 或对称地, `y^n = (1-x)^n` `rArr x^n = (1-y)^n`. 用矩阵记为 `(a_(i j))^-1 = (-1)^(i-j) (a_(i j))`, `quad a_(i j) = (i;j)`.
代入验证, `sum_(k=0)^n (n;k) (-1)^(n-k) sum_(j=0)^k (k;j) x_j` `= sum_(j=0)^n x_j sum_(k=j)^n (n;k)(k;j) (-1)^(n-k)` `= sum_(j=0)^n x_j A_j`. 其中 `A_j = sum_(k=0)^(n-j) (n;k)(n-k;j) (-1)^k` `= sum_(k=0)^(n-j) (n;j)(n-j;k) (-1)^k` `= (n;j) (1-1)^(n-j)` `= {1, if j = n; 0, if j lt n:}` 因此 `sum_(j=0)^n x_j A_j = x_n`.
`k` 阶差分公式
`Delta^k x_n = sum_(j=0)^k (k;j) (-1)^(k-j) x_(n+j)`.
如果记 `x_n = x^n`, 上式形式地写为
`Delta^k x^n = (x-1)^k x^n`, 亦即 `Delta = x - 1`.
该表达式与指数函数的 `k` 阶差分一致.
反演得到离散 Maclaurin 公式:
`x_(n+k) = sum_(j=0)^k (k;j) Delta^j x_n`
`= sum_(j=0)^k (Delta^j x_n)/(j!) k^(ul j)`.
形式记为
`x^(n+k) = (Delta+1)^k x^n`, 亦即 `x = Delta + 1`.
向后差分、中心差分也有类似的表达式.
`k = 0` 时, `Delta^0 x_n = x_n` 成立; 假设等式对 `k-1` 成立, 则
`Delta^k x_n = Delta^(k-1) x_(n+1) - Delta^(k-1) x_n`
`= sum_(j=0)^(k-1) (k-1; j) (-1)^(k-1-j) x_(n+1+j)`
`- sum_(j=0)^(k-1) (k-1; j) (-1)^(k-1-j) x_(n+j)`
`= x_(n+k) - (-1)^(k-1) x_n`
`+ sum_(j=1)^(k-1) (-1)^(k-j) x_(n+j) ((k-1; j-1) + (k-1; j))`
`= sum_(j=0)^k (k;j) (-1)^(k-j) x_(n+j)`.
离散 Maclaurin 公式 设 `x_n` 为数列通项, `m` 为非负整数, 且对任意 `k gt m` 有 `Delta^k x_0 = 0`, 则 `x_n = sum_(k=0)^m (n;k) Delta^k x_0` `= sum_(k=0)^m (Delta^k x_0)/(k!) n^(ul k)`.
首先由大于 `m` 阶的差分都等于零知, `x_n` 是关于 `n` 的多项式.
因为 `(n; k)` 是关于 `n` 的 `k` 次多项式, `k = 0, 1, cdots, m`, 所以
`(n;k)` 线性无关, 它们组成多项式空间 `bbb P{::}_m[x]` 的基.
下面计算 `(n;k)` 的差分.
因为 `Delta_n (n;k) = (n;k-1)`, 所以
`{: Delta_n^j (n;k) |_(n=0) = {: (n; k-j) |_(n=0)`
`= delta_(j k) = { 1, if j = k; 0, if j != k :}`.
现在将多项式 `x_n` 用基底线性表示为
`x_n = sum_(k=0)^m c_k (n; k)`,
则由差分的线性性知,
`Delta_n^j x_0 = sum_(k=0)^m c_k {:Delta_n^j (n;k)|_(n=0)`
`= sum_(k=0)^m c_k delta_(j k)`
`= c_j`.
所以公式成立.
带余项的离散 Maclaurin 公式 `x_n = sum_(k=0)^m (n;k) Delta^k x_0 + R_m(n)`, 其中 `R_m(n) = sum_(0 le k lt n) (n-k-1; m) Delta^(m+1) x_k`.
设 `m gt 0`, 对 `R_m(n)` 分部求和, `{: R_m(n) ,= sum_(0 le k lt n-1) (n-k-1; m) Delta^(m+1) x_k; ,= [(n-k-1; m) Delta^m x_k]_(k=0)^(n-1) + sum_(0 le k lt n-1) (n-k-2; m-1) Delta^m x_(k+1); ,= -(n-1; m) Delta^m x_0 + sum_(1 le k lt n) (n-k-1; m-1) Delta^m x_k; ,= -(n-1; m) Delta^m x_0 - (n-1; m-1) Delta^m x_0 + sum_(0 le k lt n) (n-k-1; m-1) Delta^m x_k; ,= -(n; m) Delta^m x_0 + R_(m-1) (n).:}` 于是 `R_0(n) = sum_(1 le k le m) (R_(k-1)(n) - R_k(n)) + R_m(n)`, 即 `x_n - x_0 = sum_(1 le k le m) (n;k) Delta^k x_0 + R_m(n)`.
Stirling 数 从线性代数的角度, `{x^k}_(k=0)^n` 与 `{x^(ul k)}_(k=0)^n` 是次数不超过 `n` 的多项式组成的线性空间 `bbb P{::}_n[x]` 的两个基底. 为了方便离散微积分运算, 需要将多项式的基由普通幂换为下降幂. 下面定义的两类 Stirling 数分别给出了两组基底之间互化的系数 (即过渡矩阵): `x^(ul n) = sum_(k=0)^n (-1)^(n-k) s(n, k) x^k`, `quad x^n = sum_(k=0)^n S(n, k) x^(ul k)`. 其中 `s(n, k)` 称为第一类 Stirling 数, 也记为 `[n;k]`, `S(n, k)` 称为第二类 Stirling 数, 也记为 `{n;k}`.
两类 Stirling 数的反演 由两类 Stirling 数构成的系数矩阵互逆知, `y_n = sum_(k=0)^n S(n, k) x_n` `iff` `x_n = sum_(k=0)^n (-1)^(n-k) s(n, k) y_n`.
我们先讨论第二类 Stirling 数.
1 0 1 0 1 1 0 1 3 1 0 1 7 6 1 0 1 15 25 10 1
递推公式 `S(n, k) = { 1, if n = k; 0, if n gt 0 and k = 0; S(n-1, k-1) + k S(n-1, k), otherwise; :}`
从定义式 `x^n = sum_(k=0)^n S(n, k) x^(ul k)` 出发.
考虑两边的 `n` 次项系数和常数项分别可得 `S(n, n) = 1` (`n ge 0`) 和
`S(m, 0) = 0` (`m gt 0`). 现在设 `n gt 0`, 两边对 `x` 差分得到
`(x+1)^n - x^n = sum_(k=1)^n S(n, k) k x^(ul (k-1))`.
另一方面
`(x+1)^n - x^n`
`= 1/(x+1) (x+1)^(n+1) - x^n`
`= 1/(x+1) sum_(k=1)^(n+1) S(n+1, k) (x+1)^(ul k)`
`- sum_(k=1)^n S(n, k) x^(ul k)`
`= sum_(k=1)^(n+1) S(n+1, k) x^(ul(k-1))`
`- sum_(k=2)^(n+1) S(n, k-1) x^(ul(k-1))`
`= sum_(k=1)^n S(n+1, k) x^(ul(k-1))`
`- sum_(k=1)^n S(n, k-1) x^(ul(k-1))`.
比较得
`k S(n, k) = S(n+1, k) - S(n, k-1)`.
通项公式 `S(n,k) = 1/k! sum_(j=0)^k (k;j) (-1)^j (k-j)^n`. 令 `S^k = k^n`, 上式形式写为 `S(n, k) = 1/k! (S-1)^k`.
只需验证这个通项公式适合边界条件和递推公式, 过程略.
在定义式 `x^n = sum_(k=0)^n S(n, k) x^(ul k)` 中, 考虑数列 `1^n, 2^n, 3^n, cdots, n^n`, 由离散 Maclaurin 公式和 `k` 阶差分公式 `S(n,k) = 1/k! {:Delta_x^k x^n|_(x=0)` `= 1/k! sum_(i=0)^k (k;j) (-1)^j (k-j)^n`.
组合意义 `n` 元集到 `k` 元集的满射数等于 `k! S(n, k)`. 换言之, 将 `n` 元集划分为 `k` 份, 每份不空的方法数为 `S(n, k)`.
应用容斥原理, `n` 元集到 `k` 元集的满射数目等于全部映射 `k^n`, 减去有一个元素无原像的情形 `(k;1) (k-1)^n`, 再加上有两个元素无原像的情形 `(k;2) (k-2)^n`, 再减去有三个元素无原像的情形... 最终得到 `sum_(j=0)^k (k;j) (-1)^j (k-j)^n = k! S(n, k)`.
`n` 元集到 `k` 元集的映射, 相当于 `n` 元集到 `j` 元集的满射总和, `j = 0, 1, cdots, k`: `k^n = sum_(j=0)^k (k;j) S'(n, j)`, 反演得 `S'(n, k) = sum_(j=0)^k (k;j) (-1)^(k-j) j^n`, 因此 `S'(n, k) = k! S(n, k)`.
等幂求和
记 `(:n;k:) = S(n,k) k!`, `S_n(x) = sum_(i=1)^x i^n`. 则
`S_n(x) = sum_(k=0)^n (:n;k:) (x+1; k+1)`, `quad n ge 1`.
关于第一类和第二类 Bernoulli 数, 分别有
`B_n^(-) = sum_(k=0)^n (:n;k:) (-1)^k/(k+1)`, `quad n ge 0`,
`B_n^(+) = sum_(k=0)^n (:n;k:) (-1)^(k-1)/(k(k+1))`, `quad n ge
1`.
由第二类 Stirling 数定义
`i^n = sum_(k=0)^n (:n;k:) (i;k)`,
两边令 `i` 从 `0` 到 `x` 求和就得到第一式.
再和 Bernoulli 数的公式
`S_n(x) = 1/(n+1) sum_(k=0)^n (n+1;k) B_k^(+) x^(n+1-k)`
比较一次项系数, 就得到 `B_n^(+)` 的表达式.
同理比较
`S_n(x-1) = sum_(k=0)^n (:n;k:) (x;k+1)`, `quad n ge 1`,
`S_n(x-1) = 1/(n+1) sum_(k=0)^n (n+1;k) B_k^(-) x^(n+1-k)`,
`quad n ge 1`
的一次项系数得
`B_n^(-) = sum_(k=0)^n (:n;k:) (-1)^k/(k+1)`, `quad n ge 1`.
容易验证上式对 `n=0` 也成立.
1 0 1 0 1 1 0 2 3 1 0 6 11 6 1 0 24 50 35 10 1
验算: `[ 1; 0, 1; 0, 1, 1; 0, 1, 3, 1; 0, 1, 7, 6, 1; 0, 1, 15, 25, 10, 1; ] [ 1; 0, 1; 0, -1, 1; 0, 2, -3, 1; 0, -6, 11, -6, 1; 0, 24, -50, 35, -10, 1; ] = bm I`
递推公式 `s(n, k) = { 1, if n = k; 0, if n gt 0 and k = 0; s(n-1, k-1) + (n-1) s(n-1, k), otherwise; :}` 第一类 Stirling 数没有实用的通项公式.
Euler 数 对正整数 `n` 和 正整数 `k le n`, `A_(n, k) = { 1, if n = 1 or k = n; (n-k+1) A_(n-1,k-1) + k A_(n-1, k), otherwise; :}` 表示 `1~n` 的排列中, 恰有 `k-1` 个相邻逆序对的排列数. 比如 `1, 3, 5, 4, 2` 中, `(5, 4)`, `(4, 2)` 是两个相邻逆序对. 由定义 `sum_(k=1)^n A_(n, k) = n!`.
1 1 1 1 4 1 1 11 11 1 1 26 66 26 1 1 57 302 302 57 1
[来自 诗许] 多项式的基底表示 `x^n = sum_(k=1)^n (x+k-1; n) A_(n, k)`. 此公式两边对 `n` 求和即得到又一个等幂求和公式.
归纳证明. `n = 1` 时 `x = (x+1-1; 1) A_(1, k)` 成立.
假设命题对 `n` 成立, 考虑 `n+1` 的情形:
`sum_(k=1)^(n+1) (x+k-1; n+1) A_(n+1, k)`
`= (x; n+1) + (x+n; n+1)`
`+ sum_(k=2)^n (x+k-1; n+1)[(n-k+2) A_(n,k-1) + k A_(n, k)]`
`= (x; n+1) + (x+n; n+1)`
`+ sum_(k=1)^(n-1) (x+k; n+1) (n-k+1) A_(n,k) + sum_(k=2)^n (x+k-1; n+1) k A_(n,k)`
`= (x; n+1) + (x+n; n+1) + (x+1; n+1) n + (x+n-1; n+1) n`
`+ sum_(k=2)^(n-1) A_(n,k) (x+k-1; n)((x+k)(n-k+1)
+ k(x+k-n-1))/(n+1)`
`= sum_(k=1)^n A_(n, k) (x+k-1; n) x`
`= x^(n+1)`.
Euler 数的显式表达式为 `A_(n, k) = sum_(j=0)^k (n+1; j) (-1)^j (k-j)^n`.
from itertools import combinations def check(t, n): s = set(abs(t[i] - t[j]) for i in range(len(t)) for j in range(i, len(t))) s = s.union(t) s = s.union(n-v for v in t) return len(s) == n # 输入尺子长度 n, 求最小的 k 使得尺子能量出 [0..n] 的所有长度 def golomb(n, mink=1): if n < 3: return n+1 for k in range(mink, n-1): for t in combinations(range(1,n), k): if check(t, n): print(0, *t, n) return len(t)+2 return -1 print(golomb(6))得到的前几个尺子: