中国剩余定理

中国剩余定理

概念

求解关于 \(x\) 的一元线性同余方程组:

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

其中 \(m_1,m_2,m_3 \dots m_n\) 两两互质。

解为 \(x=\sum\limits_{i=1}^na_i\frac{M}{m_i}t_i\),其中 \(M=\prod\limits^n_{i=1}m_i,\frac{M}{m_i}t_i\equiv 1 \pmod{m_i}\),即 \(t_i\)\(\frac{M}{m_i}\) 在模 \(m_i\) 意义下的逆元。

证明

\(m_i \mid M\),得:

\[\large\forall\ k \not = i,\ a_k\frac{M}{m_k}t_k\equiv0 \pmod{m_i} \]

\(\frac{M}{m_i}t_i\equiv1({\rm mod}\ m_i)\),得:

\[\large a_i\frac{M}{m_i}t_i \equiv a_i \pmod{m_i} \]

所以得证 \(x=\sum\limits_{i=1}^na_i\frac{M}{m_i}t_i\)

通解为 \(x+k \times M\left(k \in Z \right)\)。注意计算 \(\frac{M}{m_i}t_i\) 时,不要对 \(m_i\) 取模。

ll crt()
{
    ll ans=0,M=1;
    for(int i=1;i<=n;++i) M*=m[i];
    for(int i=1;i<=n;++i)
    {
        exgcd(M/m[i],m[i]);
        x=(x%m[i]+m[i])%m[i];
        ans=(ans+a[i]*M/m[i]*x)%M;
    }
    return ans;
}

扩展中国剩余定理

概念

求解关于 \(x\) 的一元线性同余方程组:

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

其中 \(m_1,m_2,m_3 \dots m_n\) 不保证两两互质。

因为不保证两两互质,所以 \(\frac{M}{m_i}\) 在模 \(m_i\) 意义下不一定存在逆元,不能直接做。

考虑为两个方程的情况:

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

写成不定方程的形式,得:

\[\large x=a_1+m_1t_1=a_2+m_2t_2 \]

再进行转化,得:

\[\large m_1t_1-m_2t_2=a_2-a_1 \]

由裴蜀定理得,当 \(\gcd(m_1,m_2) \not \mid a_2-a_1\) 时,方程无解。有解时可通过 \(exgcd\) 算出一组可行解,得原方程组的解为 \(x \equiv m_1t_1+a_1 \pmod{ \operatorname{lcm}(m_1,m_2) }\)

多个方程时就两两合并即可。

ll excrt()
{
    ll ans=a[1],M=m[1];
    for(int i=2;i<=n;++i)
    {
        ll g=exgcd(M,m[i]),tmp=((a[i]-ans)%m[i]+m[i])%m[i];
        if(tmp%g!=0) return -1;
        ans+=mul(x,tmp/g,m[i])*M,M*=m[i]/g,ans=(ans%M+M)%M;
    }
    return ans;
}
posted @ 2020-01-22 21:07  lhm_liu  阅读(248)  评论(0编辑  收藏  举报