中国剩余定理

中国剩余定理,\(Chinese Remainder Theorem, CRT\),用于求解模数两两互质的一元线性同余方程组。

\(x\equiv a_1(\mod n_1)\)

\(x\equiv a_2(\mod n_2)\)

\(x\equiv a_k(\mod n_k)\)

计算所有模数的积 \(n\).

对于第 \(i\) 个方程,设 \(m_i=\frac{n}{n_i}\),计算 \(m_i^{-1}(\mod n_i)\),设\(c_i=m_im_i^{-1}\),不对 \(n_i\) 取模。

方程组在 \(\mod n\) 下的唯一解为 \(x=\sum_{i=1}^{k}a_ic_i\).

inline int CRT(int k,int a[],int r[]){
    int n=1,ans=0;
    for(int i=1;i<=k;i++)n*=r[i];/*计算所有模数的乘积*/
    for(int i=1;i<=k;i++){
        int m=n/r[i],x,y;/*m mod 其他所有r[i]均为0*/
        exgcd(m,r[i],x,y);/*计算m mod r[i]的逆元x*/
        (ans+=a[i]*m*x%n)%=n;
    }
    return (ans%n+n)%n;
}

证明\(x\equiv a_i(\mod n_i)\).

\(i\not=j\) 时,\(m_j\equiv 0(\mod n_i),c_j\equiv m_j\equiv 0(\mod n_i)\).

\(c_i\equiv m_im_i^{-1}(\mod n_i)\equiv 1(\mod n_i)\).

\(x\equiv \sum_{j=1}^{k}a_jc_j(\mod n_i)\equiv a_ic_i(\mod n_i)\equiv a_i(\mod n_i)\).

扩展中国剩余定理。

用于求解模数不一定互质的一元线性同余方程组。

\(x\equiv a_1(\mod n_1)\)

\(x\equiv a_2(\mod n_2)\)

\(x\equiv a_m(\mod n_m)\)

考虑对于前两个同余方程,\(x=a_1+k_1n_1,x=a_2+k_2n_2\),则有 \(a_1+k_1n_1=a_2+k_2n_2\)\(k_1n_1-k_2n_2=a_2-a_1\).

\(g=gcd(n_1,n_2)\),通过 \(exgcd\) 可以得到通解,\(k_1=k_1+t*\frac{n_2}{g},k_2=k_2-t*\frac{n_1}{g}\).

\(k_1\) 调整到最小正整数解,\((k_1 \mod \frac{n_2}{g}+\frac{n_2}{g})(\mod \frac{n_2}{g})\).

再带入原方程求解得到合并后的 \(x\)\(x=a_1+k_1n_1\).

设前 \(i-1\) 个方程的一个解为 \(x\),设 \(M=\prod_{j=1}^{i-1}n_i\),则有 \(x+j*M\) 为前 \(i-1\) 个方程的通解,考虑加入第 \(i\) 个方程后,要求一个正整数 \(t\) 使得 \(x+t*M\equiv a_i(\mod n_i)\),移项,\(a_i-x\equiv t*M(\mod n_i)\),通过 \(exgcd\) 得到最小正整数 \(t\),则前 \(i\) 个方程的通解为 \(x_i=x+t*M\).

inline int exCRT(int n,int a[],int r[]){
    int ans=a[1]/*上一次合并后的余数*/,m=r[1]/*上一次合并后的模数*/;
    for(int i=2;i<=n;i++){/*进行同余方程的合并*/
        int b=(a[i]-ans%r[i]+r[i])%r[i],x,y,g=exgcd(m,r[i],x,y)/*对新旧方程的模数求exgcd*/,k=r[i]/g;
        if(b%g)return -1;/*判断无解的情况*/
        x=(x*b/g%k+k)%k;/*调整到最小正整数解*/
        ans+=x*m;/*得到前i个方程的解*/
        m*=k;/*合并模数,也就是之前所有模数的lcm*/
        ans=(ans%m+m)%m;
    }
    return (ans%m+m)%m;
}
posted @ 2022-11-20 12:09  半步蒟蒻  阅读(105)  评论(0)    收藏  举报