扩展中国剩余定理

参考博客

扩展中国剩余定理:

与中国剩余定理同样,但 m1,m2,,mn 不互质。
我们的思想是想办法实现把两个同余式合成一个,以此类推,将整个同余方程组最后都合并成一个同余式,这样就得到了解。

n=2

{xa1(modm1)xa2(modm2){x=k1m1+a1x=k2m2+a2(kN)

m1k1+a1=m2k2+a2    m1k1m2k2=a2a1

当且仅当 gcd(m1,m2)a2a1 时有解,用 exgcd 求得一组解 (k1,k2) ,带入方程组中得 x=x0

x 的通解为 x=x0+z×lcm(m1,m2)

M=lcm(m1,m2),A=x0 ,则 x=A+z×MxA(modM)

这样就把两个同余式换成了一个同余式,以此类推即可求解。

代码
ll exCRT(ll n){
	ll M=m[1],R=r[1],x,y;
	for(int i=2;i<=n;i++){
		ll a=M,b=m[i],c=((r[i]-R)%b+b)%b;
		ll d=exgcd(a,b,x,y);
		if(c%d) return -1;
		x=ksm(x,c/d,b/d);
		R+=x*M;
		M=a/d*b;
		R=(R%M+M)%M;
	}	
	return (R%M+M)%M;
}

有扩展:若同余式的变量上带系数的考虑。

我们已知前 i1 组同余方程的解是 ans
M=lcm(p1,p2,,pi1),则有前 i1 个方程的通解 ans+Mx,xZ
想得到前 i 组同余方程的解,就是想找到一个 x,满足 bi(ans+Mx)ai(modpi)。移项即 biMxaibians,直接 exgcd 即可。

代码
ll excrt(){
	ll ans=0,lcm=1;
	//b[i]*x\equiv a[i](mod p[i])
	for(int i = 1; i <= n; ++i) {
		A = b[i] * lcm % p[i];
		B = p[i];
		C = (a[i]-b[i]*ans%p[i]+p[i]) % p[i];
		exgcd(A, B, x, y, gcd);
		ll g = B / gcd;
		x = (x % g + g) % g;
		if(C % gcd) return -1;
		ll mod = LCM(lcm, g);
		(ans +=(C/gcd) * x % mod * lcm % mod)%=mod; 
		lcm=mod;
	}
}
posted @   programmingysx  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示