什么是生成函數:
對於序列$a_i$,定義它的生成函數為:
$$G(x) = \sum_{i=0}^{+\infty} a_ix^i$$
一個生成函數與一個序列是唯一對應的。
我們可以利用生成函數的性質解決一些組合問題。
一些重要的式子:
先寫幾個常用的生成函數(下式中$x∈(0,1)$):
- $$\frac{1-x^n}{1-x} = \sum_{i=0}^{n-1} x^i$$
- $$\frac{1}{1-x} = \sum_{i=0}^{+\infty} x^i$$
- $$\frac{1}{1-x^k} = \sum_{i=0}^{+\infty} x^{ki}$$
- $$\frac{1}{(1-x)^k} = \sum_{i=0}^{+\infty} C_{i+k-1}^{k-1} x^i$$
- $$\frac{\phi x^k}{1 - \lambda x} = \sum_{i=0}^{+\infty} \phi * \lambda^{i-k} x^i$$
現在我們來證明上面的式子:
- 由等比數列求和公式可知成立
- 考慮$1$式中的$x$趨近於無窮時,此時$x^n$趨近於$0$,這樣就證明了$2$式
- 同上,將$2$式右邊的$x^i$換成$(x^k)^i$即可
- $\frac{1}{(1-x)^k}$相當於是$k$個$\frac{1}{1-x}$乘起來,其中第$i$項的系數就是從$k$個$\sum_{i=0}^{+\infty} x^i$中各選一項,乘起來恰好為$x_i$的方案數。相當於是$k$個盒子放$i$個球,允許空盒的方案數。利用插板法可以得知答案為$C_{i+k-1}^{k-1}$
- emmmmm好像不大會
例題:
- 給定遞推式$a_n = 2a_{n-1} + 1$,求通項公式($a_0 = 0$)
設這個數列的生成函數$G(x) = \sum_{i=0}^{+\infty} a_ix^i$
$G(x) = (2a_0 + 1)x + (2a_1 + 1)x^2 + ...$
$=(2a_0x + 2a_1x^2 + ...) + (x + x^2 + ...)$
$=2x(a_0 + a_1x + ...) + (x + x^2 + ...)$
$=2xG(x) + \frac{1}{1-x} - 1$
即:$G(x) = \frac{x}{(1-x)(1-2x)} = \frac{1}{1-2x} - \frac{1}{1-x}$
得到每一項系數(通項公式)為:$a_n = 2^n - 1$
我們把題目中的十條限制用生成函數的方法寫出來:
$\frac{1}{1-x^6}$,$\frac{1-x^10}{1-x}$
$\frac{1-x^6}{1-x}$,$\frac{1}{1-x^4}$
$\frac{1-x^8}{1-x}$,$\frac{1}{1-x^2}$
$\frac{1-x^2}{1-x}$,$\frac{1}{1-x^8}$
$\frac{1}{1-x^{10}}$,$\frac{1-x^4}{1-x}$
把這十個式子乘起來,得到$\frac{1}{(1-x)^5}$
那么答案(第$n$項的系數)就是$C_{n+4}^{4} = \frac{(n+1)(n+2)(n+3)(n+4)}{24}$
- 求斐波那契數列的通項公式($a_0 = 0, a_1 = a_2 = 1, a_n = a_{n - 1} + a_{n - 2}$)
先設生成函數$G(x) = \sum_{i=0}^{+\infty} = a_i x^i$
由遞推公式可以得到(這里可能要多想一想):
$$G(x) - x^2 - x = x(G(x) - x) + x^2G(x) = \frac{x}{1-x-x^2}$$
我們要想辦法把這個式子化成上面的那種特殊生成函數
$$\frac{x}{1-x-x^2} = \frac{x}{(1 - \frac{1 - \sqrt{5}}{2}x)(1 - \frac{1 + \sqrt{5}}{2}x)}$$
為了方便書寫,我們設$\alpha = \frac{1 + \sqrt{5}}{2}, \beta = \frac{1 - \sqrt{5}}{2}$,我們再裂項一下,得到:
$$\frac{1}{\sqrt{5}} (\frac{1}{1 - \alpha x} - \frac{1}{1 - \beta x})$$
於是得到通項公式$a_n = \frac{\alpha^n - \beta^n}{\sqrt{5}}$
即:$$a_n = \frac{\frac{1 + \sqrt{5}}{2} - \frac{1 - \sqrt{5}}{2}}{\sqrt{5}}$$
- 求$n$位十進制數中出現偶數個$5$的數的個數
先考慮遞推公式,假設我們已經知道了$n-1$位時的答案$a_{n-1}$,然后我們考慮在最后一位添加的數字
設出現奇數個$5$的數的個數為$b_n$,那么容易得到:$a_n = 9a_{n-1} + b_{n-1}$
又因為:$a_n + b_n = 9 * 10^{n-1}$
所以有:$a_n = 8 * a_{n-1} + 9 * 10^{n-2}$
設$G(x)$為生成函數,根據遞推關系,不難得到:
$$G(x) - 8x = 8xG(x) + 9x^2(\frac{1}{1-10x})$$
整理得:
$$G(x) = \frac{x(8 - 71x)}{(1-8x)(1-10x)}$$
化簡一下可以得到:
$$G(x) = \frac{1}{2}(\frac{7x}{1 - 8x} + \frac{9x}{1 - 10x})$$
於是得到通項公式:
$$a_n = \frac{7 * 8^{n-1} + 9 * 10^{n-1}}{2}$$
總結:
我們可以總結一下用生成函數由遞推公式推得通項公式的步驟:
- 設數列生成函數為$G(x) = \sum_{i=0}^{+\infty} a_ix^i$
- 由遞推式推得$G(x)$的數值表達式
- 將$G(x)$的數值表達式轉化成上面幾種特殊形式的式子
- 將$x^n$的系數提出,即可得到$a_n$的通項公式
其實上述過程也可以逆轉過來,通過數列的通項公式(生成函數)求出遞推公式,感興趣的話還可以看這篇文章:一類通過生成函數求線性遞推式的方法