扩展欧几里得算法

裴蜀定理:设(a,b) = d,,对于任意的整数x, y,ax + by都一定是d的倍数。特别地,一定存在整数x, y(不一定唯一),使ax + by = d成立。
另外,若a不等于b,则d为a和b的线性组合所能表示的最小整数。
扩展欧几里得算法:用于解决如何求出裴蜀定理中的x, y。对于两个整数a, b,我们都知道欧几里得算法可以用来求这两个数的最大公约数,扩展欧几里得可以在求得最大公约数的同时将系数x, y也求得,这也就是其称为扩展欧几里得算法的原因。
算法过程:要求ax + by = d,容易发现当b = 0时,答案是显然的,即x = 1,y可取任意值。现在考虑能否倒着推回去,假设现在我已经得到了一组x, y使得by + (a % b)x = d,将这个式子整理一下得到,ax + (y - a / b * x)b = d,由于当前a, x, y, b都是已知的,所以我可以得到当前的解为x = x,y = y - a / b * x。所以我调用的时候只需调用exgcd(b, a % b, y, x),在回溯的时候令y -= a / b * x即可。
通解为:x = x0 - kb/d
y = y0 + ka/d
代码

int exgcd(int a, int b, int& x, int& y) {
	if (b == 0) { x = 1, y = 0; return a; } //此处y可取任意值,但要注意防止爆int的情况
	int d = exgcd(b, a % b, y, x);
	y -= a / b * x;
	return d;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值