普通生成函数
Why so vegetable?
OGF
普通生成函数,也叫OGF,用函数生成数列,一个函数 \(F\) 的麦克劳林展式的各系数对应一个数列 \(f\),如\(x+1\) 对应于 \((1,1,0,…,0,…)\),\(\frac {1} {1-x}\) 对应于 \((1,1,…,1,…)\)。
一些简单的运算:
-
两个函数的线性组合对应于两个序列的线性组合,即 \(aF(x)+bG(x)=\sum(af_n+bg_n)x^n\)。
-
乘以 \(x^m\) 对应于右移一个序列 \(m\) 项,\(x^mF(x)=\sum f_{n-m}x^n\)。
-
向左移一个序列 \(m\) 项,\(\frac {F(x)-f_0-f^1x-f^2x^2...} {x^m}=\sum f^{n+m}x^n\)。
-
序列的前缀和为 \(\frac {1} {1-x}f(x)\)。证明的话展开即可。
一些有用的序列:
-
二项式序列 \((\binom {n} {0}, \binom {n} {1},\binom {n} {2},...)\) 由 \((1+x)^n\) 生成。
-
调和级数 \((0, 1, \frac 1 2,\frac 1 3,...)\) 由 \(-\ln(1-x)\) 生成。
-
\(F(x)+(-)F(-x)\) 用于提取偶数(奇数)项。
用生成函数进行递推:先找递推式,两边用 \(F\) 代换,解出 \(F\) 的生成函数即可。
比如斐波那契数列,\(f_i=f_{i-1}+f_{i-2}\)。(\(f_0=0\),\(f_1=1\))
找出关系 \(f_i=f_{i-1}+f_{i-2}+[i=1]\)。
则 \(F(x)=\sum f_i x^i=\sum (f_{i-1}+f_{i-2}+[i=1])x^i=xF(x)+x^2F(x)+x\)。
所以 \(F(x)=\frac {x} {1-x-x^2}\)。使用 Bostan-Mori 应该就可以了。亦可多项式除法。
在解关于 \(F(x)\) 的方程时,如果很难解,可以考虑用多项式的牛顿迭代法。
再比如 catalan 数列 \(f_n=\sum f_kf_{n-k-1},f_0=1,f_1=1\)。
对 \(n\geqslant 1\) 和 \(n<0\) 的情况,原式成立。\(n=0\) 时不成立。
我们改写一下这个式子,使之不依赖两个给定的初值:\(\sum f_kf_{n-k-1}+[n=0]\)。
\(F(x)=\sum f_i x^i=\sum (\sum f_kf_{i-k-1}+[i=0])x^i\)。
\(F(x)=\sum f_kx^k\sum f^{i-1-k}x^{i-k}+1=F(x)xF(x)+1\)。
用求根公式解出 \(F(x)=\frac {1+(-)\sqrt{1-4x}} {2x}\)。
这里应该取负号(?)
有两个组合对象构成的集合 \(A\) 和 \(B\),定义 \(C\) 是 \(A\) 和 \(B\) 的并集,那么有\(C(x)=A(x)+B(x)\)。定义 \(D\) 是 \(A\) 和 \(B\) 的笛卡尔积,定义有序对 \(d=(a,b)\) 的大小 \(|d|=|a|+|b|\),那么有 \(D(x)=A(x)B(x)\)。
现在有一个组合对象构成的集合 \(A\),定义 \(SEQ_A\) 是 \(A\) 中元素排成的序列(\(n\) 元笛卡尔积)组成的集合,一个序列的大小定义为各元素大小之和,如 \(A=\{“0”,”1”\}\) 的 \(SEQ\) 表示 \(01\) 串。则 \(SEQ_A=1+A^1+A^2+...=\frac {1} {1-A(x)}\)。
例子是背包问题。我们在 link 中已经探讨过了。
EGF
指数生成函数,也叫 EGF,一个函数 \(F\) 的麦克劳林展式的各系数对应一个数列 \(f\),其中 \(F(x)=\sum_{n=0}^{+\infty}f_n\frac {x^n} {n!}\)。叫指数生成函数的原因是 \(e^x\) 对应序列 \((1,1,1,…)\)。
一些简单的运算
-
两个函数的线性组合对应于两个序列的线性组合,即 \(aF(x)+bG(x)=\sum (af_i+bg_i)\frac {x^i} {i!}\)。
-
一次积分对应于右移序列一项,即 \(\int F(x)dx=\sum_{n=1}^{+\infty}f_{n-1}\frac {x^n} {n!}\)。
-
一次求导对应左移序列一项,即 \(F'(x)=\sum_{n=0}^{\infty}f_{n+1}\frac {x^n} {n!}\)。
-
\(H(x)=F(x)\cdot G(x)\),即 \(h_i=\sum_{i=0}^{+\infty}i!\sum_{j=0}^i \frac {f_j\cdot g_{i-j}}{j!(i-j)!}=\sum_{i=0}^{+\infty}\sum_{j=0}^if_j g_{i-j} \binom i j\)。所以要么你就带着 \(\frac {1} {i!}\) 卷积,要么改一下这个函数直接 FFT。
现在来考虑 EGF 的组合意义。有一个带标号组合对象构成的集合 \(A\),定义 \(SEQ_A\) 是A中元素任意拼接的序列组成的集合(拼接时考虑顺序)。
则 \(SEQ_A(x)=1+A+\frac {A^2}{2!}+...=e^{A}\)。
这个有很大的应用面,比如求如一个带标号的简单无向图是若干个连通分量拼接成的方案数。令 \(G\) 是简单无向图的EGF,\(C\) 是简单连通图的EGF,则 \(G=\sum_{i=0}^{+\infty}2^{\binom n 2}\frac {a_i} {i!}\)(\(G(0)=1\)),且 \(e^C=G\),则 \(C=\ln G\)。
但是最后答案要乘 \(i!\),因为这是 EGF。
又如集合划分问题。发现方案数的 EGF 就是 \(e^{e^x-1}\)。这就是 Bell 数。
还有第二类斯特林数,\(S(n,m)\) 表示将 \(n\) 个不同的元素划分成 \(m\) 个集合的方案数。