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