# 母函数与线性常系数齐次递推关系
Tags:组合数学
---
母函数
-----------------------------
对于序列$ C_0, C_1, C_2, ... $构造一个函数$ G(x) $为序列$ C_0, C_1, C_2, ... $的母函数。
$$ G(x) = C_0 + C_1x + C_2x^2 + ... $$
雅各布·伯努利(Jakob Bernoulli,1654-1705),伯努利家族代表人物之一,瑞士数学家。
m个骰子掷出n点,有多少种可能?
只掷出1个骰子可以得到6种可能:1、2、3、4、5、6,
可以表示为:$x^1、x^2、x^3、x^4、x^5、x^6$,
投掷过程可以用多项式表示:$ x^1+x^2+x^3+x^4+x^5+x^6 $
同样,掷出第2颗骰子可以表示为上边的式子,连续掷出2个骰子的过程可以用多项式的乘法表示:
$$ (x^1+x^2+x^3+x^4+x^5+x^6)\times(x^1+x^2+x^3+x^4+x^5+x^6) $$
那么得到6点的次数可以使用$x^6$前面的系数来表示,m个骰子掷出n点可以使用$(x^1+x^2+x^3+x^4+x^5+x^6)^n$中的$x^n$前面的系数来表示。
皮埃尔-西蒙·拉普拉斯侯爵(Pierre-Simon marquis de Laplace,1749年3月23日-1827年3月5日),法国著名的天文学家和数学家,天体力学的集大成者。
母函数是一种计数工具,用x上的指数表示可能出现的点数,对应的系数表示每种点数对应的权重。母函数就是一列用来展示一串数字序列的挂衣架。
每种可能乘以权重后用加法连起来表示一个过程,分步的第二个过程当然是用乘法来表示,两种可能相乘后对应的指数相加正好对应了两次投掷之后的点数之和,所以使用了这个对应关系来简化问题。
砝码称重
-----------------------------
四个1g,2g,3g,4g的砝码,一共能称出多少种重量?
1g砝码可以不使用它$ x^0$,也可以使用它$ x^1$,这一选择的过程对应的母函数就是$x^0+x^1$,选择这四个砝码的母函数就是:
$$ (1+x)(1+x^2)(1+x^3)(1+x^4) $$
对应展开式前面的系数就是可以选择砝码的方案数。
Hanoi挪动次数
------------------------------
三根柱子为A,B,C,其中A上有n个盘子,要求借助B移动到C,
过程中大盘子不能压在小盘子之上,一共需要挪动多少次盘子?
设移动需要$ h(n)$次,移动过程如下:
$$ (n, 0, 0) -> (1, n-1, 0) -> (0, n-1, 1) -> (0, 0, n)$$
- 把A的n-1个盘子移动到B,移动数为h(n-1);
- 把A的1个盘子移动到C,移动数为1;
- 把B的n-1个盘子移动到C,移动数为h(n-1);
所以,递推关系可以表示为:
$$ h(n) = 2h(n-1) + 1, h(0) = 0 $$
如果在移动前不知道n的个数,移动盘子对应的母函数:
$$ H(x) = h(1)x + h(2)x^2 + h(3)x^3 + ... $$
也就是:
\begin{align}
H(x) &= h(1)x + h(2)x^2 + h(3)x^3 + ... \\
(-2x)H(x) &= \qquad\ \ - 2h(1)x^2 - 2h(2)x^3 -2h(3)x^4 + ... \\
(1-2x)H(x) &= h(1)x + [h(2)- 2h(1)]x^2 + \\
& \qquad\ \ \ \ \ \ + [h(3)- 2h(2)]x^3 + ... \\
&= x + x^2 + x^3 + ...\\
&= x/(1-x)\\
H(x) &= \frac{x}{(1-x)(1-2x)}\\
\end{align}
上面的$ x + x^2 + x^3 + ... = x/(1-x)$,使用到了泰勒展开,因为$x$是可以取任意值的,所以这里取$x$为无穷小。
\begin{align}
H(x) &= \frac1{(1-2x)} - \frac1{(1-x)} \\
H(x) &= (1 + 2x + 2^2x^2 + 2^3x^3 + ...) \\
&\quad - (1 + x + x^2 + x^3 + ... )\\
&= (2-1)x + (2^2-1)x^2 + ... + (2^k-1)x^k + ...\\
\end{align}
其中$(2^k-1)$就是汉诺塔的移动次数。
Fibonacci兔子
-----------------------------
一对兔子,第一个月出生,第二个月结婚,第三个月生小兔子,当第n个月会有多少对兔子?
这里兔子在出生2个月后就有了生育能力且每个月可以生出1对,第n个月的兔子数是第n-1个月的兔子数和第n-2个月的兔子生育的兔子数之和。
$$F(n) = F(n-1) + F(n-2),F(0)=0,F(1)=1$$
比萨的列奥纳多,又称斐波那契(Leonardo Pisano ,Fibonacci, Leonardo Bigollo,1175年-1250年),意大利数学家,是西方第一个研究斐波那契数的人,并将现代书写数和乘数的位值表示法系统引入欧洲。
可以使用拼接正方形的方式证明下面的等式:
\begin{align}
F_1^2 &= F_2F_1 \\
F_2^2 &= F_2(F_3-F_1) = F_2F_3-F_2F_1 \\
&...\\
F_n^2 &= F_n(F_{n+1}-F_{n-1}) = F_nF_{n+1}-F_nF_{n-1}\\
F_1^2 + F_2^2 + ... + F_n^2 &= F_nF_{n+1} \\
\end{align}
Fibonacci通项公式
-------------------------------
在随机的第n个月观察兔子时,观察到的兔子个数权重为$F_n$,这一观察行为可以使用母函数表示:
$$ G(x) = F_1x + F_2x^2 + ... + F_nx^n $$
计算母函数:
\begin{align}
x^3 乘以 F_3 &= F_2 + F_1 \\
x^4 乘以 F_4 &= F_3 + F_2 \\
&...\\
x^n 乘以 F_n &= F_{n-1} + F_{n-2} \\
x^nF_n &= xx^{n-1}F_{n-1} + x^2x^{n-2}F_{n-2} \\
G(x)-x^2-x &= x(G(x)-x) + x^2G(x)\\
G(x) &= \frac{x}{1-x-x^2}\\
\end{align}
可以使用泰勒展开求出数列的通项
\begin{align}
G(x) &= \frac{x}{(1-\frac{1+\sqrt{5}}{2}x)
(1-\frac{1-\sqrt{5}}{2}x)}\\
&= \frac{1}{\sqrt{5}}[
\frac{1}{(1-\frac{1+\sqrt{5}}{2}x)} -
\frac{1}{(1-\frac{1-\sqrt{5}}{2}x)}
]\\
设:\alpha &= \frac{1+\sqrt{5}}{2},
\beta = \frac{1-\sqrt{5}}{2}\\
G(x) &= \frac{1}{\sqrt{5}}[
(\alpha-\beta)x + (\alpha^2-\beta^2)x^2 + ...
]\\
\end{align}
所以,fibonacci数列的通项为:
\begin{align}
F_n &= \frac{1}{\sqrt{5}}[\alpha^n - \beta^n] \\
&= \frac{1}{\sqrt{5}}[
{(\frac{1+\sqrt{5}}{2}})^n - {(\frac{1-\sqrt{5}}{2}})^n
]
\end{align}
线性常系数齐次递推关系
---------------------------
\begin{align}
hanoi &:F_n - F_{n-1} - F_{n-2} = 0\\
fibonacci &:h(n) - 3h(n-1) - 2h(n-2) = 0\\
\end{align}
如果序列{$ a_n$}满足:
$$
c_0a_n + c_1a_{n-1} + ... + c_ka_{n-k}=0 \\
a_0=d_0,a_1=d_1,...,a_{k-1}=d_{k-1} \\
c_0,c_1,...c_k及d_0,d_1,...d_k是常数,c_k \neq 0
$$
泰勒展开式:$ (1-ax)^{-1} = 1 + ax + a^2x^2 + ... $
fibonacci中的一个因式分解片段:$ (1-\frac{1+\sqrt{5}}{2}x)(1-\frac{1-\sqrt{5}}{2}x)
= 1-x-x^2$
需要把递推公式对应母函数的多项式分解为$(1-ax)$之积
$$ (x^{-1} - a) = (1 - ax)/x $$
重新通过母函数计算fibonacci的通项
\begin{align}
G(x) &= \frac{x}{1-x-x^2}\\
G(x)/x &= x^2[(x^{-1})^2 - x^{-1} - 1]\\
&= x^2[m^2 - m - 1], m = x^{-1} \\
m^2 - m - 1 &= (m-\alpha)(m-\beta) \\
G(x)/x &= x^2[(x^{-1} - \alpha)(x^{-1} - \beta)] \\
&= [(1 - \alpha x)(1 - \beta x)] \\
\end{align}
求根方程和递推关系的系数是相同的,
求根方程的次数与递推方程的阶数一一对应:
\begin{align}
m^2 - m - 1 &= 0 \\
F_n - F_{n-1} - F_{n-2} &= 0
\end{align}
特征多项式
----------------------------
线性常系数递推关系$ a_n + C_1a_{n-1} + ... + C_ka_{n-k}=0 $,对应的母函数:
$$ G(x) = a_0 + a_1x + ... + a_nx^n + ... $$
计算母函数
\begin{align}
x^k(a_k + C_1a_{k-1} + ... + C_ka_0) &= 0 \\
x^{k+1}(a_{k+1} + C_1a_k + ... + C_ka_1) &= 0 \\
&... \\
x^n(a_n + C_1a_{n-1} + ... + C_ka_{n-k}) &= 0 \\
[G(x) - \sum_{i=0}^{k-1}a_ix^i] +
C_1x[G(x) - \sum_{i=0}^{k-2}a_ix^i] +...+
C_kx^k[G(x)] &= 0\\
(1 + C_1x + C_2x^2 + ... + C_kx^k)G(x)
= \sum_{j=0}^{k-1}C_jx^j{\sum_{i=0}^{k-1-j}a_ix^i} &\\
\end{align}
得到泰勒展开的累加式
\begin{align}
P(x) &= \sum_{j=0}^{k-1}C_jx^j{\sum_{i=0}^{k-1-j}a_ix^i} \\
G(x) &= \frac{P(x)}{(1 + C_1x + C_2x^2 + ... + C_kx^k)} \\
C(m) &= m^k + C_1m^{k-1} + ... + C_{k-1}m + C_k \\
&= (m-a_1)^k_1(m-a_2)^k_2...(m-a_i)^k_i \\
&\qquad\ k_1 + k_2 + ... + k_i = k \\
G(x) &= \frac{P(x)}{(1-a_1x)^{k_1}(1-a_2x)^{k_2}...(1-a_ix)^{k_i}}
\end{align}
递推关系和求根式子中常系数和下标次数的对应关系
\begin{align}
a_n + C_1a_{n-1} + ... + C_ka_{n-k} &= 0\\
m^k + C_1m^{k-1} + ... + C_{k-1}m + C_k &= C(m)
\end{align}
递推关系的特征多项式可以写为:
$$ C(k) = x^k + c_1x^{k-1} + ... + c_{k-1}x + c_k $$
假设特征多项式没有重根,解出对应的根后,
设待定系数$l_1,l_2,...,l_k$,母函数可以表示为
\begin{align}
G(k) &= \frac{l_1}{1-a_1x} + \frac{l_2}{1-a_2x} + ...
+ \frac{l_k}{1-a_kx} \\
&= \sum_{i=1}^{k}\frac{l_i}{1-a_ix} \\
a_n &= \sum_{i=1}^{k}l_ia_i^n
\end{align}
上式中的$a_n$就是通项公式,可以通过递推关系的初始值获得待定系数。
通过特征多项式计算通项公式
------------------------------
fibonacci数列的特征多项式:
$$ C(x) = x^2-x-1 = (x-\alpha)(x-\beta) \\
\alpha = \frac{1+\sqrt{5}}{2},\beta = \frac{1-\sqrt{5}}{2}$$
通项公式为:
$$
F_n = A\alpha^n + B\beta^n \\
\begin{cases}
A+B = 0 \\
\frac{\sqrt5}{2}(A-B) = 0
\end{cases}
$$
特征多项式有重根
-------------------------------------
当特征多项式有重根时:
\begin{align}
a_n - 4a_{n-1} + 4a_{n-2} &= 0,\ a_0=1,\ a_1 = 4 \\
x^2 - 4x + 4 &= (x - 2)^2 \\
A(x) &= \frac{A}{(1-2x)} + \frac{B}{(1-2x)^2} \\
a_n &= A\times2^n + B\times(n+1)2^n \\
&= (A' + Bn)2^n \\
&= (n+1)2^n \\
\end{align}
特征多项式$C(x)$有重根时,设$\beta$是$C(x)$的k重根
\begin{align}
G(x) &= \sum_{j=1}^{k}\frac{A_j}{(1-\beta x)^j} \\
二项式定理&:
(1+x)^a = \sum_{n=0}^{\infty}\frac{a(a-1)...(a-n+1)}{n!}x^n \\
a_n &= \sum_{j=0}^{k}A_j
\bigl(\begin{matrix} j+n-1 \\ n \end{matrix}\bigr)
\beta^n \\
&= \sum_{j=0}^{k}A_j
\bigl(\begin{matrix} j+n-1 \\ j-1 \end{matrix}\bigr)
\beta^n
\end{align}
上面的组合数就是n的j-1次多项式,$a_n$是$\beta$与n的k-1次多项式乘积,递推关系对应的通项就可以表示为
$$ (A_0 + A_1n + ... + A_{k-1}n^{k-1})\beta^n \\
其中,A_0, A_1, ..., A_{k-1}是k个待定系数 $$
重新计算上面$ a_n - 4a_{n-1} - 4a_{n-2} = 0$的通项公式
$$ a_n = (A_1 + A_2n)2^n = (1+n)2^n $$
特征多项式有共轭复根
---------------------------------------
当特征多项式有复根时:
\begin{align}
a_n - a_{n-1} + a_{n-2} &= 0,\ a_1=1,\ a_2 = 0 \\
x^2 - x + 1 &= 0 \\
x &= \frac{1 \pm \sqrt{-3}}{2} = e^{\pm \frac{\pi}{3}i}\\
&= cos\frac{n\pi}{3} \pm isin\frac{n\pi}{3}\\
a_n &= A_1cos\frac{n\pi}{3} + A_2sin\frac{n\pi}{3}\\
&= cos\frac{n\pi}{3} + \frac{\sqrt3}{3}sin\frac{n\pi}{3}\\
\end{align}
上面讨论的三种特征方程根的情况包含了所有线性常系数递推关系的求解情况。
计算平方和
--------------------
平方和$ S_n = 1 + 2^2 + 3^2 + ... + n^2 $,有递推关系
$$ Sn - 4S_{n-1} + 6S_{n-2} - 4S_{n-3} + S_{n-4} = 0 \\
S_0 = 0, S_1 = 1, S_2 = 5, S_3 = 14$$
特征方程
\begin{align}
& r_4 - 4r_3 + 6r_2 - 4r + 1 = (r-1)^4 = 0 \\
S_n &= (A + Bn + Cn^2 + Dn^3)(1)^n\\
&\begin{cases}
A = 0 \\
B + C + D = 1 \\
2B + 4C + 8D = 5 \\
3B + 9C + 27D = 14 \\
\end{cases} \\
S_n &= n/6 + n^2/2 + n^3/3 \\
\end{align}
Summary
------------------------------------
当观察一次一个数列的值时,这一观察行为可以用母函数来表示,通过x的不同次幂把可能观察到的各种值存放起来。这个多项式就表示这一次观察过程,其中的常系数就表示观察到的数列的值,对应的幂次表示观察到的数列下标。
通过初始值和递推关系可以知道唯一确定的数列,如果是线性常系数齐次递推关系,可以用上文中提到的代数技巧计算出母函数,因为x可以取任意值,所以可以使用当x为无穷小的时候的泰勒展开,对应的x的n次方前面的系数就是数列的通项。
上面的代数技巧的过程就是特征多项式与母函数的乘积等于比这个特征多项式更低幂次的多项式,所以在计算中,递推关系蕴含的信息已经转化到了特征多项式中。因为特征多项式一定可以转化为根的形式,由于泰勒级数的展开式是对应的是权重,所以需要求解x的负一次方的根,它对应的就是每个因式中x前面的系数。对应的通项就是常系数与根的n次方的乘积,通过数列的初始值可以计算出这个常系数。
最后,再对一个数列进行观察,它的下标是n,用x的n次方表示这一次观察的结果。因为只是观察一次,所以前面的权重可以填写任意的数值,把观察到的数列的值作为权重填写进去,因为需要求数列的通项。最后把母函数做泰勒展开获得了x的n次方前面的常系数,既是数列的通项。
Reference
---------------------------
[TsinghuaX: 60240013X 组合数学(2015春)]
[MathJax basic tutorial and quick reference]
-----------------------------
http://www.cnblogs.com/kodoyang/p/GeneratingFunction_HomogeneousLinearRecurrenceRelation.html
kodoyang
2015年5月31日