可以当作《具体数学》5.7 节的读书笔记,不过这篇笔记对一些流程给出了更简洁的形式以便记忆。
注意
为了突出代数属性,我们将使用 t(k) 而非 tk 表示数列。
如果数列 t(k) 满足 t(k)t(k+1) 是关于 k 的有理函数(即两多项式之比),则称 t(k) 是一个超几何项数列。
Gosper 算法可以对一个超几何项数列 t(k) 求出另一个超几何项数列 T(k) 使得 t(k)=T(k+1)−T(k),或者报告它不能表示为超几何项。
以下是步骤。我把它放在前面,以便随时温习,第一次看的同学可以直接跳过。
- 将 t(k)t(k+1) 表示为 p(k)p(k+1)r(k+1)q(k)
使得 q(k) 的所有因式 (k+α) 和 r(k) 的所有因式 (k+β) 都满足 α−β∈/N∗; - 记 Q(k)=q(k)−r(k),R(k)=q(k)+r(k)
(我们在多数情况只需要它们的次数,当然有时也需要最高次项系数)- 令 d=deg(p)−max{deg(Q),deg(R)−1};
- 若 deg(Q)<deg(R),令 d2=−2[kdeg(R)]R[kdeg(R)−1]Q,
若 d2≤d 则忽略 d2。
- 若 d≥0,对 d 次多项式待定系数解方程 p(k)=q(k)s(k+1)−r(k)s(k)。如果失败,尝试 d2;
- T(k)=p(k)r(k)s(k)t(k)。
将 t(k)t(k+1) 表示为 p(k)p(k+1)r(k+1)q(k),其中 p,q,r 都是多项式,
使得 q(k) 的所有因式 (k+α) 和 r(k) 的所有因式 (k+β) 都满足 α−β∈/N∗。
如果没有 α−β∈/N∗ 的条件,这一步是平凡的。所以我们把重心放在怎么处理冲突(相减为正整数)的因式上。
我们先将分式因式分解好。以 t(k)t(k+1)=k(k+21)(k+1)2(k+23)(k+4) 为例:
注意虽然分母虽然是 r(k+1) 而非 r(k),但是如果上下没有相同的因式(如果有请自觉回初中复习约分),冲突的判定仍然是上下因式相减为正整数。
于是它有两对冲突 (k+23),(k+21) 和 (k+4),(k+1)。当然还有第三对——(k+4),k,不过我们处理第二对的时候会把 (k+4) 处理掉,不需要考虑。
第一对冲突是软“式”子,由于上下差为 1,我们可以把它移到前面去,当作 p(k):
t(k)t(k+1)=(k+21)(k+23)k(k+1)2(k+4)
第一对冲突解决了,我们来看第二对。容易想到在这对苦命鸳鸯中间插入几项:
(k+1)(k+4)=(k+1)(k+2)(k+3)(k+4)(k+1)(k+2)(k+3)(k+4)
然后我们惊喜地发现上下因式可以移到前面去了,于是有
t(k)t(k+1)=(k+21)(k+1)(k+2)(k+3)(k+23)(k+2)(k+3)(k+4)k2
于是 p(k)=(k+21)(k+1)(k+2)(k+3),q(k)=2,r(k)=k−1。
这应该是最难理解的一步了。实际上这一步的存在是为了辅助第三步的解方程——我们一般不会头铁到直接解,而是在第二步算出它的次数。(当然如果你的注意力够好也可以试试直接解)
为了方便地描述步骤,我们规定一些记号:
- deg(Q) 为多项式 Q 的次数。特别地,deg(0)=−1。
- [kn]Q 为多项式 Q 的 n 次项系数。
记 Q(k)=q(k)−r(k),R(k)=q(k)+r(k),分类讨论:
若 deg(Q)≥deg(R),令 d=deg(p)−deg(Q);
若 deg(Q)<deg(R),令 d=deg(p)−deg(R)+1;
此时令 d2=−2[kdeg(R)]R[kdeg(R)−1]Q,若 d2<d 则忽略 d2。
d2 的情况不常用。对于常用的情况,由于多项式的次数都是整数,我们有一个容易记忆的公式:
d=deg(p)−max{deg(Q),deg(R)−1}
来看两个例子。
p(k)=k,q(k)=α,r(k)=1,α 为参数(这是出题人最爱的差乘比,发现了吗?)
Q(k),R(k) 都是常函数,deg(p)=1,deg(Q)=deg(R)=0,
于是 d=deg(p)−max{deg(Q),deg(R)−1}=1。
p(k)=1,q(k)=k2−3k+3,r(k)=k2−2k+1,此时 Q(k)=−k+2,R(k)=2n2−5k+4
于是我们有 d=deg(p)−max{deg(Q),deg(R)−1}=−1,坏了!
所以 d2 出手了。看看系数(标红的是 deg(R) 次项,标蓝的是 deg(R)−1 次项):
Q(k)=2k2 −1k+2R(k)=2k2−5k+4
于是 d2=−2×2−1=1。
若 d≥0,对 d 次多项式 s(k) 待定系数解方程
p(k)=q(k)s(k+1)−r(k)s(k)
如果失败,尝试 d2。都失败则无解。
若有解,令 T(k)=p(k)r(k)s(k)t(k) 即可。
没什么技术含量。所以我们下面不给例子,而是回答一个问题:为什么可以这么做?
T(k+1)−T(k)=p(k+1)r(k+1)s(k+1)t(k+1)−p(k)r(k)s(k)t(k)=p(k)q(k)s(k+1)t(k)−p(k)r(k)s(k)t(k)=q(k)s(k+1)−r(k)s(k)q(k)s(k+1)t(k)−r(k)s(k)t(k)=t(k)(应用 p,q,r 满足的等式)(对分母应用 s 满足的方程)(哦,这是极好的)
所以 Gosper 到底是怎么注意到这件事的?
在这里不给出可行性证明,大家可以自行翻阅《具体数学》对应章节。
注意到
k=1∑nt(k)=k=1∑nT(k+1)−T(k)=T(n+1)−T(1)
嗯,没了。
你可以酌情写多点,但注意无论如何都要硬说 T(k+1)−T(k)=t(k) 是你注意到的,别把 Gosper 供出来!
用 Gosper 求和法对 t(k) 满足
- t(k)=k2
- t(k)=kαk, α=1
- t(k)=k2αk, α=1
- t(k)=(−1)kCnk, 0≤k≤n
- t(k)=k2−11
- t(k)t(k+1)=k2k2−3k+3
分别求 T(k) 使得 t(k)=T(k+1)−t(k)。
第一步 t(k)t(k+1)=k2(k+1)2,p(k)=k2,q(k)=r(k)=1。
第二步 deg(Q)=deg(R)−1=−1,d=2−(−1)=3,忽略 d2=0。
第三步 设 s(k)=s3k3+s2k2+s1k+s0 解方程
k2=s(k+1)−s(k)=3s3k2+(2s2+3s3)k+s1+s2+s3
比对系数得 s(k)=31k3−21k2+61k+s0。
第四步(实际上可以直接看出来了)
T(k)=k2(31k3−21k2+61k+s0)k2=31k3−21k2+61k+s0
当然,如果可以直接注意到 T(k) 是三次的,然后直接待定系数,会更简单。这也说明了 Gosper 算法的特点:流程固定,适合机械操作。
第一步 t(k)t(k+1)=kk+1α,p(k)=k,q(k)=α,r(k)=1。
第二步 α=1 时,deg(Q)=0,deg(R)−1=−1,d=1−0=1。
第三步 设 s(k)=s1k+s0,解方程
k=α(s1(k+1)+s0)−(s1k+s0)
得 s(k)=α−11k−(α−1)2α。
第四步 T(k)=k(α−11k−(α−1)2α)kαk=(α−11k−(α−1)2α)αk。
第一步 t(k)t(k+1)=k2(k+1)2α,p(k)=k2,q(k)=α,r(k)=1。
第二步 α=1 时,deg(Q)=0,deg(R)−1=−1,d=2−0=2。
第三步 设 s(k)=s2k2+s1k+s0,解方程
k2=α(s2(k+1)2+s1(k+1)+s0)−(s2k2+s1k+s0)
解得 s(k)=a−11k2−(a−1)22ak+(a−1)3a(a+1).
第四步 T(k)=(a−11k2−(a−1)22ak+(a−1)3a(a+1))αk
第一步 t(k)t(k+1)=−(k+1)!(n−k−1)!k!(n−k)!=k+1k−n,
p(k)=1,q(k)=k−n,r(k)=k。由于 −n−1<0,不存在冲突。
第二步 Q(k)=−n,R(k)=2k−n⟹d1=0−0=0,d2=−22−n=n。
第三步 先试 d1=0,设 s(k)=s0,解方程
1=(k−n)s0−ks0
解得 s(k)=−n1。
第四步 T(k)=k(−n1)(−1)kCnk,
还可以化简: T(k)=n k! (n−k)!(−1)k+1k n!=(k−1)!(n−k)!(−1)k+1(n−1)!=(−1)k+1Cn−1k−1
第一步 t(k)t(k+1)=k(k+2)(k+1)(k−1),p(k)=k,q(k)=k−1,r(k)=k+1。
第二步 Q(k)=−2,R(k)=2k,d1=1,d2=2。
第三步 先试 d1=1,设 s(k)=s1k+s0,解方程
k=(k−1)(s1(k+1)+s0)−(k+1)(s1k+s0)
得 s(k)=−k+21。
第四步 T(k)=k(k+1)(1/2−k)(1/(k2−1))=2k(k−1)1−2k。
这是比直接裂项更简洁的形式。
第一步 p(k)=1,q(k)=k2−3k+3,r(k)=(k−1)2=k2−2k+1,注意 q(k) 无实根。
第二步 Q(k)=−k+2,R(k)=2n2−5k+4。d1=−1,d2=−2×2−1=1。
第三步 d1<0 不行,试 d2=1,设 s(k)=s1k+s0,解方程
1=(k2−3k+3)(s1(k+1)+s0)−(k−1)2(s1k+s0)
解得 s(k)=k−1。
第四步 T(k)=1(k−1)2(k−1)t(k)=(k−1)3t(k)。