扩展欧几里得

这篇博客详细介绍了扩展欧几里得算法如何用于求解最大公约数以及线性同余方程ax+by=gcd(a,b)的解。当b不等于0时,通过递归调用并更新变量,可以找到一组解x和y。博客中提供了两种不同的递归实现方式,并强调了y的取值不唯一。这种方法在数论和加密算法中有广泛应用。
摘要由CSDN通过智能技术生成

扩展欧几里得可以求出
a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b)的一组特解

证明:
b = 0 b=0 b=0时,显然有 x = 1 , y = 0 x=1,y=0 x=1,y=0这一组解,但其实 y y y并非只能取零,取任何值都可以。

b ≠ 0 b\neq 0 b=0,因为 a x + b y = g c d ( a , b ) = g c d ( b , a % b ) = b x + ( a % b ) y ax+by=gcd(a, b)=gcd(b, a \%b)=bx+(a \%b)y ax+by=gcd(a,b)=gcd(b,a%b)=bx+(a%b)y
= b x + ( a − ⌊ a / b ⌋ × b ) × y =bx+(a-\lfloor a/b \rfloor \times b)\times y =bx+(aa/b×b)×y
= b x + a y − ⌊ a / b ⌋ b y =bx+ay-\lfloor a/b \rfloor by =bx+aya/bby
= a y + b ( x − ⌊ a / b ⌋ y ) =ay+b(x- \lfloor a/b \rfloor y) =ay+b(xa/by)
即存在另一组解
y y y x − ⌊ a / b ⌋ y x- \lfloor a/b \rfloor y xa/by
x ′ = y , y ′ = x − ⌊ a / b ⌋ y x^{'}=y,y^{'}=x- \lfloor a/b \rfloor y x=y,y=xa/by,则有 a x ′ + b y ′ = g c d ( a , b ) ax^{'}+by^{'}=gcd(a,b) ax+by=gcd(a,b)
x ′ x^{'} x y ′ y^{'} y是一组解

证毕

因此当 b ≠ 0 b \neq 0 b=0时,我们可以递归调用欧几里得算法,每次回溯的时候令 x = y , y = x − ⌊ a / b ⌋ y x=y,y=x- \lfloor a/b \rfloor y x=y,y=xa/by,最后就会得到一组可行解,这个过程有两种表示方法。

// 1
ll exgcd(ll a, ll b, ll& x, ll& y){
	if (b == 0){
		x = 1;
		y = 0;//等于多少无所谓
		return a;
	}
	ll t = exgcd(b, a % b, y, x);
	y -= a / b * x;
	return t;
}
// 2
ll exgcd(ll a, ll b, ll& x, ll& y){
	if (b == 0){
		x = 1;
		y = -534;
		return a;
	}
	ll t = exgcd(b, a % b, x, y);
	ll z = x;
	x = y;
	y = z - (a / b) * y;
	return t;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值