中國剩餘定理
定義
中國剩餘定理可求解如下形式的一元線性同餘方程組
\( \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\)。
流程
- 計算\(m = \prod_{i=1}^{k} m_i\)
- 對於第\(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\)取模)
- 方程在模\(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 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)\),於是我們可以得到一個同餘方程:
於是我們就可以對整個方程組進行求解。
程式碼
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]);