擴充套件歐幾里得

correct!發表於2020-09-28

擴充套件歐幾里得可以求出
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;
}

相關文章