生成函数
生成函数(generating function),又称母函数,是一种形式幂级数,其每一项的系数可以提供关于这个序列的信息。
生成函数有许多不同的种类,但大多可以表示为单一的形式:
F ( x ) = ∑ n = 0 ∞ a n k n ( x ) F(x) = \sum_{n=0}^{\infty}a_{n}k_{n}(x) F(x)=n=0∑∞ankn(x)
其中 a n a_{n} an是数列的第 n n n项, k n ( x ) k_{n}(x) kn(x)被称为核函数,不同的核函数决定了不同类型的生成函数。生成函数既可以是有限的,也可以是无限的。
其中,根据核函数的不同,生成函数大致分为:
- 普通型生成函数: k n ( x ) = x n k_{n}(x)=x^{n} kn(x)=xn
- 指数型生成函数: k n ( x ) = x n n ! k_{n}(x)=\frac{x^{n}}{n!} kn(x)=n!xn
- 狄利克雷生成函数: k n ( x ) = 1 x n k_{n}(x)=\frac{1}{x^{n}} kn(x)=xn1
其中,最常用的为普通型生成函数,本文围绕普通型生成函数展开讨论。
普通型生成函数
普通型生成函数定义为幂级数的形式:
F ( x ) = ∑ n = 0 ∞ a n x n F(x) = \sum_{n=0}^{\infty}a_{n}x^{n} F(x)=n=0∑∞anxn
通常假设数列以 a 0 a_{0} a0开始。
给出几个常见的生成函数:
- 有限项生成函数: a = { 1 , 2 , 3 } a=\{1,2,3\} a={1,2,3}, F ( x ) = 1 + 2 x + 3 x 2 F(x)=1 + 2x+3x^{2} F(x)=1+2x+3x2
- 1 1 1序列生成函数: a = { 1 , 1 , 1 , … } a=\{1,1,1,\ldots\} a={1,1,1,…}, F ( x ) = ∑ n = 0 ∞ x n F(x)=\sum_{n=0}^{\infty}x^{n} F(x)=∑n=0∞xn
- 2 2 2的幂次生成函数: a = { 1 , 2 , 4 , , 8 … } a=\{1,2,4,,8\ldots\} a={1,2,4,,8…}, F ( x ) = ∑ n = 0 ∞ 2 n x n F(x)=\sum_{n=0}^{\infty}2^{n}x^{n} F(x)=∑n=0∞2nxn
- 奇数生成函数: a = { 1 , 3 , 5 , , 7 … } a=\{1,3,5,,7\ldots\} a={1,3,5,,7…}, F ( x ) = ∑ n = 0 ∞ ( 2 n + 1 ) x n F(x)=\sum_{n=0}^{\infty}(2n+1)x^{n} F(x)=∑n=0∞(2n+1)xn
换句话说,如果 a n a_{n} an有通项公式,那么幂级数的形式很容易写出。
基本运算
加法运算
考虑两个序列 a , b a,b a,b 的普通生成函数,分别为 F ( x ) , G ( x ) F(x),G(x) F(x),G(x)。那么有
F ( x ) ± G ( x ) = ∑ n = 0 ∞ ( a n ± b n ) x n F(x)\pm G(x)=\sum_{n=0}^{\infty} (a_n\pm b_n)x^n F(x)±G(x)=n=0∑∞(an±bn)xn
因此 F ( x ) ± G ( x ) F(x)\pm G(x) F(x)±G(x) 是序列 ⟨ a n ± b n ⟩ \langle a_n\pm b_n\rangle ⟨an±bn⟩ 的普通生成函数。
乘法运算(卷积)
考虑乘法运算,也就是卷积:
F ( x ) G ( x ) = ∑ n = 0 ∞ x n ∑ i = 0 n a i b n − i F(x)G(x)=\sum_{n=0}^{\infty} x^n \sum_{i=0}^na_ib_{n-i} F(x)G(x)=n=0∑∞xni=0∑naibn−i
因此 F ( x ) G ( x ) F(x)G(x) F(x)G(x) 是序列 ⟨ ∑ i = 0 n a i b n − i ⟩ \langle \sum_{i=0}^n a_ib_{n-i} \rangle ⟨∑i=0naibn−i⟩ 的普通生成函数。
注意:序列 ⟨ ∑ i = 0 n a i b n − i ⟩ \langle \sum_{i=0}^n a_ib_{n-i} \rangle ⟨∑i=0naibn−i⟩满足一般乘法,加法原理。这是以后卷积运算在排列组合中的内部原理。
幂级数的封闭
有时,我们做两个无穷幂级数的卷积的时候,对于无穷多项多项式做卷积是一件很困难的事,我们可以用幂级数的收敛值来代替幂级数做卷积运算。
这种方法称为幂级数的封闭。
例如 ⟨ 1 , 1 , 1 , ⋯ ⟩ \langle 1,1,1,\cdots\rangle ⟨1,1,1,⋯⟩ 的普通生成函数 F ( x ) = ∑ n = 0 ∞ x n F(x)=\sum_{n=0}^{\infty}x^n F(x)=∑n=0∞xn,我们可以发现
F ( x ) x + 1 = F ( x ) F(x)x+1=F(x) F(x)x+1=F(x)
那么解这个方程得到
F ( x ) = 1 1 − x F(x)=\frac{1}{1-x} F(x)=1−x1
这就是 ∑ n = 0 ∞ x n \sum_{n = 0}^{\infty}x^n ∑n=0∞xn 的封闭形式。
注意:上式等号仅在收敛域内成立。
考虑等比数列 ⟨ 1 , p , p 2 , p 3 , p 4 , ⋯ ⟩ \langle 1,p,p^2,p^3,p^4,\cdots\rangle ⟨1,p,p2,p3,p4,⋯⟩ 的生成函数 F ( x ) = ∑ n ≥ 0 p n x n F(x)=\sum_{n\ge 0}p^nx^n F(x)=∑n≥0pnxn,有
F ( x ) p x + 1 = F ( x ) F ( x ) = 1 1 − p x F(x)px+1 =F(x) \\ F(x) =\frac{1}{1-px} F(x)px+1=F(x)F(x)=1−px1
等比数列的封闭形式与展开形式是常用的变换手段。
除了上述两个下列给出几种常见的封闭运算:
求导型
a = ⟨ 1 , 2 , 3 , 4 , ⋯ ⟩ a=\langle 1,2,3,4,\cdots \rangle a=⟨1,2,3,4,⋯⟩。
第三个(求导):
F ( x ) = ∑ n ≥ 0 ( n + 1 ) x n = ∑ n ≥ 1 n x n − 1 = ∑ n ≥ 0 ( x n ) ′ = ( 1 1 − x ) ′ = 1 ( 1 − x ) 2 \begin{aligned}F(x)&=\sum_{n\ge 0}(n+1)x^n\\&=\sum_{n\ge 1}nx^{n-1}\\&=\sum_{n\ge 0}(x^n)'\\&=\left(\frac{1}{1-x}\right)'\\&=\frac{1}{(1-x)^2}\end{aligned} F(x)=n≥0∑(n+1)xn=n≥1∑nxn−1=n≥0∑(xn)′=(1−x1)′=(1−x)21
牛顿二项式定理型
a n = ( m n ) a_n=\binom{m}{n} an=(nm)( m m m 是常数, n ≥ 0 n\ge 0 n≥0)。
F ( x ) = ∑ n ≥ 0 ( m n ) x n = ( 1 + x ) m F(x)=\sum_{n\ge 0}\binom{m}{n}x^n=(1+x)^m F(x)=n≥0∑(nm)xn=(1+x)m
倒数型
a n = ( m + n n ) a_n=\binom{m+n}{n} an=(nm+n)( m m m 是常数, n ≥ 0 n\ge 0 n≥0)。
F ( x ) = ∑ n ≥ 0 ( m + n n ) x n = 1 ( 1 − x ) m + 1 F(x)=\sum_{n\ge 0}\binom{m+n}{n}x^n=\frac{1}{(1-x)^{m+1}} F(x)=n≥0∑(nm+n)xn=(1−x)m+11
积分型
不常用。
幂级数的展开
幂级数在封闭形式下运算之后,得到的函数应该再次展开成幂级数的形式,才能获取到新的数列信息。
常用的展开方法就是封闭的逆运算,以及适当的换元,求导,积分,泰勒级数等等。
应用
- 承德汉堡:偶数个
- 可乐:0 个或 1 个
- 鸡腿:0 个,1 个或 2 个
- 蜜桃多:奇数个
- 鸡块:4 的倍数个
- 包子:0 个,1 个,2 个或 3 个
- 土豆片炒肉:不超过一个。
- 面包:3 的倍数个
每种食物都是以“个”为单位,只要总数加起来是 n n n 就算一种方案。对于给出的 n n n 你需要计算出方案数,对 10007 10007 10007 取模。
这是一道经典的生成函数题。对于一种食物,我们可以设 a n a_n an 表示这种食物选 n n n 个的方案数,并求出它的生成函数。而两种食物一共选 n n n 个的方案数的生成函数,就是它们生成函数的卷积。多种食物选 n n n 个的方案数的生成函数也是它们生成函数的卷积。
在理解了方案数可以用卷积表示以后,我们就可以构造生成函数(标号对应题目中食物的标号):
- ∑ n ≥ 0 x 2 n = 1 1 − x 2 \displaystyle\sum_{n\ge 0}x^{2n}=\dfrac{1}{1-x^2} n≥0∑x2n=1−x21。
- 1 + x 1+x 1+x。
- 1 + x + x 2 = 1 − x 3 1 − x 1+x+x^2=\dfrac{1-x^3}{1-x} 1+x+x2=1−x1−x3。
- x 1 − x 2 \dfrac{x}{1-x^2} 1−x2x。
- ∑ n ≥ 0 x 4 n = 1 1 − x 4 \displaystyle \sum_{n\ge 0}x^{4n}=\dfrac{1}{1-x^4} n≥0∑x4n=1−x41。
- 1 + x + x 2 + x 3 = 1 − x 4 1 − x 1+x+x^2+x^3=\dfrac{1-x^4}{1-x} 1+x+x2+x3=1−x1−x4。
- 1 + x 1+x 1+x。
- 1 1 − x 3 \dfrac{1}{1-x^3} 1−x31。
那么全部乘起来,得到答案的生成函数:
F ( x ) = ( 1 + x ) ( 1 − x 3 ) x ( 1 − x 4 ) ( 1 + x ) ( 1 − x 2 ) ( 1 − x ) ( 1 − x 2 ) ( 1 − x 4 ) ( 1 − x ) ( 1 − x 3 ) = x ( 1 − x ) 4 F(x)=\frac{(1+x)(1-x^3)x(1-x^4)(1+x)}{(1-x^2)(1-x)(1-x^2)(1-x^4)(1-x)(1-x^3)} =\frac{x}{(1-x)^4} F(x)=(1−x2)(1−x)(1−x2)(1−x4)(1−x)(1−x3)(1+x)(1−x3)x(1−x4)(1+x)=(1−x)4x
然后将它转化为展开形式:
F ( x ) = ∑ n ≥ 1 ( n + 2 n − 1 ) x n F(x)=\sum_{n\ge 1}\binom{n+2}{n-1}x^n F(x)=n≥1∑(n−1n+2)xn
因此答案就是 ( n + 2 n − 1 ) = ( n + 2 3 ) \dbinom{n+2}{n-1}=\dbinom{n+2}{3} (n−1n+2)=(3n+2)。
例题
求解 ∑ i = 1 n ( 3 i x ) \sum_{i = 1}^n \binom{3i}{x} ∑i=1n(x3i)。
考虑构造一个系数是 ∑ i = 1 n ( 3 i t ) \sum_{i = 1}^n \binom{3i}{t} ∑i=1n(t3i)关于 x t x^t xt的一个多项式生成函数。
固定 3 i 3i 3i那么 ( 3 i t ) = [ x t ] ( 1 + x ) 3 i \binom{3i}{t} = [x^t](1+x)^{3i} (t3i)=[xt](1+x)3i,那么所求多项式为 ∑ i = 1 n ( 3 i t ) = ∑ i = 1 n [ x t ] ( 1 + x ) 3 i = [ x t ] ∑ i = 1 n ( 1 + x ) 3 i \sum_{i = 1}^n \binom{3i}{t} = \sum_{i = 1}^n[x^t](1+x)^{3i} = [x^t]\sum_{i = 1}^n(1+x)^{3i} ∑i=1n(t3i)=∑i=1n[xt](1+x)3i=[xt]∑i=1n(1+x)3i。
考虑对 ∑ i = 1 n ( 1 + x ) 3 i \sum_{i = 1}^n(1+x)^{3i} ∑i=1n(1+x)3i进行化简,套用等比数列求和公式得到:
( x + 1 ) 3 n + 3 − ( x + 1 ) 3 ( x + 1 ) 3 − 1 \frac {(x+1)^{3n+3}-(x+1)^3}{(x+1)^3-1} (x+1)3−1(x+1)3n+3−(x+1)3
考虑多项式除法即可在 O ( n ) O(n) O(n)时间内算出所有的系数。
总结
生成函数是连接离散数学和连续数学的桥梁,离散数学的加法、乘法原理对应连续数学中的卷积运算,使得复杂的加法、乘法原理变成了相对简单的卷积运算,引入卷积之后,连续数学所有的求导、极限、积分理论均可使用。还有加快多项式卷积的FFT也可以使用。