Gosper裂项

· · 算法·理论

我们在学习中时常会遇见一系列的求和问题,比如

\sum^n_{k=1}\frac{1}{k(k+1)}

这个求和很简单,不难发现 \frac{1}{k(k+1)}=\frac{1}{k}-\frac{1}{k+1},这样就能直接把中间的项给消掉,只需计算开头和结尾的前后两项即可。

这给我们一个启发,我们似乎可以将某些函数 t(k) 写成另一个函数 T(k) 的相邻两项之差 t(k)=T(k+1)-T(k) 的形式,这样我们便可以消去中间的项,只计算两边的项

\sum^b_{k=a}t(k)=\sum^b_{k=a}\Big(T(k+1)-T(k)\Big)=T(b+1)-T(a)

有时候求和的式子很复杂,如

\sum_{k\geq0}\frac{4k+3}{(n-2k-2)!(n+2k+1)!}

那如何计算 T(k) 的表达式呢?这就得用到 Gosper 算法了,它是解决组合数求和的利器,在此声明,下文中的例子都用上式。 这种算法只针对超几何函数求和,纯机械化,只要想算一定会有有一个结果。

Gosper 的推导

首先,我们不难发现

\frac{T(k)}{t(k)}=\frac{T(k)}{T(k+1)-T(k)}=\frac1{\frac{T(k+1)}{T(k)}-1}

是一个有理函数,设其为有理函数 y(k),将 T(k)=y(k)t(k) 代入上一话的式子中,则

T(k+1)-T(k)=y(k+1)t(k+1)-y(k)t(k)=t(k)

z(k)=\frac{t(k+1)}{t(k)},就有

y(k+1)z(k)-y(k)=1

假设我们能将 z(k) 写成这样的形式

z(k)=\frac{p(k+1)q(k)}{p(k)r(k+1)}

其中 q(k)r(k) 满足,对于所有 h\in\N,有

q(k)\perp r(k+h))

注意,这里的 q(k)\perp r(k+h)) 等价于 \deg\gcd(q(k),r(k+h))=0,其中 \deg 表示多项式的最高次数。

在后续的证明中,我们会发现解有理函数的问题被转换为了求解多项式的问题。

我们考虑将 y(k) 写成下面的形式

y(k)=\frac{r(k)s(k)}{p(k)}

将它与 z(k)=\frac{p(k+1)q(k)}{p(k)r(k+1)} 代入 y(k+1)z(k)-y(k)=1,可得

q(k)s(k+1)-r(k)s(k)=p(k)

现在我们如果解出了 s(k),便能反代出 T(k)=\frac{r(k)s(k)}{p(k)}t(k)

这样我们就确定了 Gosper 的算法流程:

  1. z(k)=\frac{t(k+1)}{t(k)},分解成满足条件的 \frac{p(k+1)q(k)}{p(k)r(k+1)} 的形式。
  2. 找到方程的解 s(k),或者得知无解,终止运算。
  3. 若有解,则 T(k)=\frac{r(k)s(k)}{p(k)}t(k)

好了,思路有了,但在前两个过程中仍有很多困难:

  1. 这个对 z(k) 的有条件的分解一看就很逆天,有时系数瞪不出来你不就炸了吗?
  2. 在自变量不同的时候解有理函数 s(k) 还是太吃操作了,有没有简单点的方法推荐一下呢?

为了使它成为傻瓜式算法,我们还要提供一种机械化的计算方法。

机械化分解

首先设 z(k)=\frac{C_ff(k)}{C_gg(k)},为了方便,这里的 f(k)g(k) 都是首一多项式,且满足 f(k)\perp g(k),前面的 C_fC_g 都是保证左右相等的系数。

如果 q(k)=f(k),r(k)=g(k-1) 满足上面的条件,那么我们可以直接令 q(k)=f(k),r(k)=g(k-1),p(k)=1,这样就结束了。

但是,如果不满足条件,即存在 h\in\N 使得 f(k)g(k+h) 有公因式 x(k),那我们可以令最开始 q(k)=f(k),r(k+1)=g(k),p(k)=1, 递归的找出 q(k)r(k+h+1)x(k),然后

q(k)\leftarrow \frac{q(k)}{x(k)}\\ r(k+1)\leftarrow \frac{r(k+1)}{x(k-h)}\\ \frac{p(k+1)}{p(k)}\leftarrow \frac{p(k+1)}{p(k)}\frac{x(k)}{x(k-h)}

这里为了直接修改 p(k),可以先将 \frac{x(k)}{x(k-h)} 这样展开

\frac{x(k)}{x(k-h)}=\prod^h_{i=1}\frac{x(k-i+1)}{x(k-i)}

这样,我们就可以这样修改 p(k)

p(k)\leftarrow p(k)\prod^h_{i=1}x(k-i)

如此往复,便能得到结果。

判断两个多项式是否满足条件,可以将其因式分解,判断是否有 a,b 满足 (k+a)|q(k),(k+b)|r(k+1),且 a-b 不为正整数。

解方程

实际上,s(k) 会是一个多项式,在这里用反证法给出简单证明。

为了方便阅读,在这里写出方程

q(k)s(k+1)-r(k)s(k)=p(k)

假设命题为假,那么我们就能将 s(k) 写成 \frac{f(k)}{g(k)},其中 f(k)\perp g(k)\deg g(k)\ne0

将其代入方程,则

q(k)f(k+1)g(k)-r(k)f(k)g(k+1)=p(k)g(k)g(k+1)

N 是使 \gcd(g(k),g(k+N)) 为非常多项式的最大整数,容易知道 N\geq0

x(k)g(k)g(k+N) 的一个非常数多项式的不可约公因式,将 x(k-N)|g(n) 代入方程,因为它整除 q(k)f(k+1)g(k)p(k)g(k)g(k+1),得

x(k-N)|r(k)f(k)g(k+1)

因为 x(k-N)|g(k),且 f(k)\perp g(k),故 x(k-N)\nmid f(k)

x(k-N)|g(k+1),则 x(k)|g(k+N+1),即 \gcd(g(k),g(k+N+1)) 为非常多项式,与 N 的选取要求矛盾,所以 x(k-N)\nmid g(k+1)

因此,x(k-N)|r(k),即 x(k+1)|r(k+N+1)

同样,将 x(k+1)|g(k+1) 代入方程,因为它整除 r(k)f(k)g(k+1)p(k)g(k)g(k+1),得

x(k+1)|q(k)f(k+1)g(k)

由于 x(k+1)|g(k+1)f(k+1)\perp g(k+1),则 x(k+1)\nmid f(k+1)

x(k+1)|g(k),则 x(k)|g(k-1),又因为 x(k)|g(k+N),所以 \gcd(g(k-1),g(k+N)) 为非常多项式,即 \gcd(g(k),g(k+N+1)) 为非常多项式,与 N 的选取要求矛盾,所以 x(k-1)\nmid g(k)

因此,x(k+1)|q(k)

于是,x(k+1)q(k)r(k+N+1) 的一个非常多项式的公因式,与前面的对选取 q(k)r(k) 的要求不符,因此 s(k) 得是一个多项式。

这里同样可以解释,我们在选取 q(k)r(k) 时之所以要有那个要求,就是为了使得现在得 s(k) 必须是多项式。

如果 s(k) 是多项式,这无疑为 s(k) 求解降低了很多难度。

s(k) 的表达式,可以用待定系数法,而使用待定系数法首先要确定它的次数。

d=\deg s(k),现在来求 d 的值,我们可以将方程改写为

2p(k)=(q(k)-r(k))(s(k+1)+s(k))+(q(k)+r(k))(s(k+1)-s(k))

Q(k)=q(k)-r(k),R(k)=q(k)+r(k)

容易发现,如果 \deg Q(k)\geq\deg R(k),有 d=\deg p(k)-\deg Q(k),否则 \deg q(k)=\deg r(k)=d'[k^{d'}]q(k)=[k^{d'}]r(k),所以它们的最高次项抵消了,因此上面变形后的方程的右边的实际最高次数为 d+d'-1,得 d=\deg p(k)-d'+1

如果 d<0,就说明方程无解,Gosper 算法不适用,否则解方程就行了。

接下来的待定系数,大家都会,这里就跳过了。

使用示例

用的是最开始的的那个长例子

\sum_{k\geq0}\frac{4k+3}{(n-2k-2)!(n+2k+1)!}

t(k)=\frac{4k+3}{(n-2k-2)!(n+2k+1)!},直接作比

\frac{t(k+1)}{t(k)}=\frac{(4k+7)(2k-n+2)(2k-n+3)}{(4k+3)(2k+n+2)(2k+n+3)}

直接分解

p(k)=4k+3\\ q(k)=(2k-n+2)(2k-n+3)\\ r(k+1)=(2k+n+2)(2k+n+3)\implies r(k)=(2k+n)(2k+n+1)

注意,我们不将 n 这样的系数视为整数。

现在计算辅助多项式,有时一眼能瞪出它们的次数,就不必展开计算了

Q(k)=q(k)-r(k)=(8-8n)k-6n+6\implies\deg Q(k)=1\\ R(k)=q(k)+r(k)=8k^2+12k+2n^2-4n+6\implies\deg R(k)=2\\

所以 d=\deg p(k)-\deg R(k)+1=0

s(k)=s_0,则

(2k-n+2)(2k-n+3)s_0-(2k+n+2)(2k+n+3)s_0=4k+3

解得 s(k)=s_0=\frac1{2(1-n)},所以 T(k)=\frac{r(k)s(k)}{p(k)}t(k)=-\frac1{(2n-2)}\binom{2n-3}{n+2k+1}

由于 \lim\limits_{k\to\infin}T(k)=0,所以

\sum_{k\geq0}\frac{4k+3}{(n-2k-2)!(n+2k+1)!}=\frac1{(2n-2)}\binom{2n-3}{n+1}

小结

氵了 4.8k 字,简单介绍了 Gosper 算法,它能帮助我系统地计算超几何项的不定求和。但遗憾的是,如果题目不刻意安排,那绝大多数情况下求和最后的结果并不是一个封闭形式,所以在 OI 中应用不广泛,不过应对一些求和题还是很轻松的。

出几道形式复杂一点的题,求下列求和,由于过程十分雷同,就不展示了。

\begin{split} &(a)\sum^n_{k=0}\frac{\binom{2k}{k}^2}{16^k(k+1)}\\ &(b)\sum^n_{k=0}\frac{(4k-1)\binom{2k}{k}^2}{16^k(2k-1)^2}\\ &(c)\sum^n_{k=1}\prod^{m-1}_{i=0}(k+i) \end{split}

:::info[答案]

\begin{split} &(a)\frac{4(n+1)\binom{2n+2}{n+1}^2}{16^{n+1}}\\ &(b)-\frac{\binom{2n}{n}^2}{16^n}\\ &(c)\frac1{m+1}\prod^m_{j=0}(n+j) \end{split}

:::