多项式全家桶

 引言

众所周知,多项式在OI中是一项很实用的技能,现在将多项式的有关知识总结一下。

前置技能

  1. 认识汉字以及常用的基本词汇,如果此项有问题,请移步这里
  2. 基本数学知识(四则运算,多项式的概念等),如果此项有问题,请移步这里
  3. 一些高中数学知识和高数知识(泰勒展开等),如果此项有问题,请自行学习
  4. FFT、NTT等多项式基本算法

符号及约定

  1. 若不做特殊说明,$n$代指多项式的长度(次数+1)
  2. $[x^i]f(x)$表示多项式$f(x)$的$i$次项系数。
  3. 若不做特殊说明,本文的运算均在$998244353$或其他费马素数的剩余系下的意义进行。

多项式加减法

直接$\mathcal{O}(n)$。

多项式乘法

暴力卷积 $\mathcal{O}(n^2)$。

使用NTT可加速至$\mathcal{O}(n \log n)$

多项式求逆

首先,求逆必须要在$\bmod x^k$的意义下进行。

现在假设我们已知$n$次多项式$f(x)$,现在要求$g(x)$使得$ f(x) \times g(x) \equiv1 \pmod {x^{n+1}} $。

我们使用倍增算法。

假设已知$g_0(x)$使得$f(x) \times g_0(x) \equiv 1 \pmod{x^{\frac{n}{2}}}$,

现在要求$g(x)$使得$f(x) \times g(x) \equiv 1 \pmod{x^n}$。

于是我们得到了$g(x) \equiv 2g_0(x)-g_0^2(x) \pmod{x^{n}}$,就可以倍增了。

倍增起点是$g(x)=1 \pmod{x}$,倍增终点是$k>n$,$k=2^i$,就是我们在倍增时候的那个次数。

复杂度:$T(n)=T(\frac{n}{2})+O(n \log n)$得到最终复杂度为$O(n \log n)$

多项式除法

多项式除法同样是在$\bmod x^k$的意义下进行的。

假设我们现在已知$n$次多项式$f(x)$和$m$次多项式$g(x)$,现在请求出多项式$h(x)$和$r(x)$,满足下列两个条件

  1. $f(x) \equiv g(x) \times h(x) +r(x) \pmod{x^{n+1}}$

  2. $h(x)$的次数为$n-m$,$r(x)$的次数小于$m$

我们来考虑一个操作:

另$g(x)=x^nf(\frac{1}{x})$,则不难发现,其实$g(x)$的系数就是将$f(x)$的系数翻转过来了。

我们设$\hat f(x)=x^n f(\frac{1}{x})$

那么我们不妨这样处理:

于是我们就求出来了$h(x)$,那么显然有$r(x) \equiv f(x) - g(x) \times h(x)$

复杂度显然与多项式求逆一致。

多项式求导

$\mathcal{O}(n)$

多项式积分

$\mathcal{O}(n)$

多项式牛顿迭代

在这个问题中,我们已知函数$f(x)​$,现在要求函数$g(x)​$,使得$f(g(x)) \equiv 0 \pmod{x^{n+1}}​$。

我们考虑倍增,假设我们已经求出了$g_0(x)$使得$f( g_0(x) ) \equiv 0 \pmod{x^{\frac{n}{2}}}$

我们要求$g(x)$使得$f( g(x) ) \equiv 0 \pmod{x^{n}}$

我们在$g_0(x)$出泰勒展开,我们可以得到

由于我们在$\bmod x^{n}$的意义下进行,并且$g(x)-g_0(x)$的只有前$\frac{n}{2}$项不为$0$,

所以从第三项开始的东西都被消去了。

于是得到

就可以了

多项式ln

多项式ln可以看成将多项式带入了麦克劳林级数中。

具体定义是:

也就是说, 我们在计算$\ln f(x)$时,必须满足$[x^0]f(x)=1$。

接下来考虑怎么做。

最后再将$g$积分回去即可。

只需要多项式求逆+多项式求导/积分。

复杂度$O(n \log n)$

多项式exp

多项式exp可以看成将多项式带入了麦克劳林级数中。

具体定义是:

设$g(x)=e^{f(x)}$,两边取对数,得到$\ln g(x)=f(x)$,进一步可得到$ln(g(x))-f(x)=0$

也就是说,我们现在有函数$h(x)=ln(x)-f(z)$,现在要求$g(x)$使得$h(g(x))=0$。

显然有$h’(x)=\frac{1}{x}$,也就是说$h’(g(x))=\frac{1}{g(x)}$。

根据牛顿迭代的理论,这东西显然是要倍增的,并且能够得到递推式

于是就可以递推了。

复杂度$O(n \log n)$

所有代码均可以在这里找到

多项式开根

算法一:$\sqrt{f(x)}=e^{\frac{1}{2} \ln f(x)}$

算法二:牛顿迭代

我们现在要求$g(x)$使得$g^2(x)=f(x)$。

构造函数$h$满足$h(g(x))=g^2(x)-f(x)$,问题转化为了求$g(x)$满足$h(g(x))=0$。

假设我们已经得到了$\pmod {x^\frac{n}{2}}$时的答案$g_0(x)$

直接套用牛顿迭代的式子,我们可以得到

倍增的起点是$n=1$,一般来说,$f(x)$ 的常数项为1或0,否则需要计算二次剩余。