中国剩余定理
中国剩余定理,\(Chinese Remainder Theorem, CRT\),用于求解模数两两互质的一元线性同余方程组。
\(x\equiv a_1(\mod n_1)\)
\(x\equiv a_2(\mod n_2)\)
\(x\equiv a_k(\mod n_k)\)
计算所有模数的积 \(n\).
对于第 \(i\) 个方程,设 \(m_i=\frac{n}{n_i}\),计算 \(m_i^{-1}(\mod n_i)\),设\(c_i=m_im_i^{-1}\),不对 \(n_i\) 取模。
方程组在 \(\mod n\) 下的唯一解为 \(x=\sum_{i=1}^{k}a_ic_i\).
inline int CRT(int k,int a[],int r[]){
int n=1,ans=0;
for(int i=1;i<=k;i++)n*=r[i];/*计算所有模数的乘积*/
for(int i=1;i<=k;i++){
int m=n/r[i],x,y;/*m mod 其他所有r[i]均为0*/
exgcd(m,r[i],x,y);/*计算m mod r[i]的逆元x*/
(ans+=a[i]*m*x%n)%=n;
}
return (ans%n+n)%n;
}
证明\(x\equiv a_i(\mod n_i)\).
当 \(i\not=j\) 时,\(m_j\equiv 0(\mod n_i),c_j\equiv m_j\equiv 0(\mod n_i)\).
\(c_i\equiv m_im_i^{-1}(\mod n_i)\equiv 1(\mod n_i)\).
\(x\equiv \sum_{j=1}^{k}a_jc_j(\mod n_i)\equiv a_ic_i(\mod n_i)\equiv a_i(\mod n_i)\).
扩展中国剩余定理。
用于求解模数不一定互质的一元线性同余方程组。
\(x\equiv a_1(\mod n_1)\)
\(x\equiv a_2(\mod n_2)\)
\(x\equiv a_m(\mod n_m)\)
考虑对于前两个同余方程,\(x=a_1+k_1n_1,x=a_2+k_2n_2\),则有 \(a_1+k_1n_1=a_2+k_2n_2\),\(k_1n_1-k_2n_2=a_2-a_1\).
设 \(g=gcd(n_1,n_2)\),通过 \(exgcd\) 可以得到通解,\(k_1=k_1+t*\frac{n_2}{g},k_2=k_2-t*\frac{n_1}{g}\).
将 \(k_1\) 调整到最小正整数解,\((k_1 \mod \frac{n_2}{g}+\frac{n_2}{g})(\mod \frac{n_2}{g})\).
再带入原方程求解得到合并后的 \(x\),\(x=a_1+k_1n_1\).
设前 \(i-1\) 个方程的一个解为 \(x\),设 \(M=\prod_{j=1}^{i-1}n_i\),则有 \(x+j*M\) 为前 \(i-1\) 个方程的通解,考虑加入第 \(i\) 个方程后,要求一个正整数 \(t\) 使得 \(x+t*M\equiv a_i(\mod n_i)\),移项,\(a_i-x\equiv t*M(\mod n_i)\),通过 \(exgcd\) 得到最小正整数 \(t\),则前 \(i\) 个方程的通解为 \(x_i=x+t*M\).
inline int exCRT(int n,int a[],int r[]){
int ans=a[1]/*上一次合并后的余数*/,m=r[1]/*上一次合并后的模数*/;
for(int i=2;i<=n;i++){/*进行同余方程的合并*/
int b=(a[i]-ans%r[i]+r[i])%r[i],x,y,g=exgcd(m,r[i],x,y)/*对新旧方程的模数求exgcd*/,k=r[i]/g;
if(b%g)return -1;/*判断无解的情况*/
x=(x*b/g%k+k)%k;/*调整到最小正整数解*/
ans+=x*m;/*得到前i个方程的解*/
m*=k;/*合并模数,也就是之前所有模数的lcm*/
ans=(ans%m+m)%m;
}
return (ans%m+m)%m;
}