生成函数和多项式学习笔记。
举樽空对西江月,清光曾照苑中人。
沉沙铺了几场雪,折戟坍落覆忠魂。
莫叹歌钟高台立,一炬焦土皆做尘。
石崩木朽昔人尽,墟间一花探清晨。——《怀古》
生成函数。
线性递推
先引入线性递推问题:
其中 \(f_i=0(i<0)\),\(b_i\) 只有前 \(n_0\) 项有值(\(n_0<k\)),我们可以 \(O(k^3\log n)\) 矩阵快速幂算出来它。我们不关注它的细节因为我们只是为了引出生成函数。
我们把 \(f_n\) 移到右边,然后把 \(a_0\) 取相反数,有
如果我们让 \(a_i=0(i>k)\),那么我们还有
然后我们可以记
那我们的上式可以记为 \(AF+B=0\)。我们发现把数列写成这种形式可以把不太会的数列加、卷积变成我们熟悉且性质比较好的多项式加、乘。
形式幂级数
我们经常将 \(F(z)\) 简写为 \(F\)。
\(F=\sum\limits_{i=0}^\infin f_iz^i\) 并非是一个多项式,因为它有无穷项。我们把可以有无穷项的多项式叫做幂级数。
我们将用到的是形式幂级数,它和普通幂级数的区别在于:当我们比较两个幂级数的时候,相等的定义是在每个位置的取值都相等;当我们比较两个形式幂级数的时候,相等的定义是每项的系数都相等。
\([z^i]F\) 表示 \(F\) 中 \(z^i\) 项的系数。
举个例子:
前置:我们知道在一些情况下 \(\frac{1}{1-z}=\sum\limits_{i=0}^\infin z^i\)。
函数 \(\frac{1-z}{1-z}\) 不等于任何普通幂级数,因为它在除了 \(1\) 外位置的取值都为 \(1\),而在 \(1\) 位置的取值未定义,所以它不等于 \(1\)。但是形式幂级数 \(\frac{1-z}{1-z}\) 等于 \(1\),因为 \(1-z\) 在形式幂级数意义下存在乘法逆,而此时它的系数仅在 \(0\) 次项为 \(1\),其余项为 \(0\),与 \(1\) 完全相等。
求逆
二者的区别在于,递推一次可以求出前 \(n\) 项,复杂度和 \(n\) 有关,部分分式一次可以求出第 \(n\) 项,复杂度和 \(n\) 无关。
递推
如何求 \(F=\frac{P}{Q}\)?令 \(F\) 的 \(i\) 项系数为 \(f_i\),把原式变形为 \(FQ=P\),提取系数得 \([z^0]FQ=[z^0]P\),即 \(f_0q_0=p_0\),我们也知道了 \(Q\) 存在逆的充分条件是 \(q_0\) 非 \(0\)。假设我们知道了前 \(n-1\) 次项并考虑 \(n\) 次项,\([z^n]FQ=[z^n]P=\sum\limits_{i+j=n} f_iq_j=p_n\),其中涉及的部分只有 \(f_n\) 我们不知道,解方程即可。因为最后它取值的分母是 \(q_0\),并且此外这个式子通用,所以上面那个充分条件同时必要。
部分分式
从另一个角度考虑如何求 \(F=\frac{P}{Q}\)。
当 \(Q=(1-az)^k\) 的时候,\((\frac{1}{(1-az)})^k=(1-az)^{-k}\),用牛顿二项式定理分解它:
于是我们知道了其第 \(i\) 项系数,要求 \(F\) 的第 \(x\) 项系数只取前 \(x\) 项并多项式乘法即可。
设 \(Q=d\prod\limits_i(1-a_iz)^{k_i}\),然后我们不妨令 \(P,Q\) 同时除掉 \(d\),再让 \(P\) 减去可以被整除的部分,即我们把它作一个长除法求出 \(P\bmod Q\),后面加上商项即可。
问题变成了求 \(\frac{P\bmod Q}Q\),我们观察 \(P\bmod Q\) 能不能变换一个形式,我们可以套用 crt,求出每个 \(P\bmod Q\bmod (1-a_iz)^{k_i}\)(根据取模的性质我们知道它就是 \(P\bmod (1-a_iz)^{k_i}\)),再用多项式下的 crt 合并,因为 \((1-a_iz)^{k_i}\) 两两互质,所以最后合并的结果就是 \(P\bmod Q\bmod Q=P\bmod Q\)。
但是这时候我们还要求一个 \(\bmod (1-a_iz)^{k_i}\) 意义下的逆,因为我们会求 \(\frac{P}{Q}\bmod z^{k_i}\)(取模就是直接砍掉后面的系数,所以前面考虑 \(O(k^2)\) 线性递推),换元令 \(x=(1-a_iz)\) 求完再换回去即可。
然后我们合并出来的形式就是:
分子和分母的逆我们都会求系数,于是我们解决了这个问题。
多项式方程
卡特兰数
卡特兰数 \(C_n\) 的意义之一是 \(n\) 个点无标号有根二叉树的个数,区分左右儿子。
我们观察那个卡特兰数很优美的式子:\(C_n=[n=0]+\sum\limits_{i=0}^{n-1} C_iC_{n-i-1}\)。它的组合意义是枚举 \(i\) 为左子树的节点个数。
尝试把它写成生成函数 \(C(z)\) 的形式,先从原式开始:
现在我们得到了一个 \(C\) 的多项式方程。怎么求 \(C\) 的形式呢?我们尝试套用实数的一元二次方程求根公式:\(C=\frac{1-\sqrt{1-4z}}{2z}\)。
直接套用伟大的牛顿二项式定理:
其中 \(x=-4z,\alpha=0.5\)。
你问我怎么证?牛顿也不会。
把它代回去,\(1-\sqrt{1-4z}=4\sum_{k=1}^\infin z^k\frac{1}{k}\binom{2k-3}{k-2}\)。再除以 \(2z\) 得到 \(\sum_{k=0}^\infin z^{k}2\frac{1}{k+1}\binom{2k-1}{k}=\sum_{k=0}^\infin z^{k}\frac{1}{k+1}\binom{2k}{k}\) 于是我们得到了 \(C\) 的通项。
egf
我们考虑令 \(f_n\) 表示 \(n\) 个点,不区分儿子顺序的有标号有根树个数,于是:
我们考察 \(\frac{f_n}{n!}\) 的生成函数 \(F\):
我们称这种考察的形式为 egf。
我们发现后面那个东西和 \(\exp\) 的泰勒展开长得一样啊,这启发我们定义 \(\exp z=\sum\limits_{i=0}^\infty\frac{z^i}{i!}\)。
它的重要性质是,\(\exp\) 的导数等于自己。
怎么定义导数?模仿多项式函数求导:
\[\frac{\mathrm d}{\mathrm dz}(\sum_{i=0}^\infty a_iz^i)=\sum_{i=0}^\infty (i+1)a_{i+1}z^i \]怎么定义积分?模仿多项式函数积分:
\[\int_0^z\sum_{i=0}^\infty a_iz^i\mathrm dz=\sum_{i=1}^\infty \frac{1}{i}a_{i-1}z^i \]
- 为什么上下界长这样?因为它不定积分在 \(z\) 处的取值多了个 \(C\),而在 \(0\) 处只有 \(C\)。
根据上面的例子我们可以得知,如果 \(F\) 是一类有标号组合对象的 \(egf\),那 \(\exp F\) 的组合意义是,把若干个大小任意的 \(F\) 以不区分顺序的方式有标号得凑到一起,其中每个 \(F\) 的标号个数必须等于其对应组合对象的大小。
根据上面的组合意义,我们发现当 \([z^0]F\neq 0\),时 \(\exp F\) 的性质很差,所以我们希望 \(F\) 的常数项为 \(0\),用代数说明就是考虑 \(\exp F\) 的常数项,它的值是 \(e^{[z^0]F}\),当 \([z^0]F\neq0\) 会很难办,但是我也不会严谨说明!!!
根据 \((\exp F)^\prime=F^\prime\exp^\prime F=F^\prime\exp F\) 递推可以求出 \(\exp F\) 的前若干项系数。
考虑当我们已经知道 \(\exp F\) 的前 \(n\) 项:\([z^n](\exp F)^\prime=[z^n](F^\prime\exp F)\),\([z^n](\exp F)^\prime=(n+1)[z^{n+1}]\exp F\),又因为 \([z^n](F^\prime\exp F)\) 只需要我们知道 \(\exp F\) 的前 \(n\) 项,因此我们可以直接推出来。边界情况是根据展开式得到 \([z^0]\exp F=1\)。
未完。

浙公网安备 33010602011771号