多项式全家桶系列
前置知识
FFT,NTT等数论基础知识
多项式求逆
题意
给定一个多项式$F(x)$,求一个多项式$G(x)$,使得$F(x)G(x) \equiv 1\qquad\mod x^n$
$n \le 10^5$
方法
在处理多项式问题中,二分法是一个很常见的方法
我们假设求出了在模$\lfloor\frac n2\rfloor$上$F(x)$的逆$H(x)$
那么我们有
$$F(x)H(x)\equiv 1\qquad\mod x^{\lfloor\frac n2\rfloor}$$
由题,显然可得
$$F(x)G(x)\equiv 1\qquad\mod x^{\lfloor\frac n2\rfloor}$$
两式相减
$$G(x)-H(x)\equiv 0\qquad\mod x^{\lfloor\frac n2\rfloor}$$
两边平方
$$G^2(x)-2G(x)H(x)+H^2(x)\equiv 0\qquad\mod x^n$$
两边同乘$F(x)$
$$F(x)G^2(x)-2F(x)G(x)H(x)+F(x)H^2(x)\equiv 0\qquad\mod x^n$$
由$G(x)F(x)\equiv 1\qquad\mod x^n$得
$$G(x)-2H(x)+F(x)H^2(x)\equiv 0\qquad\mod x^n$$
即
$$G(x)\equiv 2H(x)-F(x)H^2(x)\qquad\mod x^n$$
边界条件:只剩常数项时所求逆即为该数的逆元。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
上述代码中$a$为原数组,$b$为所求逆,$c$为辅助数组
多项式对数函数
题意
给定多项式$F(x)$,求一个多项式$G(x)$,使得$G(x)\equiv\ln F(x)\qquad\mod x^n$
$n\le 10^5$
方法
设函数$f(x)=\ln(x)$
则我们要求的式子变为
$$G(x)\equiv f(F(x))\qquad\mod x^n$$
两边求导,根据复合函数求导$f(g(x))'=f'(g(x))g'(x)$,得
$$G'(x)\equiv\frac{F'(x)}{F(x)}\qquad\mod x^n$$
对$F(x)$求导得$F'(x)$,求逆得$\frac{1}{F(x)}$,两式相乘得$G'(x)$,再积分则可得$G(x)$
多项式求导
已知$$F(x) = \sum_{i = 0}^{n} a_ix^i$$
则$$F'(x) = \sum_{i=0}^{n-1} a_{i+1}*(i+1)x^i$$
假设$F(x) = 4x^3+5x^2+2x+4$,那么$F'(x)=12x^2+10x+2$
多项式积分
求导的逆运算。
对于$a[i]$,直接乘上$i$的逆元即可。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
多项式exp
题意
给定多项式$F(x)$,求一个多项式$G(x)$,使得$G(x)\equiv e^{F(x)}\qquad\mod x^n$
$n\le 10^5$
方法
过程需要使用牛顿迭代和泰勒展开,因此只给结论
假设我们求得$H(x)$满足
$$H(x)\equiv e^{F(x)}\qquad\mod x^{\lfloor\frac n2\rfloor}$$
则
$$G(x)\equiv H(x)(1-\ln(H(x))+F(x))\qquad\mod x^n$$
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
多项式快速幂
题意
给定多项式$F(x)$与整数$m$,求多项式$G(x)$,使得$G(x)\equiv F^m(x)\qquad\mod x^n$
$n\le 10^5,m\le 10^{10^5}$
方法
$$G(x)\equiv F^m(x)\qquad\mod x^n$$
两边同时取对数,得
$$\ln G(x)\equiv m\ln F(x)\qquad\mod x^n$$
求出$\ln G(x)$后再进行exp即可。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
但是ln与exp默认常数项为$1$,当多项式常数项不为1时需要特殊处理
当常数项为$0$时,需要将多项式平移至常数项不为$0$
若常数项不为$1$,则需要将所有系数同时除以常数项
多项式开根
题意
给定多项式$F(x)$,求多项式$G(x)$,使得$G^2(x)\equiv F(x)\qquad\mod x^n$
$n\le 10^5$
方法
假设$H(x)$满足$$H^2(x)\equiv F(x)\qquad\mod x^{\lfloor\frac n2\rfloor}$$
显然有$$G^2(x)\equiv F(x)\qquad\mod x^{\lfloor\frac n2\rfloor}$$
那么有$$G(x)\equiv H(x)\qquad\mod x^{\lfloor\frac n2\rfloor}$$
把$H(x)$扔过来,两边平方,得$$G^2(x)-2H(x)G(x)+H^2(x)\equiv 0\qquad\mod x^n$$
$$F(x)-2H(x)G(x)+H^2(x)\equiv 0\qquad\mod x^n$$
$$G(x)\equiv \frac{H^2(x)+F(x)}{2H(x)}\qquad\mod x^n$$
边界条件:假设给定多项式的常数项为$x$,我们要找到一个$y$,使$y^2\equiv x \mod 998244353$
二次剩余定理
若$y^2\equiv x\qquad\mod p$,则称$y$是$x$在模$p$意义下的二次剩余
定义勒让德符号
$$ (\frac np)=\left\{ \begin{aligned} x & = 1 \qquad n在模p意义下是二次剩余\\ y & = 0 \qquad p | n \\ z & = -1 \qquad n在模p意义下是二次非剩余 \end{aligned} \right. $$
那么我们有欧拉判别准则
$$(\frac np)\equiv n^{\frac {p-1}2}\qquad\mod p$$
Cipolla算法流程
第一步,判断方程是否有解
第二步,随机找一个$a$,使得数$w=(a^2-x)%p$,且$w$在模$p$意义下为非二次剩余
第三部,找到一个解$y\equiv (a+\sqrt(w)^{\frac{p +1}2})\qquad\mod p$,因为$\sqrt w$不存在,所以将$\sqrt w$当作虚数即可
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
struct cp { int x, y; cp(int xx = 0, int yy = 0) {x = xx, y = yy;} cp operator * (cp A) {return (cp){(A.x * x % Mod + y * A.y % Mod * w % Mod) % Mod, (A.x * y % Mod + A.y * x % Mod) % Mod};} }; int Qpow(cp a, int b) { cp res(1, 0); while(b) { if(b & 1) res = res * a; a = a * a; b >>= 1; } return res.x; } int Calc(int x) { srand(time(0)); if(qpow(x, (Mod - 1) >> 1) == Mod - 1) return -1; while(1) { int a = rand() * rand() % Mod; w = (a * a % Mod - x + Mod) % Mod; if(qpow(w, (Mod - 1) >> 1) == Mod - 1) return Qpow(cp(a, 1), (Mod + 1) >> 1); } } void Sqrt(int len, int *a, int *b) { if(len == 1) { b[0] = Calc(a[0]); b[0] = min(b[0], Mod - b[0]); return; } Sqrt((len + 1) >> 1, a, b); memset(d, 0, sizeof(d)); getinv(len, b, d); getl(len << 1); for(int i = 0; i < len; i++) c[i] = a[i]; for(int i = len; i < lim; i++) c[i] = 0; ntt(b, 1); ntt(d, 1); ntt(c, 1); for(int i = 0; i < lim; i++) b[i] = (b[i] + c[i] * d[i] % Mod) % Mod * qpow(2, Mod - 2) % Mod; ntt(b, -1); for(int i = len; i < lim; i++) b[i] = 0; }