扩展欧几里得可以求出
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;
}