因为组合和错位相减技巧的存在,我们的生成函数总是会面对分母是多项式的生成函数。
一般的组合数学教程不会讲解代数技巧,但对于如我一样数学基础不太好的程序员,求得生成函数之后如何进行化简则是非常关键的。
那么,这一节,我们就来讨论一下如何处理此类分母为多项式的生成函数。
分母带有单根的部分分式分解
我们首先来考虑部分分式问题,我们首先把分母多项式做因式分解,得到如下形式:
G(x)=c(x)(x−x1)(x−x2)...(x−xn)G(x)=\frac{c(x)}{(x-x_1)(x-x_2)...(x-x_n)}G(x)=(x−x1)(x−x2)...(x−xn)c(x)
作为热身,我们先来考虑x1,x2,...,xnx_1,x_2,...,x_nx1,x2,...,xn不相等的情况。我们假设部分分式分解后:
c(x)(x−x1)(x−x2)...(x−xn)=a1(x−x1)+a2(x−x2)+......+an(x−xn)\frac{c(x)}{(x-x_1)(x-x_2)...(x-x_n)} = \frac{a_1}{(x-x_1)} + \frac{a_2}{(x-x_2)} + ...... + \frac{a_n}{(x-x_n)}(x−x1)(x−x2)...(x−xn)c(x)=(x−x1)a1+(x−x2)a2+......+(x−xn)an
这里a1,a2,...,ana_1,a_2,...,a_na1,a2,...,an必定都是常数。
假设要求aka_kak,我们把等式两边分别乘以(x−xk)(x-x_k)(x−xk),可以得到:
c(x)(x−x1)(x−x2)...(x−xk−1)(x−xk+1)...(x−xn)=a1(x−xk)(x−x1)+a2(x−xk)(x−x2)+...+ak+...+an(x−xk)(x−xn)\frac{c(x)}{(x-x_1)(x-x_2)...(x-x_{k-1})(x-x_{k+1})...(x-x_n)} = \frac{a_1(x-x_k)}{(x-x_1)} + \frac{a_2(x-x_k)}{(x-x_2)} + ... + a_k +... + \frac{a_n(x-x_k)}{(x-x_n)}(x−x1)(x−x2)...(x−xk−1)(x−xk+1)...(x−xn)c(x)=(x−x1)a1(x−xk)+(x−x2)a2(x−xk)+...+ak+...+(x−xn)an(x−xk)
因为此式两边恒等,所以我们取x=xkx=x_kx=xk,得到无重根的部分分式分解公式:
ak=c(xk)(xk−x1)(xk−x2)...(xk−xk−1)(xk−xk+1)...(xk−xn)a_k = \frac{c(x_k)}{(x_k-x_1)(x_k-x_2)...(x_k-x_{k-1})(x_k-x_{k+1})...(x_k-x_n)}ak=(xk−x1)(xk−x2)...(xk−xk−1)(xk−xk+1)...(xk−xn)c(xk)
例题:一般的多项乘积分母
1(x−1)(x−2)(x−3)=a1x−1+a2x−2+a3x−3\frac{1}{(x-1)(x-2)(x-3)} = \frac{a_1}{x - 1} + \frac{a_2}{x - 2} + \frac{a_3}{x - 3} \\(x−1)(x−2)(x−3)1=x−1a1+x−2a2+x−3a3
求 a1,a2,a3a_1,a_2,a_3a1,a2,a3。
根据无重根的部分分式分解公式:
a1=1(1−2)(1−3)=12a2=1(2−1)(2−3)=−1a3=1(3−1)(3−2)=12a_1 = \frac{1}{(1 - 2)(1 - 3)} = \frac12\\
a_2 = \frac{1}{(2 - 1)(2 - 3)} = -1 \\
a_3 = \frac{1}{(3 - 1)(3 - 2)} = \frac12a1=(1−2)(1−3)1=21a2=(2−1)(2−3)1=−1a3=(3−1)(3−2)1=21
可用wolfram alpha验证答案正确:www.wolframalpha.com/input?i=%5C…
例题:斐波那契数列
接下来我们不如来试试看用这个公式来求解斐波那契数列的通项公式。
首先,解斐波那契数列的生成函数,前文已经讲过:
G(x)=11−x−x2G(x) = \frac{1}{1-x-x^2}\\G(x)=1−x−x21
我们首先把分母多项式用一元二次方程求根:
G(x)=−1(x−1−52)(x−1+52)G(x)=-\frac{1}{(x - \frac{1-\sqrt5}{2})(x - \frac{1+\sqrt5}{2})}\\G(x)=−(x−21−5)(x−21+5)1
接下来我们使用部分分式分解公式,可以得到:
G(x)=−1+52−1−52(x−1−52)−1−52−1+52(x−1+52)G(x)=-\frac{\frac{1+\sqrt5}{2} - \frac{1-\sqrt5}{2}}{(x - \frac{1-\sqrt5}{2})} - \frac{\frac{1-\sqrt5}{2} - \frac{1+\sqrt5}{2}}{(x - \frac{1+\sqrt5}{2})} \\G(x)=−(x−21−5)21+5−21−5−(x−21+5)21−5−21+5
整理后得到:
G(x)=−5(x−1−52)+5(x−1+52)G(x)= - \frac{\sqrt5}{(x - \frac{1-\sqrt5}{2})} + \frac{\sqrt5}{(x - \frac{1+\sqrt5}{2})} \\G(x)=−(x−21−5)5+(x−21+5)5
此时我们可以注意到,可以把G(x)分解成两部分 \
G1(x)=−5(x−1−52)G2(x)=5(x−1+52)G_1(x)= - \frac{\sqrt5}{(x - \frac{1-\sqrt5}{2})} \\
G_2(x)= \frac{\sqrt5}{(x - \frac{1+\sqrt5}{2})} \\
G1(x)=−(x−21−5)5G2(x)=(x−21+5)5
所以我们斐波那契数列的通项公式为:
G(x)=G1(x)+G2(x)G(x) = G_1(x) + G_2(x)G(x)=G1(x)+G2(x)
从上一篇文章可知,G1(x)G_1(x)G1(x) 和 G2(x)G_2(x)G2(x) 是等比数列的生成函数,其通项公式分别是
−15(1−52)n和15(1+52)n-\frac{1}{\sqrt5}{(\frac{1-\sqrt5}{2})}^n 和 \frac{1}{\sqrt5}{(\frac{1+\sqrt5}{2})}^n−51(21−5)n和51(21+5)n
所以,最终G(x)G(x)G(x)通项公式为:
−15(1−52)n+15(1+52)n-\frac{1}{\sqrt5}{(\frac{1-\sqrt5}{2})}^n + \frac{1}{\sqrt5}{(\frac{1+\sqrt5}{2})}^n−51(21−5)n+51(21+5)n
结语
通过前面的推导,我们获得了一个处理分母为多项式的生成函数形式的通用思路,但是如果分母多项式含有重根,有复根,甚至根本难以因式分解,是否有办法处理呢?
这些情况我们留待下一小节讨论。