中国剩余定理

中国剩余定理

定义

中国剩余定理可求解如下形式的一元线性同余方程组

\( \left\{ \begin{aligned} & x \equiv a_1 \ (mod \ m_1)\\ & x \equiv a_2 \ (mod \ m_2)\\ & ... \\ & x \equiv a_k \ (mod \ m_k) \end{aligned} \right. \)

其中对于任意\(i \ne j\),都有\(gcd(m_i,m_j)=1\)

流程

  1. 计算\(m = \prod_{i=1}^{k} m_i\)
  2. 对于第\(i\)个方程
    • 计算\(M_i = \frac{m}{m_i}\)
    • 计算\(M_i\)在模\(m_i\)意义下的逆元\(\frac{1}{M_i}\)
    • 计算\(c_i=M_i \times \frac{1}{M_i}\)(不要对\(m_i\)取模)
  3. 方程在模\(n\)意义下的唯一解为\(x=\sum_{i=1}^ka_ic_i \ (mod \ n)\)

证明

下面证明上述算法所得到的\(x\)是同余方程组的解:

当$i \ne j \(是,有\)M_j \equiv 0 \ (mod \ m_i)\(,所以有\)c_j \equiv M_j \equiv 0 \ (\ mod \ m_i)$。

又有\(c_i \equiv M_i \times (\frac{1}{M_i} \ mod \ m_i) \equiv 1 \ (mod \ m_i)\),所以我们有:

\[x \equiv \sum_{j=1}^{k}a_jc_j \ \ (mod \ m_i) \]

\[\equiv a_ic_i \ \ (mod \ m_i) \]

\[\equiv a_iM_i \times (\frac{1}{M_i} \ mod \ m_i) \ \ (mod \ m_i) \]

\[\equiv a_i \]

所以对于任意的\(x \equiv a_i\),上述算法所得到的\(x\)总是满足条件。

扩展中国剩余定理

设两个方程分别是是\(x \equiv a_1 \ (mod \ m_1), x \equiv a_2 \ (mod \ m_2)\)

将它们转化为二元不定方程,即\(x=m_1p+a_1=m_2q+a_2\),其中\(p,q\)是整数,则有\(m_1p-m_2q=a_2-a_1\)

由裴蜀定理,得如果\(a_2-a_1\)不能被\(gcd(m_1,m_2)\)整除,则无解。

其他情况下,可以使用\(exgcd\)求出一组可行的解\(p_0,q_0\),然后得到\(p\)的通解为\(p_0 +\frac{m_2}{gcd(m1,m2)} \times t\),其中t是整数。

于是\(x=m_1p+a_1=\frac{m_1m_2}{gcd(m1,m2)} \times t+a_1\)

因为\(\frac{m_1m_2}{gcd(m1,m2)}=lcm(m1,m2)\),于是我们可以得到一个同余方程:

\[x \equiv m_1p+a_1 \ (mod \ lcm(m_1,m_2)) \]

于是我们就可以对整个方程组进行求解。

代码

for(int i=2;i<=n;i++){
	int A=m[i-1],B=m[i],c=a[i]-a[i-1];
	c=(c%A+A)%A;
	int d=exgcd(m[i-1],m[i],x,y);
	x*=(c/d);	
	x=(x%(-B/d)+(-B/d))%(-B/d);
	a[i]=A*x+a[i-1];
	m[i]=A/d*B;
	a[i]=(a[i]%m[i]+m[i]%m[i]);
}
write((a[n]%m[n]+m[n])%m[n]);
posted @ 2024-07-23 01:01  RYANGSJ  阅读(1)  评论(0编辑  收藏  举报