中国剩余定理

中国剩余定理

定义

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

{xa1 (mod m1)xa2 (mod m2)...xak (mod mk)

其中对于任意ij,都有gcd(mi,mj)=1

流程

  1. 计算m=i=1kmi
  2. 对于第i个方程
    • 计算Mi=mmi
    • 计算Mi在模mi意义下的逆元1Mi
    • 计算ci=Mi×1Mi(不要对mi取模)
  3. 方程在模n意义下的唯一解为x=i=1kaici (mod n)

证明

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

ij是,有 Mj0 (mod mi) ,所以有 cjMj0 ( mod mi)

又有ciMi×(1Mi mod mi)1 (mod mi),所以我们有:

xj=1kajcj  (mod mi)

aici  (mod mi)

aiMi×(1Mi mod mi)  (mod mi)

ai

所以对于任意的xai,上述算法所得到的x总是满足条件。

扩展中国剩余定理

设两个方程分别是是xa1 (mod m1),xa2 (mod m2)

将它们转化为二元不定方程,即x=m1p+a1=m2q+a2,其中p,q是整数,则有m1pm2q=a2a1

由裴蜀定理,得如果a2a1不能被gcd(m1,m2)整除,则无解。

其他情况下,可以使用exgcd求出一组可行的解p0,q0,然后得到p的通解为p0+m2gcd(m1,m2)×t,其中t是整数。

于是x=m1p+a1=m1m2gcd(m1,m2)×t+a1

因为m1m2gcd(m1,m2)=lcm(m1,m2),于是我们可以得到一个同余方程:

xm1p+a1 (mod 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]);
posted @   RYANGSJ  阅读(53)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示