生成函数
概念
先从一个简单的例子入手:今有猪肉包、牛肉包、梅菜包、三丁包、豆沙包各一;小明要吃两个,有几种吃法?
答案显然是 (25)=10 种。
但是换种思路,是「0 或 1 个猪肉包」「0 或 1 个牛肉包」……这样,于是就是
(x0+x1)(x0+x1)⋯=(1+x)5=1+5x+10x2+10x3+5x4+x5
这样,x2 的系数就是答案。
再复杂一点,若猪肉包有两个,没有牛肉包,则有几种吃法?
这会就是
(x0+x1+x2)(x0+x1)(x0+x1)(x0+x1)=1+4x+7x2+7x3+4x4+x5
简单来说,生成函数(generating function)是一种把无限数列表示成幂序列的系数的表示法:
F(x)=f0+f1x+f2x2+⋯
使用 [xn]F(x) 指代这个生成函数中 xn 的系数 fn。
一些额外说明:
- 生成函数又叫作「母函数」
- 这里只讨论所谓「普通(ordinary)」生成函数
- 不关心函数是否收敛
- 这里仅做直观介绍
生成函数的乘积
令
⎩⎨⎧A(x)B(x)=n=0∑∞anxn=n=0∑∞bnxn
有
[xn](A(x)⋅B(x))=k=0∑nakbn−k
这也就是卷积(convolution)。
显然还有
{[xn](c⋅F(x))[xn](F(α⋅x))=c⋅[xn]F(x)=αn⋅[xn]F(x)
卷积规则
计数的卷积规则
令 A(x) 为从集合 A 中选择对象的计数法所对应的生成函数,B(x) 为从集合 B 中选择对象的计数法所对应的生成函数,且 A∩B=∅,则 A(x)⋅B(x) 为从 A∪B 中选择对象的计数法所对应的生成函数。
更严格地说,这里要求从 A∪B 中选择对象的方法更像是 A×B,即一一对应于有序对 (a,b),其中 a 为从集合 A 中选择对象的方法,b 为从集合 B 中选择对象的方法。
部分分式分解
现在使用 1,2,3,4 代称包子,买包子现在有下面的规则:
- 1 号必须是偶数个
- 2 号必须是 5 的倍数
- 最多买 4 个 3 号
- 最多买 1 个 4 号
若总共买 6 个,有以下几种方案
方案/包子编号 |
1 号 |
2 号 |
3 号 |
4 号 |
1 |
6 |
0 |
0 |
0 |
2 |
4 |
0 |
2 |
0 |
3 |
4 |
0 |
1 |
1 |
4 |
2 |
0 |
4 |
0 |
5 |
2 |
0 |
3 |
1 |
6 |
0 |
5 |
1 |
0 |
7 |
0 |
5 |
0 |
1 |
这里我们可以得到四个生成函数:
⎩⎨⎧A1(x)A2(x)A3(x)A4(x)=1+x2+x4+⋯=1−x21=x5+x10+x15+⋯=1−x5x5=1+x+x2+x3+x4=1−x1−x5=1+x
则
A(x)=A1(x)⋅A2(x)⋅A3(x)⋅A4(x)=1−x21⋅1−x5x5⋅1−x1−x5⋅(1+x)=(1−x)21=1+2x+3x2+⋯+nxn−1+⋯
部分分式分解
设 p(x) 为次数小于 n 的多项式,a1,⋯,an 为互不相同的非零数,则存在常数 c1,⋯,cn 使得
(1−a1x)⋯(1−anx)p(x)=1−a1xc1+⋯+1−anxcn
求 [xn]R(x),其中 R(x)=1−x−x2x。
解答
注意到 1−x−x2=(1−a1x)(1−a2x),容易解得 a1=21+5,a2=21−5。从而
R(x)=1−a1xc1+1−a2xc2
再解得 c1=51,c2=−51,从而有
R(x)=51(1−a1x1−1−a2x1)
又
1−a1x11−a2x1=1+a1x+a12x2+⋯=1+a2x+a22x2+⋯
则有
[xn]R(x)=5a1n−a2n=51((21+5)n−(21−5)n)
部分分式分解
分母多项式若有非零 m 重根,则可将整个商式表示为形如 (1−ax)kc 的项的和的形式,其中 k⩽m。
[xn](1−ax)kc=can(nn+(k−1))
这是由 [xn](1−x)k1=(nn+(k−1)) 推出的。
常用生成函数
G(x) |
ak |
展开式 |
(1+x)n |
(kn) |
1+(1n)x+(2n)x2+⋯+xn |
(1+ax)n |
(kn)ak |
1+(1n)ax+(2n)a2x2+⋯+anxn |
(1+xr)n |
⎩⎨⎧(rkn),0,if r∣kotherwise |
1+(rn)xr+(2rn)x2r+⋯+xnr |
1−x1−xn+1 |
{1,0,if k⩽notherwise |
1+x+x2+⋯+xn |
1−x1 |
1 |
1+x+x2+⋯ |
1−ax1 |
ak |
1+ax+a2x2+⋯ |
1−xr1 |
{1,0,if r∣kotherwise |
1+xr+x2r+⋯ |
(1−x)21 |
k+1 |
1+2x+3x2+⋯ |
(1−x)n1 |
(kn+k−1) |
1+(1n)x+(2n+1)x2+⋯ |
(1+x)n1 |
(kn+k−1)(−1)k |
1−(1n)x+(2n+1)x2−⋯ |
(1−ax)n1 |
(kn+k−1)ak |
1+(1n)ax+(2n+1)a2x2+⋯ |
ex |
k!1 |
1+1!1x+2!1x2+⋯ |
ln(1+x) |
k(−1)k−1 |
x−21x2+31x3−⋯ |
实例
斐波那契数列有
⎩⎨⎧f0f1fn+2=0,=1,=fn+1+fn
生成函数
F(x)=f0+f1x+f2x2+⋯+fnxn+⋯
则有
(1−x−x2)F(x)=f0+(f1−f0)x+(f2−f1−f0)x2+(f3−f2−f1)x3+⋯=(f1−f0)x=x
得 F(x)=1−x−x2x。
递推关系
第二类斯特林数
第二类斯特林数:n 个元素的集合分成 k 个非空子集的方法数。记作 S(n,k) 或 {kn}。
则有
⎩⎨⎧S(0,0)=1,S(n,0)=S(0,n)=0,S(n+1,k)=k⋅S(n,k)+S(n,k−1),n>0k>0
递推怎么得出来的呢?
考虑第 n+1 个元素,它可以在这 k 个集合中任选一个加入,而前 k 种集合划分 n 个元素方法有 S(n,k) 种,从而这种情况有 k⋅S(n,k) 种;当然,第 n+1 个元素也可以「自成一派」,这时候前 n 个元素就只有 k−1 个非空子集可供选择了,此时就只有 S(n,k−1) 种,加法原理有 S(n+1,k)=k⋅S(n,k)+S(n,k−1) 种。
利用容斥原理求第二类斯特林数 S(n,k):
记 N={f 为满射∣f:{1,⋯,n}→{1,⋯,k}},从而有 ∣N∣=k!⋅S(n,k)(因为 N 指定了 k 个非空子集的顺序)。
令 X={f∣f:{1,⋯,n}→{1,⋯,k}},Xj={f∈X∣f 值域不包括 j},则有 ∣X∣=kn,∣Xj∣=(k−1)n,从而有
∣N∣=j=1⋂nXˉj=X−j=1⋃nXj=kn−(j=1∑k(−1)j+1(jk)(k−j)n)=j=0∑k(−1)j(jk)(k−j)n
即
S(n,k)=k!1j=0∑k(−1)j(jk)(k−j)n
物体分配到盒子里的方法计数
- n 个不同物体分配到 k 个不同的盒子中,使第 i 个盒子包含 ni 个物体(i=1,⋯,k)
- (n1,⋯,nkn)
- n 个不同物体分配到 k 个相同的盒子中,不允许空盒
- 第二类斯特林数 S(n,k)
- n 个相同物体分配到 k 个不同的盒子中
- (nn+k−1)
- n 个相同物体分配到 k 个相同的盒子中,不允许空盒
鸽笼原理
鸽笼原理
若要将 n 只鸽子放到 m 个笼子中,且 m<n,则至少有一个笼子要装 2 个或更多的鸽子。
若 ∣A∣>∣B∣,则不存在从 A 到 B 的单射。
鸽笼原理的推广
若要将 n 个物体放到 m 个盒子中,且 m<n,则至少有一个笼子需容纳 ⌈mn⌉ 个或更多物体。
换言之,若 ∣A∣>k⋅∣B∣,对于任何一个 f:A→B,它把至少 k+1 个 A 中的不同元素映射到 B 中的同一个元素。
拉姆齐数(Ramsey number)
拉姆齐数(Ramsey number)R(k,l)=n 是最小的 n 使 n 个人中至少有 k 个人互相认识或至少有 l 个人互相不认识。