多项式全家桶系列

前置知识

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$$

边界条件:只剩常数项时所求逆即为该数的逆元。

getinv

 上述代码中$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$的逆元即可。

View Code

 多项式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$$

View Code

多项式快速幂

题意

给定多项式$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即可。

View Code

但是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$当作虚数即可

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;
}
View Code

 

posted @ 2020-07-22 10:53  verjun  阅读(218)  评论(0编辑  收藏  举报