扩展欧几里得

扩展欧几里得主要是解决二元一次方程

即a*x + b*y + c = 0的解的问题

拓展欧几里得:

void ex_gcd(int a, int b, int& d, int& x, int& y){
	if(!b){
		d = a;
		x = 1;
		y = 0;
	}
	else{
		ex_gcd(b, a%b, d, y, x);
		y -= x*(a/b);
	}
}
数学归纳法可证明正确,此处不再证明
最后得出的d是a和b的最大公约数,求得(x1, y1)是a*x + b*y = d的一组解,设另一组解x2,y2

a*x1 + b*y1 = a*x2 + b*y2(都等于d,即gcd(a, b)),变形得a*(x1 - x2) = b*(y2 - y1)

两边同除以d即gcd(a, b),(d不为0, 若d为0,则a,b均小于等于0,且有一个为0,需特判)

此时a1*(x1 - x2) = b1*(y2 - y1),a1 = a/d,b1 = b/d;

此时a1和b1互为素数,(x1 - x2)必然是b1的整数倍,设为k*b1;同理(y2 - y1) = k*a1

由此可得,对a*x + b*y = c的一组解是(x0, y0),则任意整数解可写为(x0+k*b1, y0-k*a1),a1 = a/gcd(a, b),b1 = b/gcd(a, b)
a*x + b*y = gcd(a, b)的一组解是(x0, y0),若c是gcd(a, b)的倍数,则a*x + b*y = c有唯一整数解(x0*c/d, y0*c/d),否则无整数解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值