【具体数学 Concrete Mathematics】2.1.3 和式的处理

本文围绕《具体数学》第2章中有限和式的化简方法展开,重点介绍三类基本变换(常数提取、线性拆分、一一映射重编号)、范围拆分的交集重复问题,以及核心技巧——扰动法:通过两种方式表达同一扩展和式,解出几何级数及其带权形式(如∑kxᵏ)。同时对比求导法在有限多项式下的等价性与适用边界,并强调x=1等特殊值需单独验证。所有推导面向计算机科学中的离散计算需求。

对应《具体数学:计算机科学基础(第 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∑n​ak​=j=1∑n​an+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∑m​ak​+k=m∑n​ak​=k=0∑n​ak​+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+1​ak​=Sn​+an+1​=a0​+k=0∑n​ak+1​,

其中 S n = ∑ k = 0 n a k S_n=\sum_{k=0}^{n}a_k Sn​=∑k=0n​ak​。这就是接下来扰动法的起点。

4. 扰动法:同一个新和式,用两种方式写

设

G n ( x ) = ∑ k = 0 n x k . G_n(x)=\sum_{k=0}^{n}x^k. Gn​(x)=k=0∑n​xk.

把 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∑n​kxk.

同样把 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∑n​kxk=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。本文按本节主题重新组织解释与推导,并补充程序核验;不是原文摘录。

专栏目录

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值