扩展欧几里得

扩展欧几里得可以求出
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;
}
©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页