多项式求逆
作用
[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];
}