多项式乘法逆

问题:

给定一个多项式 \(F(x)\) ,请求出一个多项式 \(G(x)\), 满足 \(F(x) * G(x) \equiv 1 \pmod{x^n}\)。系数对 \(998244353\) 取模。

考虑分治,假设我们已经求出多项式 \(F(x)\)\(\bmod x^{\lceil \frac{n}{2}\rceil}\) 时的逆 \(G'(x)\)

有:

\[F(x)*G'(x)\equiv 1(\bmod x^{\lceil \frac{n}{2}\rceil}) \]

\[F(x)*G(x)\equiv 1(\bmod x^{\lceil \frac{n}{2}\rceil}) \]

即:

\[G(x)-G'(x)\equiv 0(\bmod x^{\lceil \frac{n}{2}\rceil}) \]

平方得:

\[(G(x)-G'(x))^2\equiv 0(\bmod x^{n}) \]

\[G(x)^2-2G(x)G'(x)+G'(x)^2\equiv 0(\bmod x^{n}) \]

\[G(x)-2G'(x)+F(x)G'(x)^2\equiv 0(\bmod x^{n}) \]

\[G(x)\equiv 2G'(x)-F(x)G'(x)^2(\bmod x^{n}) \]

因为 \(F(x)*G'(x)\equiv 1(\bmod x^{\lceil \frac{n}{2}\rceil})\),所以 \(G'\)\(x^{t}\) 项的系数为 \(0\)\(t\ge\lceil \frac{n}{2}\rceil\)),\(G(x)-G'(x)\)\(x^{t}\) 项的系数为 \(0\)\(0<t<\lceil \frac{n}{2}\rceil\)),所以 \((G(x)-G'(x))^2\equiv 0(\bmod x^{n})\) 成立。

Code:

LL X[N],Y[N];
void Mul(LL* a,LL* b,LL* c,LL n,LL m,LL lim){
    LL Len=1;while(Len<=(n+m+1))Len<<=1;
    for(int i=0;i<=Len;i++)X[i]=Y[i]=0;
    for(int i=0;i<n;i++)X[i]=a[i];
    for(int i=0;i<m;i++)Y[i]=b[i];
    NTT(X,Len,0),NTT(Y,Len,0);
    for(int i=0;i<Len;i++)X[i]=X[i]*Y[i]%mo;
    NTT(X,Len,1);
    for(int i=0;i<lim;i++)c[i]=X[i];
}
LL Use[N];
void PolyInv(LL* a,LL* Inv,LL n){
    if(n==1){Inv[0]=ksm(a[0]);return;}
    LL m=n+1>>1;PolyInv(a,Inv,m);
    Mul(Inv,Inv,Use,m,m,n);
    Mul(Use,a,Use,n,n,n);
    for(int i=0;i<n;i++)
        Inv[i]=(2ll*Inv[i]%mo-Use[i]+mo)%mo;
}
posted @ 2023-08-24 14:08  fzrcy  阅读(49)  评论(0)    收藏  举报