组合数学:生成函数

作者

李 辉

发布于

2026年4月2日

递推关系

我们在一个银行账户中存入了 1000 元,该账户每年年底支付 5% 的利息。

每年年初,我们再向该账户存入 500 元。

20 年后,这个账户里会有多少钱?

a_0=1000, a_{n+1}=1.05\cdot a_n+500

a_{20}=?


练习 1 a_0=1000, a_{n+1}=1.05\cdot a_n+500

a_{20}=?


错排问题 (Derangement)

假设 n 个人编号为 1,2,\cdots,n。同时有 n 顶帽子也编号为 1,2,\cdots,n。我们需要找到没有人拿到的帽子编号与自己编号相同的方法数。

设 A_i 为 [n] 的所有排列构成的集合,其中元素 i 位于第 i 个位置,换句话说,元素 i 是固定的。

例如,23541\in A_4。

答案与 \#(\bigcup _{i=1}^{n}A_{i}) 相关。

\#A_i=(n-1)!


集合 A_i\cap A_j 由元素 i 和 j 固定的排列组成,其余 n-2 个项可以自由排列,共有 (n-2)! 种方式。 \#(A_i\cap A_j)=(n-2)!

因此,解为: n!-\left[\binom n1 (n-1)!-\binom n2 (n-2)!+\binom n3 (n-3)!\cdots\right]

或

\sum_{k=0}^{n}(-1)^k\binom nk (n-k)!\quad\text{即}\quad d_n=n!\sum_{k=0}^{n}\frac{(-1)^k}{k!}。


递推方法 假设我们要确定 n 个整数 1,2,\cdots,n 的错排数。

让我们关注元素 k 并将其移至第一个位置。

这样我们就开始了一个错排,因为 1 不在其自然位置。那么 1 可以放在哪里呢?

有两种情况可以考虑:要么 1 在位置 k,要么 1 不在位置 k。


如果 1 在位置 k:

\begin{aligned} 1&2&3&\cdots&k-1&k&k+1&\cdots&n\\ k&?&?&\cdots&?&1&?&\cdots&?\\ \end{aligned}

还有 n-2 个整数需要进行错排。

这可以用 d_{n-2} 种方式完成。

如果 1 不在位置 k:

\begin{aligned} 1&2&3&\cdots&k-1&k&k+1&\cdots&n\\ k&?&?&\cdots&?&?&?&\cdots&?\\ \end{aligned}

现在有 n-1 个整数需要进行错排。

这可以用 d_{n-1} 种方式完成。


综合起来,当 k 在第一个位置时,有 d_{n-1} + d_{n-2} 种可能的错排。

选择元素 k 共有 (n-1) 种不同的方式。

因此, d_n = (n-1)\left[d_{n-1} + d_{n-2}\right]

d_1 = 0 且 d_2 = 1。

普通生成函数

生成函数 (Generating function) 是一个关于一个不定元的形式幂级数,其系数编码了关于由自然数索引的数列 a_n 的信息。

数列 a_n 的普通生成函数 (Ordinary generating function) 是:

G(a_n,x)=\sum_{n=0}^\infty a_nx^n。


例 1 a_0=50, a_{n+1}=4a_n-100。

令 G(x)=\sum_{n=0}^\infty a_nx^n。

\sum_{n=0}^\infty a_{n+1}x^{n+1}=\sum_{n=0}^\infty 4a_{n}x^{n+1}-\sum_{n=0}^\infty 100x^{n+1} G(x)-a_0=4xG(x)-\frac{100x}{1-x}。

G(x)=\frac{a_0}{1-4x}-\frac{100x}{(1-x)(1-4x)}


\frac{a_0}{1-4x}=50\sum_{n=0}^\infty (4x)^n=50\sum_{n=0}^\infty 4^nx^n

\frac{100x}{(1-x)(1-4x)}=-\frac{100/3}{1-x}+\frac{100/3}{1-4x} =\frac{100}{3}\left(\sum_{n=0}^\infty 4^nx^n-\sum_{n=0}^\infty x^n \right)

G(x)=50\sum_{n=0}^\infty 4^nx^n-\frac{100}{3}\left(\sum_{n=0}^\infty 4^nx^n-\sum_{n=0}^\infty x^n \right)

=\sum_{n=0}^\infty \left(50\cdot 4^n-100\cdot \frac{4^n-1}{3}\right)x^n


由于 G(x)=\sum_{n=0}^\infty a_nx^n,

a_n=50\cdot 4^n-100\cdot \frac{4^n-1}{3}。

\sum_{n=0}^\infty x^n=\frac{1}{1-x}

\frac{A}{1-x}+\frac{B}{1-4x}=\frac{100x}{(1-x)(1-4x)}

A(1-4x)+B(1-x)=100x

(-B-4A)x+A+B=100x

\begin{cases} -B-4A=100\\ A+B=0\\ \end{cases}


练习 2 请使用生成函数计算 a_{20}。

a_0=1000

a_{n+1}=1.05\cdot a_n+500

斐波那契数列

图 1: 斜向的杨辉三角

斐波那契数 (Fibonacci numbers) 数列 F_n 由以下递推关系定义:

F_n = F_{n-1} + F_{n-2},

初始值为:

F_1 = 1,\; F_2 = 1。


斐波那契数列 的生成函数是幂级数:

G(x)=\sum_{k=0}^{\infty} F_k x^k。

接着 \begin{gather} = F_0 + F_1x + \sum_{k=2}^{\infty} \left( F_{k-1} + F_{k-2} \right) x^k \\ = x + \sum_{k=2}^{\infty} F_{k-1} x^k + \sum_{k=2}^{\infty} F_{k-2} x^k \end{gather}


\begin{gather} = x + x\sum_{k=0}^{\infty} F_k x^k + x^2\sum_{k=0}^{\infty} F_k x^k \\ = x + x G(x) + x^2 G(x)。 \end{gather}

解方程:

G(x)=x+xG(x)+x^2G(x)

得:

G(x)=\frac{x}{1-x-x^2}


练习 3 试求出斐波那契数 F_n 的通项公式 (explicit formula)。


定理 1 前 n 个斐波那契数之和可以表示为:F_{1}+F_{2}+\cdots+F_{n-1}+F_{n}=F_{n+2}-1。

证. \begin{aligned} F_1=F_3-F_2\\ F_2=F_4-F_3\\ F_3=F_5-F_4\\ \cdots\\ F_n=F_{n+2}-F_{n+1}\\ \end{aligned}  

F_1+F_2+\cdots+F_{n}=F_{n+2}-F_2=F_{n+2}-1\square


定理 2 斐波那契数列奇数项之和:

F_{1}+F_{3}+F_{5}+\cdots+F_{2n-1}=F_{2n}。

练习 4 你能证明它吗?


定理 3 斐波那契数列偶数项之和: F_{2}+F_{4}+F_{6}+\cdots+F_{2n}=F_{2n+1}-1。

证. F_1+F_2+\cdots+F_{2n}=F_{2n+2}-1 F_1+F_3+\cdots+F_{2n-1}=F_{2n}

F_2+F_4+\cdots+F_{2n}=F_{2n+2}-1-F_{2n}=F_{2n+1}-1\square


定理 4 正负交替的斐波那契数之和:

F_1-F_2+F_3-F_4+\cdots+(-1)^{n+1}F_n=(-1)^{n+1}F_{n-1}+1。

练习 5 你能证明它吗?


定理 5 前 n 个斐波那契数的平方和:

F_1^2+F_2^2+\cdots+F_{n-1}^2+F_n^2=F_n F_{n+1}

证. F_k^2=F_k(F_{k+1}-F_{k-1})=F_k F_{k+1}-F_k F_{k-1}

\begin{aligned} F_1^2=F_1 F_2\\ F_2^2=F_2 F_3-F_1 F_2\\ F_3^2=F_3 F_4-F_2 F_3\\ \cdots\\ F_n^2=F_n F_{n+1}-F_{n-1}F_n\square\\ \end{aligned}


约瑟夫·开普勒 (Johannes Kepler) 观察到,相邻斐波那契数的比值趋于收敛。

该极限趋向于黄金分割比 \varphi。

\lim_{n\to\infty}\frac{F_{n+1}}{F_n}=\varphi。

证. 使用斐波那契规则:

F_n = F_{n-1} + F_{n-2}。

\varphi^2 = \varphi + 1,

\varphi = \frac{1\pm\sqrt{5}}{2}\approx1.618 \text{ 或 } -0.618。\square

指数生成函数 ***

数列 a_n 的指数生成函数 (Exponential generating function) 是:

\operatorname{E}(a_n,x)=\sum _{n=0}^{\infty} a_n \frac{x^n}{n!}。

例 2 设 a_0 = 1,且当 n > 0 时,a_{n+1} = (n + 1)(a_n-n + 1)。试求 a_n 的闭态公式。


指数生成函数为: E(x)=\sum_{n=0}^\infty a_n\frac{x^n}{n!}。

\sum_{n=0}^\infty a_{n+1}\frac{x^{n+1}}{{(n+1)}!}=\sum_{n=0}^\infty a_n\frac{x^{n+1}}{n!}-\sum_{n=0}^\infty (n-1)\frac{x^{n+1}}{n!}

E(x)-1=xE(x)-x^2 e^x+xe^x

E(x)=\frac{1}{1-x}+x e^x=\sum_{n=0}^\infty x^n+\sum_{n=0}^\infty \frac{x^{n+1}}{n!}。


E(x)=\sum_{n=0}^\infty n!\frac{x^n}{n!}+\sum_{n=0}^\infty (n+1)\frac{x^{n+1}}{(n+1)!}。

E(x)=\sum_{n=0}^\infty n!\frac{x^n}{n!}+\sum_{n=0}^\infty n\frac{x^{n}}{n!}。

由于 E(x)=\sum_{n=0}^\infty a_n\frac{x^n}{n!},

a_n=n!+n。


练习 6 设 a_0 = 0。如果 n > 0,则: a_{n+1} = 2(n + 1)a_n+(n+1)!

试求 a_n 的通项公式。


错排问题

从递推式 d_{n+1}=nd_n+nd_{n-1} 开始。定义 d_{-1}=0,这与递推式是一致的。

乘以 \frac{x^n}{n!} 并对 n\ge 0 求和:

\sum_{n\ge 0}d_{n+1}\frac{x^n}{n!}=\sum_{n\ge 0}nd_n\frac{x^n}{n!}+\sum_{n\ge 0}nd_{n-1}\frac{x^n}{n!}。


令 E(x)=\sum_{n\ge 0}d_n\frac{x^n}{n!} 为指数生成函数。

E'(x)=\sum_{n\ge 0}nd_n\frac{x^{n-1}}{n!}=\sum_{n\ge 1}d_n\frac{x^{n-1}}{(n-1)!}=\sum_{n\ge 0}d_{n+1}\frac{x^n}{n!},\qquad

xE'(x)=x\sum_{n\ge 0}nd_n\frac{x^{n-1}}{n!}=\sum_{n\ge 0}nd_n\frac{x^n}{n!},

xE(x)=\sum_{n\ge 0}d_n\frac{x^{n+1}}{n!}\qquad


=\sum_{n\ge 0}(n+1)d_n\frac{x^{n+1}}{(n+1)!}=\sum_{n\ge 1}nd_{n-1}\frac{x^n}{n!}=\sum_{n\ge 0}nd_{n-1}\frac{x^n}{n!}\qquad

因此, E'(x)=xE'(x)+xE(x),\quad \frac{E'(x)}{E(x)}=\frac{x}{1-x}=-1+\frac{1}{1-x},\quad E(x)=\frac{e^{-x}}{1-x}。

E(x)=\left(1+x+x^2+\cdots+x^n+\cdots\right)\cdot

\left(1-\frac{x}{1!}+\frac{x^2}{2!}-\cdots+(-1)^n\frac{x^n}{n!}+\cdots\right)=\sum_{n=0}^\infty \left[1-\frac{1}{1!}+\frac{1}{2!}-\cdots+\frac{(-1)^n}{n!}\right]x^n

d_n=\left[1-\frac{1}{1!}+\frac{1}{2!}-\cdots+\frac{(-1)^n}{n!}\right]\cdot n!