[模板] 多项式求逆

多项式求逆

作用

[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} ceil})(f)的逆元,已经被计算出来。注意这里(f^{-1}_0)(lceil frac{n}{2} ceil-1)度的多项式,而(f)是原多项式,(deg f ge frac{n}{2})。有:

[f^{-1}_0fequiv1 mod x^{lceil frac{n}{2} ceil} ]

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

[f^{-1}fequiv1 mod x^{lceil frac{n}{2} ceil} ]

两式相减,有

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

平方有

[egin{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 eq 1),而(f^{-1}fequiv 1),有

[egin{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(nlog n)=O(nlog 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)

原文地址:https://www.cnblogs.com/limil/p/15350714.html