今天来填上之前那个坑。
什么是生成函数
生成函数(\(\texttt{Generating Function}\))是一种形式幂级数,其每一项的系数可以提供对应序列的信息。
一般来说生成函数的形式为:
\[F(x)=\sum_{n}a_nf_n(x)
\]
其中 \(f_n(x)\) 函数被我们称为核函数,不同核函数对应不同的生成函数,拥有不同性质:
- 普通生成函数:\(f_n(x)=x^n\)
- 指数生成函数:\(f_n(x)=\frac{x^n}{x!}\)
- 狄利克雷生成函数:\(f_n(x)=\frac{1}{n^x}\)
而 \(a_n\) 称为 \(f_n(x)\) 在 \(F(x)\) 中的系数 (\(\texttt{Coefficient}\)),写作
\[a_n=[f_n(x)]F(x)
\]
\(\{a_n\}\) 可以为有穷序列也可以是无穷序列。
普通生成函数
定义形式幂级数
\[F(x)=\sum_na_nx^n
\]
为数列 \(\{a_n\}\) 的普通生成函数(\(\texttt{Ordinary Generating function-OGF}\))。
\(\texttt{for example:}\)
数列 \(\{a_n\}=\{0,1,2,3,\cdots\}\) 的普通生成函数是 \(\sum_{n\geq0}n\times x^n\)
而数列 \(\{a_n\}=\{ 0,1,2,3 \}\) 的普通生成函数是 \(0+x+2x^2+3x^3\)
数列 \(\{a_n\}\) 的起点决定了幂的起点。以上我们约定以 \(0\) 作起点编号,下同。
基本运算
与复数或反演等其他数论知识类似,生成函数也有自己基本运算的定义。也就是生成函数与生成函数之间的直接运算。
加减
假设有数列 \(\{a_n\},\{b_n\}\) 各自的 OGF \(F(x),G(x)\)。根据定义则有:
\[F(x)\pm G(x)=\sum_{n}(a_n+b_n)x^n
\]
我们在序列的定义中有序列 \(\{ a\pm b\}\) 的定义,所以我们可以认为 \(F(x)\pm G(x)\) 为 \(\{ a\pm b\}\)的 OGF。
卷积
对于函数来说乘法运算就是做卷积,所以定义数列 \(\{a_n\},\{b_n\}\) 各自的 OGF \(F(x),G(x)\) 卷积可得:
\[F(x)\sdot G(x)=\sum_nx^n\sum_{i=0}^na_ib_{n-i}
\]
那么同理 \(F(x)\sdot G(x)\) 是数列 \(\{c_n\}=\displaystyle\{ \sum_{i=0}^n a_ib_{n-i}\}\) 的 OGF,也就是两数列卷积的 OGF。
移位
我们可以将生成函数进行移位,具体表现就是原来数列对应的生成函数编号整体变小向前移或变大向后移。
想做移位我们有
\[x^m\sum_{n\geq0}a_nx^n=\sum_{n\geq m}a_{n-m}x^n\\
\frac{1}{x^m}\bigg(\sum_{n\geq 0}a_nx^n-\sum_{n\geq 0}^{m-1}a_nx^n\bigg)=\sum_{n\geq 0}a_{n+m}x^n
\]
生成函数是不存在负指数的,所以前移时我们减去前 \(m\) 项。
求导与积分
如果单独对 \(a_nx^n\) 求很简单:
对上式求导得:
\[na_xx^{n-1}
\]
积分得:
\[\frac{a_n}{n+1}x^{n+1}
\]
所以对生成函数逐项求导/积分整理得:
\[\frac{\mathrm d}{\mathrm{d}x}\bigg(\sum_{n\geq 0}a_nx^n\bigg)=\sum_{n\geq 0}(n+1)a_{n+1}x^n\\
\int\bigg(\sum_{n\geq 0} a_nx^n\bigg)\mathrm{d}x=\sum_{n\geq 0}\frac{a_{n-1}}{n}x^n+C
\]
举(几)个栗子
Fibonacci
大家耳熟能详的斐波拉契数列(\(\{fib_n\}\) 方便起见下文写作 \(\{f_n\}\))定义为:
\[f_0=0,f_1=1,f_i=f_{i-1}+f_{i-2}(i\geq 1)
\]
设其 OGF 为 \(F(x)=\sum_{n\geq 0}f_nx^n\)。容易发现其性质允许我们使用错位相减法。
\[\begin{aligned}
F(x) &= &f_0x^0+f_1x^1+f_2x^2+f_3x^3+\cdots\\
xF(x) &= &f_0x^1+f_1x^2+f_2x^3+\cdots\\
x^2F(x)&= &f_0x^2+f_1x^3+\cdots
\end{aligned}
\]
整理得:
\[F(x)=x+xF(x)+x^2F(x)
\]
解方程有:
\[F(x)=\frac{x}{1-x-x^2}
\]
我们观察分母是最高是二次,分子单独为一次的 \(x\) 所以可以考虑设一个待定系数分式方程。
\[\frac{A}{1-ax}+\frac{B}{1-bx}=\frac{x}{1-x-x^2}
\]
通分有
\[\frac{A-Abx+B-aBx}{(1-ax)\times(1-bx)}=\frac{x}{1-x-x^2}
\]
得
\[\begin{cases}
A+B=0\\
Ab+aB=-1\\
a+b=1\\
ab=-1
\end{cases}\Rightarrow
\begin{cases}
A=\frac{1}{\sqrt5}\\
B=-\frac{1}{\sqrt5}\\
a=\frac{1+\sqrt5}{2}\\
b=\frac{1-\sqrt5}{2}
\end{cases}
\]
对于等比数列的展开式:
\[\frac{1}{1-ax}=\sum_{i\geq 0}a^ix^i
\]
我们可以将 \(F(x)\) 列成:
\[F(x)=\frac{x}{1-x-x^2}=\sum_{n\geq 0}x^n\frac{1}{\sqrt5}\bigg[\bigg(\frac{1+\sqrt5}{2}\bigg)^n-\bigg(\frac{1-\sqrt5}{2}\bigg)^n\bigg]
\]
这就是我们斐波拉契数列 OGF \(F(x)\) 的两种封闭形式。
Catalan
定义卡特兰数数列 \(\{c_n\}\) 为
\[c_n=\begin{cases}
1&n\in\{0,1\}\\
\displaystyle\sum_{i=0}^{n-1}c_ic_{n-i-1}&n>1\\
\end{cases}
\]
众所周知卡特兰数列是有对应组合意义的,我们在这里先不剧透。
我们设卡特兰数列的 OGT 为 \(C(x)\) 则有:
\[C(x)=\sum_{n\geq 0}c_nx^n
\]
\(\{c_n\}\) 的递推式形式很奇怪,很像是一个数列卷积形式,实际上,\(c_{n+1}\) 就是 \(\{c_n\}\) 与自己卷积后的第 \(n\) 项。看不出来没有关系,我们只需要尝试乱搞将 \(C(x)\) 化为一个卷积形式解出 \(C(x)\) 的封闭形式。
\[\begin{aligned}
C(x)&=\sum_{n\geq 0}c_nx^n\\
&=\sum_{n\geq 0}\bigg(\sum_{i=0}^{n-1}c_ic_{n-i-1}\bigg)x^n
\end{aligned}
\]
我们发现里面的和式以 \(n-1\) 为上界,所以可以考虑换元移位,刚好只需要移一位而 \(c_0=1\)。
\[\begin{aligned}
&\cdots\\
&=1+\sum_{n\geq 1}\bigg(\sum_{i=0}^{n-1}c_ic_{n-i-1}\bigg)x^n\\
&\text{see n-1 as n'}\\
&=1+x\sum_{n'\geq 0}\bigg(\sum_{i=0}^{n'}c_ic_{n'-i}\bigg)x^{n'}\\
&=1+xC^2(x)
\end{aligned}
\]
得
\[\begin{aligned}
C(x)&=xC^2(x)+1\\
C(x)-xC^2(x)-1&=0\\
xC^2(x)-C(x)+1&=0\\
C(x)&=\frac{1\pm\sqrt{1-4x}}{2x}
\end{aligned}
\]
尝试分子有理化
\[\frac{1\pm\sqrt{1-4x}}{2x}=\frac{1-(1-4x)}{2x(1\mp\sqrt{1-4x})}=\frac{2}{1\mp\sqrt{1-4x}}
\]
我们知道 \(C(0)=1\)
代入后会发现只有原式分子取 '\(-\)' 时成立,否则会出现分母 \(=0\) 的情况。
所以卡特兰数列 OGF 的封闭形式是
\[C(x)=\frac{1-\sqrt{1-4x}}{2x}
\]
我们怎么展开这样一个式子呢。
对于 \(\sqrt{1-4x}\) 可以看成 \((1-4x)^{\frac{1}{2}}\) 然后我们就可以直接套用广义二项式定理。
(广义二项式定理:\(\displaystyle(x+y)^\alpha=\sum_{k=0}^\infty\binom{\alpha}{k}x^{\alpha-k}{y^k}\) 其中\(\displaystyle\binom{\alpha}{k}=\frac{\alpha(\alpha-1)\cdots(\alpha-k+1)}{k!}\))
所以展开得
\[\begin{aligned}
(1-4x)^{\frac{1}{2}}&=\sum_{n=0}^\infty\binom{\frac{1}{2}}{n}(-4x)^n\\
&=\sum_{n=0}^\infty\frac{\frac{1}{2}\times(\frac{1}{2}-1)\times(\frac{1}{2}-2)\times\cdots\times(\frac{1}{2}-n+1)}{n!}(-4x)^n\\
&=1+\sum_{n=1}^\infty(-1)^{n-1}\frac{\prod_{i=2}^n(2i-3)}{2^n\times n!}(-4x)^n\\
&=1-\sum_{n=1}^\infty\frac{\prod_{i=2}^n(2i-3)}{n!}(2x)^n\\
&=1-\sum_{n=1}^\infty\frac{(2n-3)!}{n!\times\prod_{i=2}^n(2i-2)}(2x)^n\\
&=1-\sum_{n=1}^\infty\frac{(2n-2)!}{(n-1)\times!n!\times2^{n-1}}(2x)^n\\
&=1-2\sum_{n=1}^\infty\frac{(2n-2)!}{(n-1)!\times n!}x^n
\end{aligned}
\]
代入 \(C(x)\) 有:
\[\begin{aligned}
C(x)&=\frac{\displaystyle\bigg(2\sum_{n=1}^\infty\frac{(2n-2)!}{(n-1)!\times n!}x^n\bigg)}{2x}\\
&=\sum_{n=1}^\infty\frac{(2n-2)!}{(n-1)!\times n!}x^{n-1}\\
&=\sum_{n=0}^\infty\frac{(2n)!}{n!\times(n+1)!}x^n\\
&=\sum_{n=0}^\infty\frac{\binom{2n}{n}}{n+1}x^n\\
\end{aligned}
\]
于是得到 \(c_n=\frac{\binom{2n}{n}}{n+1}\)。
对于这个数的组合意义就有很多种了,在 OI 中我们一般可以应用到的有:\(n\) 个点的二叉树的个数,\(n\) 对括号的合法括号序列数,计算几何中将 \(n+2\) 边形进行三角划分的方案数。
小结一下
生成函数其实是一个很大的数学知识点。虽说计数题在 OI 模拟赛中十分常见,但是真正比赛却没有多少很难的生成函数计数题,因为实际上过于简单的没有含金量,过难的并没有什么意义。其实关于生成函数我不打算继续扩展,因为实在太难了。 掌握基本的生成函数有助于学习组合意义,提升推式子能力,其他。。。就看着办吧!!!
\[\text{OGF——}\texttt{2021.06.11写在笔记本电脑前}
\]
Reference: