扩展欧几里得

扩展欧几里得可以求出
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+(a−⌊a/b⌋×b)×y
= b x + a y − ⌊ a / b ⌋ b y =bx+ay-\lfloor a/b \rfloor by =bx+ay−⌊a/b⌋by
= a y + b ( x − ⌊ a / b ⌋ y ) =ay+b(x- \lfloor a/b \rfloor y) =ay+b(x−⌊a/b⌋y)
即存在另一组解
y y y和 x − ⌊ a / b ⌋ y x- \lfloor a/b \rfloor y x−⌊a/b⌋y
令 x ′ = y , y ′ = x − ⌊ a / b ⌋ y x^{'}=y,y^{'}=x- \lfloor a/b \rfloor y x′=y,y′=x−⌊a/b⌋y,则有 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=x−⌊a/b⌋y,最后就会得到一组可行解,这个过程有两种表示方法。

// 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;
}
posted @ 2022-08-03 19:07  correct  阅读(75)  评论(0)    收藏  举报