详解生成函数
Posted top_secret的小尛博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了详解生成函数相关的知识,希望对你有一定的参考价值。
参考资料
- WC2019讲义 生成函数,多项式算法与图的计数.pdf
- OI-Wiki
- cp-algorithms
- https://zhuanlan.zhihu.com/p/52718645
- 等等……
指数型生成函数
数列\\(\\{a_i\\}\\)的指数型生成函数(EGF)是\\(A(x)=\\sum_{i=0}^\\infty\\frac{a_i}{i!}x_i\\)。
若\\(C=A*B\\),则
故
多项式\\(\\exp\\)与\\(\\ln\\)的意义
若\\(A\\)为表示蓝色的带编号树的个数的生成函数(即,\\(a_n\\)表示\\(n\\)个节点的带编号树的个数),\\(B\\)代表红色的带编号树的个数,则\\(A*B\\)代表一个两棵树的森林,一棵为红色,一颗为蓝色,这样的森林的个数。
又因为红色与蓝色可以交换,若不考虑颜色,同一个森林实际上被计数了两遍,故\\(\\frac{A^2}{2!}=A*A/2\\)代表两棵树的森林的个数。
以此类推,枚举森林中树的个数\\(i\\),则\\(C=\\sum_{i\\ge 0}\\frac{A^i}{i!}\\)代表了森林的个数。
由于对\\(x\\in\\R\\),\\(e^x=\\sum_{i\\ge0}\\frac{x^i}{i!}\\)(在\\(x=0\\)处泰勒展开),如果令\\(x=A\\),我们可以记\\(C=e^A\\)。这样,我们得到了多项式\\(\\exp\\)的定义:
其中\\(A\\)是一个生成函数,\\(A^i\\)表示多项式\\(A\\)的\\(i\\)次方。同样,通过泰勒展开的方法,我们可以得到多项式\\(\\ln\\)的定义。
多项式运算的实现
多项式乘法逆
设\\(A(x)=\\sum_{i\\ge 0}a_ix^i\\),且有\\(a_0\\ne 0\\),则其存在唯一的逆\\(B(x)=\\sum_{i\\ge 0}b_ix^i\\),满足:
显然,可以如此递归地定义\\(b_i\\)。
考虑如何求\\(B(x)\\bmod x^n\\),显然\\(n=1\\)时\\(b_0=a_0^{-1}\\)。
若已求得\\(\\bmod x^{\\lceil n/2\\rceil}\\)的答案\\(B_0\\),考虑如何推得\\(B\\):
我们显然有:
对两边平方,得
其中最后一步是在两边乘了一个\\(B^{-1}\\)。由于\\(A\\)与\\(B\\)互为乘法逆,\\(B^{-1}\\equiv A\\),故:
递归计算即可。
多项式\\(\\ln\\)
设\\(B=\\ln A\\),将其两边取导数。由\\(\\mathrm {\\frac{d}{dx}}\\ln A=\\frac{1}{A}A\'\\),有\\(B\'=\\frac{A\'}{A}\\),故
用\\(\\eqref{inv}\\)求出\\(A^{-1}\\)即可。
牛顿迭代法
泰勒展开
设\\(G(x)\\)为一个定义在\\(\\mathbb R\\)上函数,则\\(G(x)\\)在\\(x_0\\)处的泰勒展开(一个函数,使得\\(x_0\\)处的\\(0\\)阶、\\(1\\)阶、……导数都相等(可类比拉格朗日插值公式))为:
注意,由于\\(x_0\\)固定,\\(G(x_0)\\)与\\(G\'(x_0)\\)等都是常数。
为了方便接下来的讨论,我们设\\(G(x)=f(x)+b\\),其中\\([x^0]f(x)=0\\)(即\\(f(0)=0\\))。
我们扩大\\(G\\)的定义域,使得\\(G\\)对于所有级数\\(F\\)都有定义,为\\(G(F)=f(F)+b\\),其中\\(b\\)也可以是一个(常)级数,\\(f\\)是一个函数。同样\\(f\\)的系数也可以是常级数。
我们的任务是求\\(G(F)\\equiv 0\\)在\\(\\bmod x^n\\)意义下的解。
考虑倍增,设\\(F_0\\)表示\\(\\bmod x^{\\lceil x/2\\rceil}\\)意义下的解,有(将\\(G\\)在\\(F_0\\)处泰勒展开\\(\\eqref{taylor}\\))
其中\\(R\\)是一个关于\\(F\\)的函数。由于\\((F-F_0)\\bmod x^{\\lceil n/2\\rceil}=0\\),可知\\((F-F_0)^2\\bmod x^{n}=0\\),故
两边除以\\(G\'(F_0)\\),我们获得了:
多项式\\(\\exp\\)
若\\(B=e^A\\),则\\(\\ln B=A\\)。我们相当于要解\\(\\ln B-A=0\\)
令\\(F(B)=\\ln B-A\\),直接使用\\(\\eqref{newton}\\),得:
即
倍增即可,需要用到多项式\\(\\ln\\)。
例题
以上是关于详解生成函数的主要内容,如果未能解决你的问题,请参考以下文章