组合数学与离散数学
生成函数
把数列编码为系数的幂级数,将组合问题转化为代数问题。
直观什么是生成函数
想象一条挂满无穷多个衣夹的晾衣绳,衣夹编号为 0,1,2,3,…。要描述一个数列 a0,a1,a2,…,就把数 an 挂在第 n 个夹子上。生成函数正是把这条晾衣绳写成一个单一的代数对象:数 an 变成幂级数中 xn 的系数。变量 x 从不代入具体数值,它只是让每一项待在自己位置上,这样一来,数列的加法、乘法或移位都变成了多项式上的普通代数运算。
这条曲线是三次多项式 1+x+x2+x3,它是 1−x1=∑n=0∞xn 的前四项,即常数列 an=1 的生成函数。每个系数(拖动 a,b,c,d)都是数列的一个夹子被打包进曲线中。中学把数列打包进幂级数
定义: 普通生成函数
数列 a0,a1,a2,… 的普通生成函数(OGF)是形式幂级数 G(x)=∑n=0∞anxn。“形式的”意味着我们把这个和当作一个代数表达式,而不是需要数值求值的函数;x 取特定值时的收敛性问题与组合计数无关。
G(x)=n=0∑∞anxn 最简单的构件是对所有 n≥0 成立的数列 an=1,其生成函数是等比级数 1−x1=∑n=0∞xn。这个等式是大多数生成函数论证背后的引擎:它表明 1−x1 编码了“从无限供应中选取 n 个物品,不计顺序,每种恰有一种取法”。
(1−x)21=n=0∑∞(n+1)xn 常见数列及其生成函数| 数列 | 生成函数 |
|---|
| 常数,an=1 | 1−x1 |
| 线性,an=n+1 | (1−x)21 |
| 斐波那契,an=Fn | 1−x−x2x |
| 二项式系数行,an=(nk) | (1+x)k |
大学从递推关系到封闭形式
设 F0=0, F1=1,且对 n≥2 有 Fn=Fn−1+Fn−2。则普通生成函数 F(x)=∑n=0∞Fnxn 等于 F(x)=1−x−x2x。
为什么成立?
系数为常数的线性递推关系,只要乘以 xn 再对所有 n 求和,就总会变成一个简单的代数(其实是有理)方程——递推关系变成了乘以一个关于 x 的多项式。
证明
把递推关系 Fn=Fn−1+Fn−2(对 n≥2 成立)乘以 xn,再对 n≥2 求和:∑n≥2Fnxn=∑n≥2Fn−1xn+∑n≥2Fn−2xn。
左边等于 F(x)−F0−F1x=F(x)−x。右边第一个和是 x∑n≥2Fn−1xn−1=x∑m≥1Fmxm=x(F(x)−F0)=xF(x)。第二个和是 x2∑n≥2Fn−2xn−2=x2∑k≥0Fkxk=x2F(x)。
于是 F(x)−x=xF(x)+x2F(x),即 (1−x−x2)F(x)=x。
解出 F(x) 得 F(x)(1−x−x2)=x,因此 F(x)=1−x−x2x,这一个有理函数就打包了整个无穷的斐波那契数列。
设 φ=21+5 与 ψ=21−5,由 1−x−x2 的根可得对所有 n≥0 成立的封闭公式 Fn=51(φn−ψn)。
为什么成立?
任何分母含有互不相同的一次因子的有理生成函数,都可以分解为若干简单等比级数之和,而每个等比级数都能直接给出系数的显式公式。
证明
分解分母:由于 1−x−x2=0 的根是 x=1/φ 与 x=1/ψ,故有 1−x−x2=(1−φx)(1−ψx)。
把 1−x−x2x=1−φxA+1−ψxB 写成含常数 A,B 的形式。通分并比较常数项与 x 的系数,得到一个线性方程组,解得 A=51,B=−51,于是 1−x−x2x=51(1−φx1−1−ψx1)。
把每一项展开为等比级数:1−φx1=∑n≥0φnxn,1−ψx1=∑n≥0ψnxn。
比较两边 xn 的系数即得公式 Fn=51(φn−ψn),称为比内公式。
大学实际应用与典型例题
生成函数是一种实用工具,而不仅仅是理论上的趣味:计算机科学家用它求递归算法的精确和渐近运行时间,物理学家在统计力学中使用与之密切相关的配分函数,概率学家则把整个概率分布编码为生成函数,通过求导而不是求和来计算矩。
例题: 用两种硬币找零
如果硬币的顺序不重要,用无限供应的 1 单位和 2 单位硬币凑出金额 4,有多少种方法?
解答
每一种凑钱方式都是选择使用多少枚 1 单位硬币和多少枚 2 单位硬币,因此生成函数是 1 单位硬币的生成函数 1−x1 与 2 单位硬币的生成函数 1−x21 的乘积:组合生成函数为 (1−x)(1−x2)1。
把两个因子展开为等比级数并相乘:(∑i≥0xi)(∑j≥0x2j)。x4 的系数统计满足 i+2j=4 且 i,j≥0 的数对 (i,j) 的个数。
有效数对为 (4,0)、(2,1)、(0,2),所以共有 3 种方法:四枚 1 单位硬币;两枚 1 单位硬币和一枚 2 单位硬币;两枚 2 单位硬币。
例题: 由生成函数得出比内公式
利用封闭公式 F(x)=1−x−x2x 和比内公式 Fn=51(φn−ψn) 直接计算 F5,不必逐个列出 F0,…,F4。
解答
根据上面的定理,φ=21+5 与 ψ=21−5 是代入比内公式 Fn=51(φn−ψn) 的两个根。
数值上 φ≈1.618,ψ≈−0.618,故 φ5≈11.09,ψ5≈−0.09。
于是 F5=51(φ5−ψ5)≈51(11.09−(−0.09))=511.18≈5。
确实 F5=5,与反复应用递推关系 0,1,1,2,3,5 得到的值一致——但比内公式可以直接跳到任意一个 Fn,而不必先计算它之前的项。
对所有 n≥0 成立的常数列 an=1 的普通生成函数是什么?
(1−x)21 中 x3 的系数是多少?
下列哪个问题最适合用生成函数自然地解决?
斐波那契数列的生成函数 F(x)=∑Fnxn 满足下列哪个封闭形式?