[模板] 多项式求逆

多项式求逆

作用

\[f(x)g(x)\equiv 1 \mod x^n \]

那么称\(g(x)\)\(f(x)\)的逆元,也记作\(f^{-1}(x)\)。若\(\deg f^{-1} < n\),则\(f^{-1}\)唯一。

实现

进行一些简单的导的推:

\(f^{-1}_0\)\(x^{\lceil \frac{n}{2} \rceil}\)\(f\)的逆元,已经被计算出来。注意这里\(f^{-1}_0\)\(\lceil \frac{n}{2}\rceil-1\)度的多项式,而\(f\)是原多项式,\(\deg f \ge \frac{n}{2}\)。有:

\[f^{-1}_0f\equiv1 \mod x^{\lceil \frac{n}{2} \rceil} \]

\(f^{-1}\)\(f\)的逆元,有

\[f^{-1}f\equiv1 \mod x^{\lceil \frac{n}{2} \rceil} \]

两式相减,有

\[f_0^{-1}-f^{-1}\equiv 0 \mod x^{\lceil \frac{n}{2} \rceil} \]

平方有

\[\begin{aligned} (f_0^{-1}-f^{-1})^2 &\equiv 0 \mod x^n \\ f_0^{-2}+f^{-2}-2f_0^{-1}f^{-1}&\equiv0 \mod x^n \end{aligned} \]

两端乘以\(f\),注意这里是\(\mod x^n\),故\(f_0^{-1}f \neq 1\),而\(f^{-1}f\equiv 1\),有

\[\begin{aligned} ff_0^{-2}+ff^{-2}-2ff_0^{-1}f^{-1} &\equiv0 &\mod x^n \\ ff_0^{-2}+f^{-1}-2f_0^{-1}&\equiv0 &\mod x^n \\ f^{-1}&\equiv f_0^{-1}(2-ff_0^{-1})&\mod x^n \\ \end{aligned} \]

这样就算出了模\(x^n\)下的逆元\(f^-1\),递归算下去。\(ff_0^{-1}\)直接使用ntt或fft,时间复杂度\(T(n)=T(\frac{n}{2})+O(n\log n)=O(n\log n)\)

实现中,把\(n\)扩大成2的幂次,方便计算。事实上不用也可。

ll f[N], rf[N]; // 临时
void solve(int len, ll x[], ll y[]) { // 求逆,y=x^-1, len=2^k
    if(len == 1) {
        y[0] = x[0];
        return ;
    }
    solve(len >> 1, x, y);
    for(int i = 0 ;i < (len << 1); i++) {
        f[i] = rf[i] = 0;
    }
    for(int i = 0; i < len / 2; i++) {
        rf[i] = y[i];
    }
    for(int i = 0; i < len; i++) {
        f[i] = x[i];
    }
    ntt(f, len << 1, 1);
    ntt(rf, len << 1, 1);
    for(int i = 0; i < (len << 1); i++) {
        rf[i] = rf[i] * (2 - rf[i] * f[i] % M + M) % M;
    }
    ntt(rf, len << 1, -1);
    for(int i = 0; i < len; i++) y[i] = rf[i];
}

例题

分治 FFT(多项式求逆,分治fft)

posted @ 2021-09-28 23:35  limil  阅读(81)  评论(0编辑  收藏  举报