前言
本文主要介绍的是求 gcd ( a , b ) \gcd(a,b) gcd(a,b)及方程 a x + b y = gcd ( a , b ) ax+by=\gcd(a,b) ax+by=gcd(a,b)的解的方法,即欧几里得算法和拓展欧几里得算法。
欧几里得算法
定理:
∀
a
,
b
∈
N
,
b
≠
0
,
gcd
(
a
,
b
)
=
gcd
(
b
,
a
m
o
d
b
)
\forall a,b\in\N,b\ne 0,\gcd(a,b)=\gcd(b,a\bmod b)
∀a,b∈N,b=0,gcd(a,b)=gcd(b,amodb)。
证明:
当
a
<
b
a<b
a<b ,则
gcd
(
b
,
a
m
o
d
b
)
=
gcd
(
b
,
a
)
=
gcd
(
a
,
b
)
\gcd(b,a\bmod b)=\gcd(b,a)=\gcd(a,b)
gcd(b,amodb)=gcd(b,a)=gcd(a,b),命题成立。
当
a
≥
b
a\ge b
a≥b,设
a
=
q
b
+
r
a=qb+r
a=qb+r,其中
0
≤
r
<
b
0\le r<b
0≤r<b。显然
r
=
a
m
o
d
b
r=a\bmod b
r=amodb。而对于
a
,
b
a,b
a,b的任意公约数
d
∣
a
,
d
∣
q
×
b
d|a,d|q\times b
d∣a,d∣q×b,故
d
∣
(
a
−
q
b
)
d|(a-qb)
d∣(a−qb),即
d
∣
r
d|r
d∣r。因此
d
d
d也是
b
,
r
b,r
b,r的公约数。反之亦成立。故
a
,
b
a,b
a,b的公约数集合与
b
,
a
m
o
d
b
b,a\bmod b
b,amodb的公约数集合相同,他们的最大公约数自然也相等。
证毕。
int gcd(int a,int b)
{
if(b==0)
return a;
return gcd(b,a%b);
}
拓展欧几里得算法
求方程
a
x
+
b
y
=
gcd
(
a
,
b
)
ax+by=\gcd(a,b)
ax+by=gcd(a,b)的整数解。
设方程
a
x
+
b
y
=
gcd
(
a
,
b
)
ax+by=\gcd(a,b)
ax+by=gcd(a,b)的一组解为
{
x
=
x
1
y
=
y
1
\begin{cases}x=x_1\\y=y_1\end{cases}
{x=x1y=y1。由欧几里得算法得知,方程
a
x
+
b
y
=
gcd
(
a
,
b
)
ax+by=\gcd(a,b)
ax+by=gcd(a,b)可转化为
b
x
+
(
a
m
o
d
b
)
y
=
gcd
(
a
,
b
)
bx+(a\bmod b)y=\gcd(a,b)
bx+(amodb)y=gcd(a,b),则有另一组解为
{
x
=
x
2
y
=
y
2
\begin{cases}x=x_2\\y=y_2\end{cases}
{x=x2y=y2。此时把方程变形一下就可以变成:
a
x
1
+
b
y
1
=
b
x
2
+
(
a
m
o
d
b
)
y
2
a
x
1
+
b
y
1
=
b
x
2
+
(
a
−
⌊
a
b
⌋
×
b
)
y
2
a
x
1
+
b
y
1
=
a
y
2
+
b
x
2
−
⌊
a
b
⌋
×
b
y
2
ax_1+by_1=bx_2+(a\bmod b)y_2 \\ ax_1+by_1=bx_2+\left(a-\left\lfloor\frac{a}{b}\right\rfloor\times b\right)y_2 \\ ax_1+by_1=ay_2+bx_2-\left\lfloor\frac{a}{b}\right\rfloor\times by_2
ax1+by1=bx2+(amodb)y2ax1+by1=bx2+(a−⌊ba⌋×b)y2ax1+by1=ay2+bx2−⌊ba⌋×by2
根据恒等定理,有一组解为
{
x
=
y
2
y
=
x
2
−
⌊
a
b
⌋
×
y
2
\begin{cases}x=y_2\\y=x_2-\left\lfloor\frac{a}{b}\right\rfloor\times y_2\end{cases}
{x=y2y=x2−⌊ba⌋×y2。可以发现,
x
,
y
x,y
x,y基于
x
2
,
y
2
x_2,y_2
x2,y2,于是在求最大公约数的时候,可以顺便求出。
int x,y;
int exgcd(int a,int b)
{
if(b==0)
{
x=1,y=0;
return a;
}
int temp=exgcd(b,a%b);
int tx=x;
x=y;
y=tx-a/b*y;
return temp;
}