形式幂级数实用方法
既然是实用,本篇文章不包含以 FFT 为核心的多项式技术。
要使用形式幂级数解决问题,我们最关心的无非三点:
- 怎么用形式幂级数描述问题。
- 怎么用形式幂级数推导。
- 怎么从形式幂级数中得到答案。
其中第一点,有组合问题符号化方法来帮助我们,所以暂时不讨论(其实是我还没学会)。
第二点,主要利用的是卷积的性质列出方程,然后解方程,这里大多可以手算,手算不行的还是考虑 FFT 吧。
第三点。所谓从形式幂级数中得到答案,就是算出其系数,而这又分两种情况:
- 算出前 \(n\) 项系数。
- 算出远处 \(1\) 项系数。
我们有不用 FFT 的方法来做这两类问题,遗憾的是这两类问题大多都可以使用 FFT 做到更优。
对于第一类问题,我们有 \(O(n^2)\) 递推的多项式卷积、求逆、\(\exp\)、\(\ln\)。
对于第二类问题,又分几类问题:
- 可以直接展开的情况。
- 有理分式的情况。
- 其他情况。
第零类问题,直接展开就好了。
第一类问题,可以使用部分分式法直接求出通项,然后使用快速幂。如果不想这么搞可以写一个矩阵快速幂,因为有理分式的系数是一个线性递推数列,阶数为分母多项式的阶。
第二类问题,可以尝试使用拉格朗日反演来解决,看看能不能变成第一类问题。
好吧上面说的那些东西都是泛泛而谈,下面详细来讲解一下。
首先需要介绍一些经常用到的记号数学工具。
常用记号
- \([z^n]F(z)\):提取 \(F(z)\) 的 \(z^n\) 项系数。
- \(\binom{n}{m}\):二项式系数。
- \(n^{\underline{m}}\):下降幂。
- \(\frac{\mathrm{d}}{\mathrm{d}x}F(x)\):对 \(F(x)\) 关于 \(x\) 求导。又写作 \(F^{'}(x)\)
- \(\int F(x)\mathrm{d}x\):对 \(F(x)\) 关于 \(x\) 不定积分。
部分分式法
给定一个有理分式 \(\displaystyle\frac{P(x)}{Q(x)}\),将其分解为一些较简分式的和。
方法自己上网搜。
二项式系数
\(n\) 个物品里选 \(m\) 个的方案数:
为什么是这个呢,考虑乘法原理,相当于每一项可以选 \(1\) 或者 \(z\),提取 \(z^m\) 系数就相当于算有多少种方法选了 \(m\) 个 \(z\)。
这里就懒得讲那些公式了。
广义二项式系数:
其中 \(\alpha\in\mathbb{R}\)。
证明用数学分析相关知识搞一下,我也没学过我就不误人子弟了。
超几何级数
还没搞。
形式幂级数初步
一个形式幂级数有两种形态,封闭形式和展开形式。
从封闭形式变成展开形式就是在 \(0\) 处的泰勒展开。
从展开形式变成封闭形式需要动点脑子。其实你背背这个表就行:
封闭形式 | 展开形式 |
---|---|
有限项的多项式 | 有限项的多项式 |
\(\frac{1}{1-cz}\) | \(\sum_{i=0}^{\infin}z^ic^i\) |
\((1+z)^m\) | \(\sum_{i=0}^{\infin}z^i\binom{m}{i}\) |
\(\frac{1}{(1-z)^{m}}\) | \(\sum_{i=0}^{\infin}z^i\binom{m+i-1}{m}\) |
\(\ln\frac{1}{1-z}\) | \(\sum_{i=0}^{\infin}z^i\frac{1}{i}\) |
\(e^z\) | \(\sum_{i=0}^{\infin}z^i\frac{1}{i!}\) |
现在我们来定义形式幂级数的各种运算。
加减乘,求导积分,复合,直接把形式幂级数当做多项式做就行,两个形式幂级数做这些运算之后还是形式幂级数。容易验证求导积分的那些方法在形式幂级数中仍然生效。
除法呢?这相当于我们在探讨一个形式幂级数有乘法逆的充要条件。
如果说 \(F\) 存在乘法逆 \(G\),那么就是说:
两边提取 \(z^n\) 系数:
考察我们该怎么算出来 \(G\) 的 \(n\) 次系数。根据上面的式子,如果我们知道了 \(G\) 的前 \(n-1\) 次系数,配合 \(F\) 的系数就能递推出 \([z^n]G\)。唯一的坑点在于求 \([z^0]G\) 时,如果 \([z^0]F=0\),那么不存在一个数 \(x\) 使得 \(0\times x=1\),所以也就不存在这样的 \(G\)。
综上所述,如果 \([z^0]F\neq 0\),那么 \(F\) 存在乘法逆,否则不存在。
然而我们还可以对形式幂级数求 \(\exp\) 和 \(\ln\),不过这都是后话了。
有理分式与线性递推
现在我们来探讨一类重要的形式幂级数:有理分式。
所谓有理分式就是 \(\frac{P(z)}{Q(z)}\),其中 \(P,Q\) 为多项式。
我们可以将其看做 \(P(z)\) 与 \(Q(z)\) 的乘法逆的卷积,于是使用朴素多项式求逆和卷积可以做到 \(O(n^2)\) 求出前 \(n\) 项系数。
现在我们要快速求出远处一项系数 \([z^n]\frac{P(z)}{Q(z)}\) 呢?不妨还是先求出 \(\frac{1}{Q(z)}\) 的后 \(n-\deg P\sim n\) 项系数,再与 \(P(z)\) 进行卷积求出 \([z^n]\) 系数。
考察上面我们刚推的多项式求逆递推式,发现其递推阶数是 \(\deg Q\) 量级。于是可以矩阵乘法加速递推做到 \(O(\max\{\deg P,\deg Q\}^3\log n)\) 求远处一项系数。
更进一步地,使用部分分式法分解 \(\frac{1}{Q(z)}\),然后给每一项提取系数可以直接求出通项。
拓展学习:BM 递推,可以在 \(O(\deg \log\deg\log n)\) 的时间内求出一项系数。