浅谈CRT&exCRT

CRT

求解同余方程组:

\[\begin{cases} x \equiv a_1 \pmod{m_1}\ x \equiv a_2 \pmod{m_2}\ \quad\vdots\ x \equiv a_n \pmod{m_n} \end{cases} \]

条件:\(m_1,m_2,\dots,m_n\) 两两互质

设 \(M=\prod m_i\),\(M_i = \dfrac{M}{m_i}\)
求 \(t_i\) 满足 \(M_i\cdot t_i \equiv 1 \pmod{m_i}\)(\(t_i\) 是 \(M_i\) 在模 \(m_i\) 的逆元,exgcd求)

通解:

\[x = \sum_{i=1}^n a_i M_i t_i \pmod{M} \]

最小正整数解就是结果,通解 \(x + kM,\ k\in\mathbb Z\)


exCRT

合并两个同余式:

\[\begin{cases} x\equiv a_1 \pmod{m_1}\ x\equiv a_2 \pmod{m_2} \end{cases} \]

写成:

\[x = a_1 + k\cdot m_1 \]

代入第二个式子:

\[a_1 + k m_1 \equiv a_2 \pmod{m_2} \]

\[m_1\cdot k \equiv a_2-a_1 \pmod{m_2} \]

这是关于 \(k\) 的一元一次同余方程,用 exgcd 求解。

令 \(d=\gcd(m_1,m_2),\ c=a_2-a_1\)

  • 若 \(d\nmid c\):方程组无解

  • 若 \(d\mid c\):求出 \(k\) 的最小正特解 \(k_0\)

合并后的新同余方程:

\[x \equiv a_1 + k_0 m_1 \pmod{\text{lcm}(m_1,m_2)} \]

其中 \(\text{lcm}(m_1,m_2)=\dfrac{m_1m_2}{d}\)

不断两两合并,最终得到整个方程组的解。

模版

typedef long long ll;
ll exgcd(ll a,ll b,ll &x,ll &y){
    if(!b){x=1;y=0;return a;}
    ll d=exgcd(b,a%b,y,x);
    y-=a/b*x;
    return d;
}
ll exCRT(vector<ll>&a,vector<ll>&m){
    ll res=a[0],M=m[0];
    for(int i=1;i<a.size();i++){
        ll c=a[i]-res,x,y;
        ll d=exgcd(M,m[i],x,y);
        if(c%d) return -1;
        ll tmp=m[i]/d;
        ll k=( (__int128)x*(c/d)%tmp + tmp )%tmp;
        res += (__int128)M * k;
        M = (__int128)M / d * m[i];
        res = (res%M+M)%M;
    }
    return res;
}
posted @ 2026-10-03 17:52  axiom  阅读(5)  评论(0)    收藏  举报
/* 设置动态特效 */