对应《具体数学:计算机科学基础(第 2 版)》第 2 章 §2.3,书内第 25—28 页。本文沿用专栏三级编号,以下求和均为有限求和。
化简和式常常不靠找到一条现成公式,而是把它改写成已经认识的形式。本节先整理合法的变换,再用“扰动”求出几何和与带权几何和。
1. 三类基本变换
设 K K K 是有限指标集合, c c c 与求和指标无关,则
∑ k ∈ K c a k = c ∑ k ∈ K a k , \sum_{k\in K}ca_k=c\sum_{k\in K}a_k, k∈K∑cak=ck∈K∑ak,
∑ k ∈ K ( a k + b k ) = ∑ k ∈ K a k + ∑ k ∈ K b k . \sum_{k\in K}(a_k+b_k) =\sum_{k\in K}a_k+\sum_{k\in K}b_k. k∈K∑(ak+bk)=k∈K∑ak+k∈K∑bk.
第三类变换是重新编号。如果 p : J → K p:J\to K p:J→K 是一一对应,那么
∑ k ∈ K a k = ∑ j ∈ J a p ( j ) . \sum_{k\in K}a_k=\sum_{j\in J}a_{p(j)}. k∈K∑ak=j∈J∑ap(j).
它的本质是同一批项换一个枚举顺序。这里要求既不遗漏也不重复。
例如,把 1 , 2 , … , n 1,2,\ldots,n 1,2,…,n 反向编号为 n , n − 1 , … , 1 n,n-1,\ldots,1 n,n−1,…,1,可以写
∑ k = 1 n a k = ∑ j = 1 n a n + 1 − j . \sum_{k=1}^{n}a_k=\sum_{j=1}^{n}a_{n+1-j}. k=1∑nak=j=1∑nan+1−j.
但把 k k k 直接换成 2 j 2j 2j,只会枚举偶数下标;除非原指标集合本来就只含这些偶数,否则不能视为等价变换。
2. 反向编号为什么能求等差和?
令
S = ∑ k = 0 n ( a + d k ) . S=\sum_{k=0}^{n}(a+dk). S=k=0∑n(a+dk).
反向编号后
S = ∑ k = 0 n ( a + d ( n − k ) ) . S=\sum_{k=0}^{n}\bigl(a+d(n-k)\bigr). S=k=0∑n(a+d(n−k)).
两个式子逐项相加,含 k k k 的部分消失:
2 S = ∑ k = 0 n ( 2 a + d n ) = ( n + 1 ) ( 2 a + d n ) . 2S=\sum_{k=0}^{n}(2a+dn) =(n+1)(2a+dn). 2S=k=0∑n(2a+dn)=(n+1)(2a+dn).
于是
S = ( n + 1 ) ( a + d n 2 ) . \boxed{S=(n+1)\left(a+\frac{dn}{2}\right).} S=(n+1)(a+2dn).
这是“项数乘首尾平均值”。这里是从 0 0 0 到 n n n,所以项数是 n + 1 n+1 n+1。这个常见结论背后,正是换序、合并和提常数三步。
3. 拆范围时,交集会被算两遍
对有限集合 A , B A,B A,B,有
∑ k ∈ A a k + ∑ k ∈ B a k = ∑ k ∈ A ∪ B a k + ∑ k ∈ A ∩ B a k . \sum_{k\in A}a_k+\sum_{k\in B}a_k =\sum_{k\in A\cup B}a_k+\sum_{k\in A\cap B}a_k. k∈A∑ak+k∈B∑ak=k∈A∪B∑ak+k∈A∩B∑ak.
因此当 0 ≤ m ≤ n 0\le m\le n 0≤m≤n 时,
∑ k = 0 m a k + ∑ k = m n a k = ∑ k = 0 n a k + a m . \sum_{k=0}^{m}a_k+\sum_{k=m}^{n}a_k =\sum_{k=0}^{n}a_k+a_m. k=0∑mak+k=m∑nak=k=0∑nak+am.
两段都包含 m m m,这一项就重复了。若要恰好拼接,应把第二段改成从 m + 1 m+1 m+1 开始。
把首项或末项拆出来,也是合法的范围拆分:
∑ k = 0 n + 1 a k = S n + a n + 1 = a 0 + ∑ k = 0 n a k + 1 , \sum_{k=0}^{n+1}a_k =S_n+a_{n+1} =a_0+\sum_{k=0}^{n}a_{k+1}, k=0∑n+1ak=Sn+an+1=a0+k=0∑nak+1,
其中 S n = ∑ k = 0 n a k S_n=\sum_{k=0}^{n}a_k Sn=∑k=0nak。这就是接下来扰动法的起点。
4. 扰动法:同一个新和式,用两种方式写
设
G n ( x ) = ∑ k = 0 n x k . G_n(x)=\sum_{k=0}^{n}x^k. Gn(x)=k=0∑nxk.
把 G n + 1 ( x ) G_{n+1}(x) Gn+1(x) 的末项拆掉,得到 G n ( x ) + x n + 1 G_n(x)+x^{n+1} Gn(x)+xn+1;把首项拆掉并平移指标,得到 1 + x G n ( x ) 1+xG_n(x) 1+xGn(x)。所以
G n ( x ) + x n + 1 = 1 + x G n ( x ) . G_n(x)+x^{n+1}=1+xG_n(x). Gn(x)+xn+1=1+xGn(x).
当 x ≠ 1 x\ne1 x=1 时,解出
G n ( x ) = 1 − x n + 1 1 − x . \boxed{G_n(x)=\frac{1-x^{n+1}}{1-x}.} Gn(x)=1−x1−xn+1.
当 x = 1 x=1 x=1 时,不能用分母为零的式子,但原和式毫无问题:它就是 n + 1 n+1 n+1。
注意这里讨论有限和。即使 x = 3 x=3 x=3 或 x = − 2 x=-2 x=−2,公式仍然成立;只有以后把上限送到无穷时,才需要额外讨论收敛条件。
5. 带上权重 k k k,还能扰动吗?
现在考虑
S n ( x ) = ∑ k = 0 n k x k . S_n(x)=\sum_{k=0}^{n}kx^k. Sn(x)=k=0∑nkxk.
同样把 S n + 1 S_{n+1} Sn+1 写成两种形式:
S n ( x ) + ( n + 1 ) x n + 1 = ∑ k = 0 n ( k + 1 ) x k + 1 = x S n ( x ) + x G n ( x ) . \begin{aligned} S_n(x)+(n+1)x^{n+1} &=\sum_{k=0}^{n}(k+1)x^{k+1}\\ &=xS_n(x)+xG_n(x). \end{aligned} Sn(x)+(n+1)xn+1=k=0∑n(k+1)xk+1=xSn(x)+xGn(x).
因此
( 1 − x ) S n ( x ) = x G n ( x ) − ( n + 1 ) x n + 1 . (1-x)S_n(x)=xG_n(x)-(n+1)x^{n+1}. (1−x)Sn(x)=xGn(x)−(n+1)xn+1.
代入几何和并整理,得到
S n ( x ) = x − ( n + 1 ) x n + 1 + n x n + 2 ( 1 − x ) 2 , x ≠ 1. \boxed{S_n(x)= \frac{x-(n+1)x^{n+1}+nx^{n+2}}{(1-x)^2},\quad x\ne1.} Sn(x)=(1−x)2x−(n+1)xn+1+nxn+2,x=1.
当 x = 1 x=1 x=1 时,应回到原式,得到 n ( n + 1 ) / 2 n(n+1)/2 n(n+1)/2。
例如 n = 4 , x = 3 n=4,x=3 n=4,x=3:
3 + 2 ⋅ 9 + 3 ⋅ 27 + 4 ⋅ 81 = 426. 3+2\cdot9+3\cdot27+4\cdot81=426. 3+2⋅9+3⋅27+4⋅81=426.
公式右边同样为
3 − 5 ⋅ 3 5 + 4 ⋅ 3 6 4 = 426. \frac{3-5\cdot3^5+4\cdot3^6}{4}=426. 43−5⋅35+4⋅36=426.
这个推导的关键不是展开了多少项,而是平移后出现的 ( k + 1 ) x k + 1 (k+1)x^{k+1} (k+1)xk+1 可以拆成“原和式”与“已知几何和”。
6. 另一条路线:对有限多项式求导
由于 G n ( x ) G_n(x) Gn(x) 是有限多项式,可以逐项求导:
x G n ′ ( x ) = ∑ k = 1 n k x k = S n ( x ) . xG_n'(x)=\sum_{k=1}^{n}kx^k=S_n(x). xGn′(x)=k=1∑nkxk=Sn(x).
这也能得到同一个公式。有限和的逐项求导没有级数收敛问题;若把和式换成无限级数,则不能不加条件地照搬这一步。
两种方法各有用途:扰动法只使用和式变换;求导法适合通项中带有 k k k、 k ( k − 1 ) k(k-1) k(k−1) 等权重,而且参数以幂的形式出现的情形。
7. 精确验证与自测
from fractions import Fraction
def weighted_geometric(n, x):
if x == 1:
return Fraction(n * (n + 1), 2)
return (x - (n + 1) * x ** (n + 1)
+ n * x ** (n + 2)) / (1 - x) ** 2
for n in range(26):
for x in map(Fraction, [-2, -1, 0, 1, 2, 3]):
direct = sum((k * x ** k for k in range(n + 1)), Fraction(0))
assert direct == weighted_geometric(n, x)
x = Fraction(1, 3)
assert sum(k * x ** k for k in range(n + 1)) == weighted_geometric(n, x)
print(weighted_geometric(4, Fraction(3))) # 426
换元后只改通项、不改范围,可能错在哪里? 首尾项会发生变化,甚至项数也不同。
为什么不能直接把 x = 1 x=1 x=1 代入分式? 推导过程中除以了 1 − x 1-x 1−x,这个操作排除了 x = 1 x=1 x=1;原和式仍有定义。
扰动后未知和式完全抵消,说明一定算错了吗? 不一定,可能只是这个扰动没有提供新信息。下一小节之后的一般方法会讨论如何改选辅助和式。
参考:Ronald L. Graham、Donald E. Knuth、Oren Patashnik 著,张明尧、张凡译,《具体数学:计算机科学基础(第 2 版)》,人民邮电出版社,§2.3。本文按本节主题重新组织解释与推导,并补充程序核验;不是原文摘录。
本文围绕《具体数学》第2章中有限和式的化简方法展开,重点介绍三类基本变换(常数提取、线性拆分、一一映射重编号)、范围拆分的交集重复问题,以及核心技巧——扰动法:通过两种方式表达同一扩展和式,解出几何级数及其带权形式(如∑kxᵏ)。同时对比求导法在有限多项式下的等价性与适用边界,并强调x=1等特殊值需单独验证。所有推导面向计算机科学中的离散计算需求。
404

被折叠的 条评论
为什么被折叠?



