多项式
多项式
不太规范
下文中 \(F(x)\) 均表示一个已知的多项式
\([x^i]F(x)\) 表示 \(F(x)\) 中 \(x^i\) 的系数
\(n\) 表示多项式 \(F(x)\) 的长度,如果有长度不同且未知的,用 \(|G(x)|\) 表示 \(G(x)\) 的阶数
默认使用 \(NTT\),模数为质数 \(p\)
板子
乘法
就是 \(\operatorname{FFT}\) 和 \(\operatorname{NTT}\)
求逆
只能在模意义下求,设
\[G(x)\equiv \frac{1}{F(x)}\pmod {x^n} \]直接求不是很能做,考虑倍增
\[H(x)\equiv \frac{1}{F(x)} \pmod {x^{\frac n2}} \]移项得到
\[F(x)(G(x)-H(x))\equiv 0\pmod {x^{\frac n2}} \]两边同乘 \(H(x)\)
\[G(x)-H(x)\equiv0\pmod {x^{\frac n2}} \]平方可以将模数也平方
\[G^2(x)+H^2(x)-2G(x)H(x)\equiv0\pmod {x^n} \]两边同乘 \(F(x)\) 以消去平方项
\[G(x)\equiv 2H(x)-F(x)H^2(x)\pmod {x^n} \]求 \(G(x)\) 转化为求 \(H(x)\),倍增即可
复杂度
\[\begin{aligned} T(n)&=T(\frac n2)+O(n\log n)\\ T(n)&=O(n\log n) \end{aligned} \]求导&积分
直接对每一项求即可,就是
\[\sum a_ix^i\leftrightarrow \sum ia_{i}x^{i-1} \]从右到左是积分,反过去是求导
注意积分不能得到常数项,最好是取 \(x=0\) 解一下常数项,但如果不能这样做就只有取一个合法的 \(x\) \(O(n)\) 求常数项了。(不过一般的题目对于常数项会有特殊约束,比如一定是 \(0\) 之类的)
开根
求 \(G^2(x)=F(x)\pmod {x^n}\)
先看 \([x^0]F(x)\) 是不是 \(1\),如果是 \(0\) 显然可以约掉最末几项,否则就判断是不是二次剩余,最后乘回来就可以了
现在,我们得到 \([x^0]F(x)=1\),还是考虑倍增
\[\begin{aligned} G^2(x)&\equiv F(x)\pmod {x^n}\\ H^2(x)&\equiv F(x)\pmod {x^{\frac n2}} \end{aligned} \]与求逆一样的做法
\[\begin{aligned} (H^2(x)-F(x))^2&\equiv 0\pmod {x^n}\\ (H^2(x)+F(x))^2&\equiv 4H^2(x)F(x)\pmod {x^n}\\ (\frac{H^2(x)+F(x)}{2H(x)})^2&\equiv F(x)\pmod {x^n}\\ &\equiv G^2(x)\pmod {x^n} \end{aligned} \]于是显然有
\[G(x)\equiv \frac{H^2(x)+F(x)}{2H(x)}\pmod {x^n} \]牛顿迭代
求 \(F(G(x))\equiv 0\pmod {x^n}\)
首先需要知道
仍然考虑倍增,设
\[\begin{aligned} F(G(x))&\equiv 0\pmod {x^n}\\ F(H(X))&\equiv 0\pmod {x^{\frac n2}} \end{aligned} \]我们知道
\[F(x)\equiv F(y)\pmod {(x-y)} \]于是
\[\begin{aligned} F(G(x))&\equiv F(H(x))\pmod {(G(x)-H(x))}\\ F(G(x))&\equiv F(H(x))\equiv 0\pmod {x^{\frac n2}} \end{aligned} \]因为 \(|H(x)|=\frac n2\),所以
\[G(x)-H(x)\equiv 0\pmod {x^{\frac n2}} \]考虑把 \(F(G(x))\) 在 \(F(H(x))\) 处泰勒展开
\[F(G(x))=\sum_{i=0}^{+\infty}F^{(i)}(H(x))\frac{(G(x)-H(x))^i}{i!} \]注意到
\[(G(x)-H(x))^2\equiv 0\pmod {x^n} \]于是只需要取泰勒展开的前两项
\[F(G(x))\equiv F(H(x))+F^\prime(H(x))(G(x)-H(x))\pmod {x^n} \]因为
\[F(G(x))\equiv0\pmod {x^n} \]所以
\[G(x)\equiv -\frac{F(H(x))}{F^\prime(H(x))}+H(x)\pmod {x^n} \]首先,对于 \(n=1\) 的情况,需要求出 \(F(G_0(x))\) 和 \(G_0(x)\)
这是容易求得的,之后反过来倍增就可以了
复杂度 \(O(n\log n)\)
反函数
求 \(F^{-1}(F(x))\equiv1\pmod {x^n}\)
用反函数求导法则
\[(F^{-1}(x))^\prime F^\prime(x)\equiv 1\pmod {x^{n-1}} \]求逆即可,最后积分回来,常数项是逆元
ln&exp
求 \(\ln F(x)\)
还是在模意义下的
\[G(x)\equiv \ln F(x)\pmod {x^n} \]两边同时求导得
\[G^\prime(x)\equiv \frac{F^\prime(x)}{F(x)}\pmod {x^{n-1}} \]显然可以求出,然后积回来,常数项一般不用管,要看一下的话就用麦克劳林公式判一下 \(x=0\) 的情况
求 \(e^{F(x)}\)
依然是倍增,假设 \(G_0(x)\) 是 \(\bmod x^{\frac n2}\) 时的答案,\(n=1\) 的情形显然容易求出,就是 \(0\)
\[G(x)\equiv e^{F(x)}\pmod {x^n} \]考虑变换为关于 \(G(x)\) 的函数
\[\begin{aligned} H(A(x))&=\ln A(x)-F(x)\\ H(G(x))&\equiv 0\pmod {x^n} \end{aligned} \]因为 \(H(A(x))\) 是关于 \(A(x)\) 的函数,而 \(F(x)\) 与 \(A(x)\) 无关,所有求导的时候 \(F(x)\) 是常数
然后套用牛顿迭代的公式就有
\[G(x)=\frac{G_0(x)(1-\ln G_0(x)+F(x))}{G_0^\prime(x)} \]没有操作的复杂度超过乘法,还是 \(O(n\log n)\)
快速幂
\[G(x)=F^k(x)=e^{k\ln F(x)} \]求 \(F^k(x)\)
然后就做完了,不过需要保证 \([x^0]F(x)=1\) 这个容易转化
不过有一个很重要的细节,\(k\) 不应该对于 \(\varphi(p)\) 取模,而是关于 \(p\) 取模
可以规约为
\[F^p(x)\equiv F(x^p)\pmod p \]然后数归就可以了
Trick
Bostan-Mori
求 \([x^n]\frac{F(x)}{G(x)}\)
首先,对于任意 \(F(x)\)
存在
\[H(x^2)=F(x)F(-x) \] \[F(x)=\sum a_ix^i \] \[\begin{aligned} F(x)F(-x)&=(\sum a_ix^i)(\sum (-1)^ia_ix^i)\\ &=\sum_k(\sum_{i}a_ia_{k-i}(-1)^i)x^k \end{aligned} \]如果 \(k\) 是奇数,那么容易说明
\[\sum_{i}a_ia_{k-i}(-1)^i=0 \]要求 \([x^n]\frac{F(x)}{G(x)}\),就是求 \([x^n]\frac{F(x)G(-x)}{G(x)G(-x)}\)
把分子按奇偶拆开,得到
\[\frac{F(x)G(-x)}{G(x)G(-x)}=\frac{P(x^2)+xQ(x^2)}{H(x^2)} \]看 \(n\) 的奇偶判断取 \(P\) 或 \(Q\)
复杂度显然也是 \(O(n\log n)\)
可以用来优化数列递推
如果递推式形如
\[x_{n}=\sum_{i=1}^ma_{i}x_{n-i} \]那么用矩阵快速幂容易做到 \(O(m^3\log n)\)
但可以求其生成函数
\[F(x)x^m=\sum_{i=1}^ma_{i}x^{m-i}F(x) \]然后发现,一定是如下形式
\[F(x)=\frac{1}{1-A(x)} \]套用之前的做法就可以 \(O(m\log m\log n)\) 求 \(x_n\) 了