中國剩餘定理

RYANGSJ發表於2024-07-23

中國剩餘定理

定義

中國剩餘定理可求解如下形式的一元線性同餘方程組

\( \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]);

相關文章