普通生成函数
我太菜了,所以这里只讲 OGF。
0.定义#
定义序列 ⟨an⟩ 的普通生成函数为形式幂级数 ∑n≥0anxn。
另外,生成函数有封闭形式,设一个生成函数为 F(x)=∑n≥0xn,则我们不难发现,xF(x)+1=F(x),如果我们直接把这个东西看作关于 F(x) 的方程,则解得 F(x)=1−x1,这个东西就是生成函数的封闭形式
你肯定会觉得这个东西和幂级数是否收敛有关,但是
与其说它有帮助,还不如说它是一个障碍 ——《具体数学》
葛立恒、高德纳所言即是
1.运算#
加法很简单,⟨cn⟩=⟨an⟩+⟨bn⟩=⟨an+bn⟩
乘法则可以看成多项式乘法,也叫做卷积。因为这玩意是离散的,所以 ⟨cn⟩=⟨an⟩∗⟨bn⟩=⟨∑k=0nakbn−k⟩。
而除法等其他的则涉及多项式求逆。
一般,我们不管 x 的意义,只关注系数和指数。
2.应用#
我们可以用生成函数来证明一些恒等式。
以范德蒙德卷积为例:
设 ⟨an⟩=(1+x)r=∑n=0rCrnxn,⟨bn⟩=(1+x)s=∑n=0sCsnxn,⟨cn⟩=(1+x)r+s=∑n=0r+sCr+snxn。
不难发现,⟨cn⟩=⟨an⟩∗⟨bn⟩。
那我们把这个卷积展开,得到 ⟨cn⟩=⟨∑k=0nakbn−k⟩。
我们再带入 an=Crn,bn=Csn,cn=Cr+sn,则有 Cr+sn=∑k=0nCrkCsn−k。
如果你看到了这里,那么恭喜你,你证明了范德蒙德卷积。
这个东西可以拿来求解一些类似背包问题的东西,更准确的,是无标号计数问题,以这个为例,是不是有点大材小用,我们对每一个砝码,列出它的生成函数。
f(1)=1+x+…+xa1f(2)=1+x2+…+(x2)a2⋮f(20)=1+x20+…+(x20)a20然后答案的生成函数就很好求了,A(x)=f(1)∗f(2)∗…∗f(20),根据题面,答案即为 ∑i=11000[[xi]A(x)≥1]。
相对的,EGF 解决的是有标号的计数问题下期预定。