扩展欧几里得算法、ax+by=c求解、ax≡c(mod m)、逆元求解、(b/a)%m计算c++代码

本文详细介绍了扩展欧几里得算法,包括求解线性方程ax+by=gcd(a,b)的方法,全部解的形式,以及如何找到最小非负整数解。此外,还讨论了该算法在求解同余式、逆元计算和(b/a)%m运算中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考

《算法笔记》(胡凡)


扩展欧几里得算法

求解ax+ by = gcd(a, b)

int exGcd(int a, int b, int &x, int &y) {
	if (b == 0) {
		x = 1;
		y = 0;
		return a;
	}
	int gcd = exGcd(b, a % b, x, y);
	int tmp = x;
	x = y;
	y = tmp - (a / b) * y;
	return gcd;
}

全部解: x' = x + b / gcd * K   (K为任意整数)

                y' = y - a / gcd * K

x的最小非负整数解:(x % (b / gcd)  + (b / gcd)) % (b / gcd)


 方程ax + by = c求解

ax + by = c存在解的充要条件是c % gcd = 0

其中一组解为(x0, y0) = (cx / gcd, cy / gcd),x、y即为上面代码求出的ax + by = gcd的解

全部解:x' = cx / gcd + b / gcd * K (K为任意整数)

               y' = cy / gcd - a / gcd * K


同余式ax ≡ c (mod m)求解

等价于求解ax + my = c,c % gcd(a,m) = 0时才有解,先求ax + my = gcd(a,m),得到(x,y),进而按照公式得到ax + my = c中x的全部解:x' = cx / gcd + m / gcd * K (K为任意整数),当K取0、1、2...、gcd(a,m) - 1时所得到的解在模m意义下是不同的


逆元的求解

乘法逆元:ab ≡ 1 (mod m)成立,则称a和b互为模m的逆元

gcd(a,m) = 1则有解,取最小非负整数解(x % m + m) % m为逆元

另外,如果符合费马小定理,可以使用该定理

费马小定理:设m是素数,a是任意整数且a不为m的整数倍,则a ^ (m - 1) ≡ 1(mod m)。

即a ^ (m - 2) % m即为逆元,用快速幂求解


(b / a) % m的计算

转换为(b * x) % m,x为a模m的逆元,此时b可以已经取过模,不是原始值

若gcd(a, m) ≠ 1,使用(b / a) % m = (b % (am)) / a

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值