中国剩余定理

中国剩余定理,ChineseRemainderTheorem,CRT,用于求解模数两两互质的一元线性同余方程组。

xa1(modn1)

xa2(modn2)

xak(modnk)

计算所有模数的积 n.

对于第 i 个方程,设 mi=nni,计算 mi1(modni),设ci=mimi1,不对 ni 取模。

方程组在 modn 下的唯一解为 x=i=1kaici.

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;
}

证明xai(modni).

ij 时,mj0(modni),cjmj0(modni).

cimimi1(modni)1(modni).

xj=1kajcj(modni)aici(modni)ai(modni).

扩展中国剩余定理。

用于求解模数不一定互质的一元线性同余方程组。

xa1(modn1)

xa2(modn2)

xam(modnm)

考虑对于前两个同余方程,x=a1+k1n1,x=a2+k2n2,则有 a1+k1n1=a2+k2n2k1n1k2n2=a2a1.

g=gcd(n1,n2),通过 exgcd 可以得到通解,k1=k1+tn2g,k2=k2tn1g.

k1 调整到最小正整数解,(k1modn2g+n2g)(modn2g).

再带入原方程求解得到合并后的 xx=a1+k1n1.

设前 i1 个方程的一个解为 x,设 M=j=1i1ni,则有 x+jM 为前 i1 个方程的通解,考虑加入第 i 个方程后,要求一个正整数 t 使得 x+tMai(modni),移项,aixtM(modni),通过 exgcd 得到最小正整数 t,则前 i 个方程的通解为 xi=x+tM.

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;
}
posted @   半步蒟蒻  阅读(93)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示