欧几里得算法
公式表述:
g
c
d
(
a
,
b
)
=
g
c
d
(
b
,
a
%
b
)
gcd(a,b)=gcd(b,a\%b)
gcd(a,b)=gcd(b,a%b)
证明:
a
a
a 可以表示为
a
=
k
b
+
r
,
r
=
a
%
b
a = kb + r,r = a\%b
a=kb+r,r=a%b
假设
d
d
d 是
(
a
,
b
)
(a,b)
(a,b) 的一个公约数,则有
d
∣
a
,
d
∣
b
d|a,d|b
d∣a,d∣b,而
r
=
a
–
k
b
r = a – kb
r=a–kb,因此
d
∣
r
d|r
d∣r
所以
d
d
d 也是
(
b
,
a
%
b
)
(b,a\%b)
(b,a%b) 的公约数。
除了上面这个经典算法,还有 stein 算法用来求解最大公约数,只有整数的移位和加减法,比欧几里得算法在大整数上更有优势,可以去了解一下。
扩展欧几里得算法求解贝祖等式
贝祖定理(一般形式)
对于不全为 0 的自然数 a , b a,b a,b,则必然存在整数 x , y x , y x,y (不唯一)满足等式 a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b)
上面的等式就称做贝祖等式。
扩展欧几里得算法能够求解贝祖等式的正确性证明
设 a > b a > b a>b
- 当
b
=
0
b = 0
b=0 时,
g
c
d
(
a
,
b
)
=
a
gcd(a,b) = a
gcd(a,b)=a
贝祖等式即 a x = a ax = a ax=a,解得 x = 1 , y x = 1,y x=1,y 可以取 y = 0 y = 0 y=0 - 当
b
>
0
b > 0
b>0 时,
假设 a , b a,b a,b 的贝祖等式的解为 x 1 , y 1 x_1,y_1 x1,y1,即 a ⋅ x 1 + b ⋅ y 1 = g c d ( a , b ) ⋯ ⋯ 1 a\cdot x_1+b\cdot y_1=gcd(a,b)\cdots\cdots1 a⋅x1+b⋅y1=gcd(a,b)⋯⋯1
b , a % b b,a\%b b,a%b 的贝祖等式的解为 x 2 , y 2 x_2,y_2 x2,y2,即 b ⋅ x 2 + a % b ⋅ y 2 = g c d ( b , a % b ) ⋯ ⋯ 2 b\cdot x_2+a\%b\cdot y_2=gcd(b,a\%b)\cdots\cdots2 b⋅x2+a%b⋅y2=gcd(b,a%b)⋯⋯2
由欧几里得算法可知 g c d ( a , b ) = g c d ( b , a % b ) gcd(a,b)=gcd(b,a\%b) gcd(a,b)=gcd(b,a%b)
故 a ⋅ x 1 + b ⋅ y 1 = b ⋅ x 2 + a % b ⋅ y 2 a\cdot x_1+b\cdot y_1=b\cdot x_2+a\%b\cdot y_2 a⋅x1+b⋅y1=b⋅x2+a%b⋅y2
即 a ⋅ x 1 + b ⋅ y 1 = b ⋅ x 2 + ( a − ⌊ a / b ⌋ ⋅ b ) ⋅ y 2 = a ⋅ y 2 + b ⋅ ( x 2 − ⌊ a / b ⌋ ⋅ y 2 ) a\cdot x_1+b\cdot y_1=b\cdot x_2+(a-\lfloor a/b\rfloor\cdot b)\cdot y_2=a\cdot y_2+b\cdot(x_2-\lfloor a/b\rfloor \cdot y_2) a⋅x1+b⋅y1=b⋅x2+(a−⌊a/b⌋⋅b)⋅y2=a⋅y2+b⋅(x2−⌊a/b⌋⋅y2)
由恒等关系可得 { x 1 = y 2 y 1 = x 2 − ⌊ a / b ⌋ ⋅ y 2 \begin{cases} x_1=y_2 \\y_1=x_2-\lfloor a/b\rfloor\cdot y_2 \end{cases} {x1=y2y1=x2−⌊a/b⌋⋅y2即贝祖等式 1 的解可以由 贝祖等式 2 的解得到,这是一个递归求解的过程,并且随着对 a , b a,b a,b 进行辗转相除,贝祖等式的系数会越来越小,直至变为情况1,而情况1贝祖等式的解是有具体的值的,即 x = 1 , y = 0 x = 1,y = 0 x=1,y=0。然后进行回溯计算,最终可以得到 x 1 , y 1 x_1,y_1 x1,y1。
C++代码如下:
\\exGcd函数返回a,b最大公约数。贝祖等式的整数解为引用参数x,y
int exGcd(int a, int b, int& x, int& y){
if(b == 0){
x = 1;
y = 0;
return a;
}
int r = exGcd(b,a%b,x,y);
int t = x;
x = y;
y = t - a/b*y;
return r;
}
贝祖定理(更原始形式)的证明
若整数 a , b a,b a,b 互质,则存在整数解 x , y x,y x,y 满足 a x + b y = 1 ax + by = 1 ax+by=1
证明:
设
X
,
Y
X,Y
X,Y分别是使得
a
X
+
b
Y
>
0
aX+bY > 0
aX+bY>0的整数集合,
令
s
=
m
i
n
{
a
X
+
b
Y
}
>
0
s = min\{aX + bY\} > 0
s=min{aX+bY}>0,假设此时
X
=
x
1
,
Y
=
y
1
X=x_1,Y=y_1
X=x1,Y=y1
则有
a
x
1
+
b
y
1
=
s
ax_1+by_1=s
ax1+by1=s
假设
a
a
a 除以
s
s
s 的商为
k
k
k,余数为
r
(
0
≤
r
<
s
)
r(0\le r < s)
r(0≤r<s)
则有
r
=
a
−
k
s
=
a
−
k
(
a
x
1
+
b
y
1
)
=
a
(
1
−
k
x
1
)
+
b
(
−
k
y
1
)
r=a-ks=a-k(ax_1+by_1)=a(1-kx_1)+b(-ky_1)
r=a−ks=a−k(ax1+by1)=a(1−kx1)+b(−ky1)
但是因为其中
1
−
k
x
1
,
−
k
y
1
∈
Z
1-kx_1,-ky_1\in Z
1−kx1,−ky1∈Z,所以必须有
r
=
0
r=0
r=0
否则
r
<
s
r<s
r<s与假设
s
=
m
i
n
{
a
X
+
b
Y
}
>
0
s = min\{aX + bY\} > 0
s=min{aX+bY}>0矛盾
故
s
∣
a
s|a
s∣a,同理可得
s
∣
b
s|b
s∣b
即
s
s
s 为
a
,
b
a,b
a,b 的公约数,又
a
,
b
a,b
a,b 互质
所以有
s
=
1
s = 1
s=1
即存在整数
x
,
y
x,y
x,y使得
a
⋅
x
+
b
⋅
y
=
1
a\cdot x+b\cdot y=1
a⋅x+b⋅y=1成立。