裴蜀定理
也就是Bezout 定理,对于任意整数a,b,存在一对整数x,y,满足
a
x
+
b
y
=
g
c
d
(
a
,
b
)
ax+by=gcd(a,b)
a x + b y = g c d ( a , b ) 。 在数论中,裴蜀定理是一个关于最大公约数(或最大公约式)的定理,裴蜀定理得名于法国数学家艾蒂安·裴蜀。 裴蜀定理说明了对任何整数 a、b和它们的最大公约数 d ,关于未知数 x 和 y 的线性丢番图方程(称为裴蜀等式)。
证明:
若b=0时,此时迭代到算法的最后一步,显然存在一对整数,
x
=
1
,
y
=
0
x=1,y=0
x = 1 , y = 0 ,使得
a
∗
1
+
0
∗
0
=
g
c
d
(
a
,
0
)
a*1+0*0 = gcd(a,0)
a ∗ 1 + 0 ∗ 0 = g c d ( a , 0 )
若b>0时,则
g
c
d
(
a
,
b
)
=
g
c
d
(
b
,
a
m
o
d
b
)
gcd(a,b) = gcd(b,a\,mod\,b)
g c d ( a , b ) = g c d ( b , a m o d b ) ,假设存在一对整数
x
1
,
y
1
x_1,y_1
x 1 , y 1 ,满足
b
∗
x
1
+
(
a
m
o
d
b
)
∗
y
1
=
g
c
d
(
b
,
a
m
o
d
b
)
b*x_1+(a\,mod\,b)*y_1 = gcd(b,a\,mod\,b)
b ∗ x 1 + ( a m o d b ) ∗ y 1 = g c d ( b , a m o d b ) ,因为
b
∗
x
1
+
(
a
m
o
d
b
)
∗
y
1
=
b
∗
x
1
+
(
a
−
a
/
b
∗
b
)
y
1
=
a
∗
y
1
+
b
∗
(
x
1
−
(
a
/
b
)
∗
y
1
)
b*x_1+(a\,mod\,b)*y_1 = b*x_1+(a-a/b*b)y_1 = a*y_1 +b*(x_1-(a/b)*y_1)
b ∗ x 1 + ( a m o d b ) ∗ y 1 = b ∗ x 1 + ( a − a / b ∗ b ) y 1 = a ∗ y 1 + b ∗ ( x 1 − ( a / b ) ∗ y 1 )
证毕
裴蜀定理是按照欧几里得算法的思路被证明的,并且同时给出了整数x和y的计算方法。这种计算方法被称为扩展欧几里得算法 。
联立一下
{
g
c
d
=
a
∗
x
+
b
∗
y
g
c
d
=
a
∗
y
1
+
b
∗
(
x
1
−
(
a
/
b
)
∗
y
1
)
\begin{cases} gcd=a*x+b*y \\ gcd = a*y_1 + b*(x_1-(a/b)*y_1) \end{cases}
{ g c d = a ∗ x + b ∗ y g c d = a ∗ y 1 + b ∗ ( x 1 − ( a / b ) ∗ y 1 )
可以得出
{
x
=
y
1
y
=
x
1
−
(
a
/
b
)
∗
y
1
\begin{cases} x=y_1 \\ y = x_1-(a/b)*y_1 \end{cases}
{ x = y 1 y = x 1 − ( a / b ) ∗ y 1
实现
int exgcd ( int a, int b, int & x, int & y) {
if ( b== 0 ) {
x = 1 , b = 0 ;
return a;
}
int ans = exgcd ( b, a% b, x, y) ;
int z = y;
y = x - ( a/ b) * z, x = z;
return ans;
}
说明
上述程序求出的是一组特解
x
0
,
y
0
x_0,y_0
x 0 , y 0 ,并返回a,b的最大公约数d。
未完,待续…