MathLabs

组合数学与离散数学

生成函数

把数列编码为系数的幂级数,将组合问题转化为代数问题。

直观什么是生成函数

想象一条挂满无穷多个衣夹的晾衣绳,衣夹编号为 0,1,2,3,…0, 1, 2, 3, \dots。要描述一个数列 a0,a1,a2,…a_0, a_1, a_2, \dots,就把数 ana_n 挂在第 nn 个夹子上。生成函数正是把这条晾衣绳写成一个单一的代数对象:数 ana_n 变成幂级数中 xxn^n 的系数。变量 xx 从不代入具体数值,它只是让每一项待在自己位置上,这样一来,数列的加法、乘法或移位都变成了多项式上的普通代数运算。

近似生成函数 $\frac{1}{1-x}$ 的三次多项式 $1+x+x^2+x^3$ 的图像。
这条曲线是三次多项式 1+x+x2+x31+x+x^2+x^3,它是 11−x=∑n=0∞xn\frac{1}{1-x}=\sum_{n=0}^{\infty}x^n 的前四项,即常数列 an=1a_n=1 的生成函数。每个系数(拖动 a,b,c,da,b,c,d)都是数列的一个夹子被打包进曲线中。

中学把数列打包进幂级数

定义: 普通生成函数

数列 a0,a1,a2,…a_0, a_1, a_2, \dots 的普通生成函数(OGF)是形式幂级数 G(x)=∑n=0∞anxnG(x)=\sum_{n=0}^{\infty}a_nx^n。“形式的”意味着我们把这个和当作一个代数表达式,而不是需要数值求值的函数;xx 取特定值时的收敛性问题与组合计数无关。

G(x)=∑n=0∞anxnG(x)=\sum_{n=0}^{\infty}a_nx^n

最简单的构件是对所有 n≥0n \ge 0 成立的数列 an=1a_n=1,其生成函数是等比级数 11−x=∑n=0∞xn\frac{1}{1-x}=\sum_{n=0}^{\infty}x^n。这个等式是大多数生成函数论证背后的引擎:它表明 11−x\frac{1}{1-x} 编码了“从无限供应中选取 nn 个物品,不计顺序,每种恰有一种取法”。

1(1−x)2=∑n=0∞(n+1)xn\frac{1}{(1-x)^2}=\sum_{n=0}^{\infty}(n+1)x^n
常见数列及其生成函数
数列生成函数
常数,an=1a_n=111−x\frac{1}{1-x}
线性,an=n+1a_n=n+11(1−x)2\frac{1}{(1-x)^2}
斐波那契,an=Fna_n=F_nx1−x−x2\frac{x}{1-x-x^2}
二项式系数行,an=(kn)a_n=\binom{k}{n}(1+x)k(1+x)^k

大学从递推关系到封闭形式

设 F0=0, F1=1F_0=0,\ F_1=1,且对 n≥2n\ge2 有 Fn=Fn−1+Fn−2F_n=F_{n-1}+F_{n-2}。则普通生成函数 F(x)=∑n=0∞FnxnF(x)=\sum_{n=0}^{\infty}F_nx^n 等于 F(x)=x1−x−x2F(x)=\frac{x}{1-x-x^2}。

为什么成立?

系数为常数的线性递推关系,只要乘以 xxn^n 再对所有 nn 求和,就总会变成一个简单的代数(其实是有理)方程——递推关系变成了乘以一个关于 xx 的多项式。

证明

把递推关系 Fn=Fn−1+Fn−2F_n=F_{n-1}+F_{n-2}(对 n≥2n\ge2 成立)乘以 xnx^n,再对 n≥2n\ge2 求和:∑n≥2Fnxn=∑n≥2Fn−1xn+∑n≥2Fn−2xn\sum_{n\ge2}F_nx^n=\sum_{n\ge2}F_{n-1}x^n+\sum_{n\ge2}F_{n-2}x^n。

左边等于 F(x)−F0−F1x=F(x)−xF(x)-F_0-F_1x=F(x)-x。右边第一个和是 x∑n≥2Fn−1xn−1=x∑m≥1Fmxm=x(F(x)−F0)=xF(x)x\sum_{n\ge2}F_{n-1}x^{n-1}=x\sum_{m\ge1}F_mx^m=x(F(x)-F_0)=xF(x)。第二个和是 x2∑n≥2Fn−2xn−2=x2∑k≥0Fkxk=x2F(x)x^2\sum_{n\ge2}F_{n-2}x^{n-2}=x^2\sum_{k\ge0}F_kx^k=x^2F(x)。

于是 F(x)−x=xF(x)+x2F(x)F(x)-x=xF(x)+x^2F(x),即 (1−x−x2)F(x)=x(1-x-x^2)F(x)=x。

解出 F(x)F(x) 得 F(x)(1−x−x2)=xF(x)(1-x-x^2)=x,因此 F(x)=x1−x−x2F(x)=\frac{x}{1-x-x^2},这一个有理函数就打包了整个无穷的斐波那契数列。

设 φ=1+52\varphi=\frac{1+\sqrt{5}}{2} 与 ψ=1−52\psi=\frac{1-\sqrt{5}}{2},由 1−x−x21-x-x^2 的根可得对所有 n≥0n\ge0 成立的封闭公式 Fn=15(φn−ψn)F_n=\frac{1}{\sqrt{5}}\left(\varphi^n-\psi^n\right)。

为什么成立?

任何分母含有互不相同的一次因子的有理生成函数,都可以分解为若干简单等比级数之和,而每个等比级数都能直接给出系数的显式公式。

证明

分解分母:由于 1−x−x2=01-x-x^2=0 的根是 x=1/φx=1/\varphi 与 x=1/ψx=1/\psi,故有 1−x−x2=(1−φx)(1−ψx)1-x-x^2=(1-\varphi x)(1-\psi x)。

把 x1−x−x2=A1−φx+B1−ψx\frac{x}{1-x-x^2}=\frac{A}{1-\varphi x}+\frac{B}{1-\psi x} 写成含常数 A,BA,B 的形式。通分并比较常数项与 xx 的系数,得到一个线性方程组,解得 A=15A=\frac{1}{\sqrt5},B=−15B=-\frac{1}{\sqrt5},于是 x1−x−x2=15(11−φx−11−ψx)\frac{x}{1-x-x^2}=\frac{1}{\sqrt{5}}\left(\frac{1}{1-\varphi x}-\frac{1}{1-\psi x}\right)。

把每一项展开为等比级数:11−φx=∑n≥0φnxn\frac{1}{1-\varphi x}=\sum_{n\ge0}\varphi^nx^n,11−ψx=∑n≥0ψnxn\frac{1}{1-\psi x}=\sum_{n\ge0}\psi^nx^n。

比较两边 xnx^n 的系数即得公式 Fn=15(φn−ψn)F_n=\frac{1}{\sqrt{5}}\left(\varphi^n-\psi^n\right),称为比内公式。

大学实际应用与典型例题

生成函数是一种实用工具,而不仅仅是理论上的趣味:计算机科学家用它求递归算法的精确和渐近运行时间,物理学家在统计力学中使用与之密切相关的配分函数,概率学家则把整个概率分布编码为生成函数,通过求导而不是求和来计算矩。

例题: 用两种硬币找零

如果硬币的顺序不重要,用无限供应的 11 单位和 22 单位硬币凑出金额 44,有多少种方法?

解答

每一种凑钱方式都是选择使用多少枚 11 单位硬币和多少枚 22 单位硬币,因此生成函数是 11 单位硬币的生成函数 11−x\frac{1}{1-x} 与 22 单位硬币的生成函数 11−x2\frac{1}{1-x^2} 的乘积:组合生成函数为 1(1−x)(1−x2)\frac{1}{(1-x)(1-x^2)}。

把两个因子展开为等比级数并相乘:(∑i≥0xi)(∑j≥0x2j)\left(\sum_{i\ge0}x^i\right)\left(\sum_{j\ge0}x^{2j}\right)。x4x^4 的系数统计满足 i+2j=4i+2j=4 且 i,j≥0i,j\ge0 的数对 (i,j)(i,j) 的个数。

有效数对为 (4,0)(4,0)、(2,1)(2,1)、(0,2)(0,2),所以共有 33 种方法:四枚 11 单位硬币;两枚 11 单位硬币和一枚 22 单位硬币;两枚 22 单位硬币。

例题: 由生成函数得出比内公式

利用封闭公式 F(x)=x1−x−x2F(x)=\frac{x}{1-x-x^2} 和比内公式 Fn=15(φn−ψn)F_n=\frac{1}{\sqrt{5}}\left(\varphi^n-\psi^n\right) 直接计算 F5F_5,不必逐个列出 F0,…,F4F_0,\dots,F_4。

解答

根据上面的定理,φ=1+52\varphi=\frac{1+\sqrt{5}}{2} 与 ψ=1−52\psi=\frac{1-\sqrt{5}}{2} 是代入比内公式 Fn=15(φn−ψn)F_n=\frac{1}{\sqrt{5}}\left(\varphi^n-\psi^n\right) 的两个根。

数值上 φ≈1.618\varphi\approx1.618,ψ≈−0.618\psi\approx-0.618,故 φ5≈11.09\varphi^5\approx11.09,ψ5≈−0.09\psi^5\approx-0.09。

于是 F5=15(φ5−ψ5)≈15(11.09−(−0.09))=11.185≈5F_5=\frac{1}{\sqrt5}(\varphi^5-\psi^5)\approx\frac{1}{\sqrt5}(11.09-(-0.09))=\frac{11.18}{\sqrt5}\approx5。

确实 F5=5F_5=5,与反复应用递推关系 0,1,1,2,3,50,1,1,2,3,5 得到的值一致——但比内公式可以直接跳到任意一个 FnF_n,而不必先计算它之前的项。

对所有 n≥0n\ge0 成立的常数列 an=1a_n=1 的普通生成函数是什么?

1(1−x)2\frac{1}{(1-x)^2} 中 x3x^3 的系数是多少?

下列哪个问题最适合用生成函数自然地解决?

斐波那契数列的生成函数 F(x)=∑FnxnF(x)=\sum F_nx^n 满足下列哪个封闭形式?

参考文献

  1. Herbert S. Wilf (1994). generatingfunctionology
  2. Philippe Flajolet, Robert Sedgewick (2009). Analytic Combinatorics