生成函数
生成函数(generating function),又称母函数,是一种形式幂级数,其每一项的系数可以提供关于这个序列的信息。
生成函数有许多不同的种类,但大多可以表示为单一的形式:
F(x)=∑nankn(x)
其中 kn(x) 被称为核函数,不同的核函数会导出不同的生成函数,分成3类
普通生成函数:kn(x)=xn (OGF)
指数生成函数:kn(x)=xnn! (EGF)
狄利克雷生成函数:kn(x)=1nx (DGF)
另外,对于生成函数 F(x),我们用 [kn(x)]F(x) 来表示它的第 n 项的核函数对应的系数,也就是 an
容易发现其中的 x 对于原式中的结果并没有什么影响,我们想要的应该是固定项前面的系数
普通生成函数
形式:
F(x)=∑nanxn
a 既可以是有穷序列,也可以是无穷序列
若干例子:
序列 a=⟨1,2,3⟩ 的OGF:1+2x+3x2
序列 a=⟨1,1,1,…,1⟩ 的OGF:∑nxn
序列 a=⟨1,2,4,8,16,…⟩ 的OGF:∑n2nxn
序列 a=⟨1,3,5,7,9,…⟩ 的OGF:∑n(2n+1)xn
基本运算
考虑两个序列 a,b 的普通生成函数,分别为 F(x),G(x),那么有
F(x)±G(x)=∑n(an±bn)xn
因此 F(x)±G(x) 是序列 langlean±bn⟩
考虑乘法运算,也就是卷积:
F(x)G(x)=∑nxnn∑i=0aibn−i
封闭形式
这是OGF比较好玩的一个东西,就是说每次写成一个多项式真的很难受,但是如果能够把这个形式幂级数写成其它的形式可能就会好很多
对于上述例二,容易发现:
xF(x)+1=F(x)
很容易想到移项后可以得到:F(x)=11−x
可能会有点疑惑,这个东西怎么还能是负数?
实际上发现,如果要让前面的形式幂级数在 ∞ 处收敛,x的范围应在 ∈(−1,1)
但是还是不需要去理它,因为我们生成函数的本质不在于这个 x 的取值,或者说对于这个封闭形式,只是一种方便推过去和推回来的过程罢了,并不是对原式的具体阐述
有若干种物品 ,每种物品只有1件,求取 n 件物品的总方案数。
每种物品的生成函数是 1×x0+1×x1
那么若干个物品乘起来就是 (x+1)n
然后用二项式定理展开一下就可以得到:
(x+1)n=n∑i=0(ni)xi
如果学过组合数学就会发现这个确实很对
当然也有比较恶心的
有若干种物品 ,每种物品可以取任意件,求取 n 件物品的总方案数
和上个题一样,每个物品的生成函数是:n∑i=0xi 很快就能发现,又等于 11−x
这样的话 m 件物品的生成函数就是
1(1−x)m=(1−x)−m=∞∑i=0−m×(−m−1)…(−m−i+1)i!(−x)i=∞∑i=0(−1)i×m×(m+1)…(m+i−1)i!(−1)ixi=∞∑i=0(m+i−1)!i!(m−1)!xi=∞∑i=0(m+i−1m−1)xi
同时可以用隔板法理解,答案是相同的
来个重头戏:斐波那契数列:
前置知识:
11−kx=∑i=0kixi
设 F(x) 表示斐波那契数列的生成函数
首先第一步拆分,容易得到:
A=1+1x+2x2+3x3+5x4+8x5xA= x+1x2+2x3+3x4+5x5x2A= 1x2+1x3+2x4+3x5
容易发现下面两个相加就只和第一个差出来一个数1
A−xA−x2A=1
整理一下:A=11−x−x2
然后发现这和上面补充的前置知识太相似了,如果能做到和前面的那个完全一样就好了
然后就是很多套路性的转化了
第一个因式分解,1−x−x2=(1−ix)(1−jx)
解得 i=1+√52 j=1−√52
但是这时候还是两个 11−kx 的卷积,容易发现既然根式都出来了,上面的1也顺路拆了算了
令 ai+bj=1,得到 a=1√5i b=−1√5j
带回原来的式子里,裂项以后拆成一个巨无霸式子:
A=i√511−ix−j√511−jx
写的更加简便一点:
A=M1−ax+N1−bx=∑k=0(Mak+Nbk)xk
同时 M=√5i5,N=−√5j5,a=i,b=j
然后就是前面的基本多项式运算了
F(x)=∑k=0((√5i5)×(1+√52)k−√5j5×(1−√52)k)xk
经过一点点化简就能得到:
x1−x−x2=∑n≥0xn1√5((1+√52)n−(1−√52)n)
到这里其实要说的也就差不多了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步