crt&excrt 学习笔记

crt

问题

求解同余方程组 {xa1(modb1)xa2(modb2)xan(modbn),其中 bi 两两互质。

解法

解:设 M=i=1nbi,Mi=MbitiMibi 意义下的乘法逆元。
通解为 kM+i=1naitiMi(kZ)
证明:因为 aitiMiai(modbi),aitiMi0(modbj)
所以有特解 i=1naitiMi,对于每个 i 有:
aitiMi+jiajtjMjai+0(modbi)
因为 M0(modbi),所以通解成立。

实现

	for (int i=1;i<=n;i++)
	{
		m[i]=read(); a[i]=read();
		mul*=m[i];
	}
	for (int i=1;i<=n;i++)
	{
		M[i]=mul/m[i];
		x=0; y=0;
		exgcd(M[i],m[i]);
		ans+=a[i]*M[i]*((x+m[i])%m[i]);
	}

excrt

问题

上方去掉互质的约束。

解法

假设已经求出了前 k 个方程组的解记为 x
M=lcmi=1m1bi
则前 k1 个方程的通解为 x+i×M(iZ)
考虑加入第 k 个方程组,那么就是要求一个正整数 y,使得 x+y×Mak(modbk)
y×Makx(modbk)
然后用 exgcd 求解,若同余式无解则方程无解,否则前 k 个同余式组成的方程的一个解为 xk=x+t×M

实现

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