1 线性方程与最大公因数
已知两个整数
a
a
a与
b
b
b,我们考察由
a
x
+
b
y
ax+by
ax+by得到的所有正整数,其中
x
x
x与
y
y
y可为任何整数。(
x
,
y
x,y
x,y可取负值)。例如下表为
a
=
42
,
b
=
30
a=42,b=30
a=42,b=30的情况下
a
x
+
b
y
ax+by
ax+by可取的一些值。
我们来观察这个表格,首先我们会发现这个表格中的每一个数都能被
6
6
6整除,原因也很显然,因为
42
42
42和
30
30
30都能被
6
6
6整除,所以
42
x
+
30
y
42x+30y
42x+30y自然也能被
6
6
6整除,推广到一般情况,我们能够自然地得出下面这个结论:
形
如
a
x
+
b
y
的
每
个
数
都
能
被
g
c
d
(
a
,
b
)
整
除
形如ax+by的每个数都能被gcd(a,b)整除
形如ax+by的每个数都能被gcd(a,b)整除
其次我们再观察数据会发现
g
c
d
(
42
,
30
)
=
6
gcd(42,30)=6
gcd(42,30)=6也出现在表格里面,这揭示了下述结论:
形
如
a
x
+
b
y
的
最
小
正
整
数
等
于
g
c
d
(
a
,
b
)
形如ax+by的最小正整数等于gcd(a,b)
形如ax+by的最小正整数等于gcd(a,b)
下面我们来证明这个结论。
2 证明
由于每个数
a
x
+
b
y
ax+by
ax+by都能整除
g
c
d
(
a
,
b
)
gcd(a,b)
gcd(a,b),
a
x
+
b
y
ax + by
ax+by的最小正整数值恰好是
g
c
d
(
a
,
b
)
gcd(a,b)
gcd(a,b)。所以我们只需要找出求解方程:
a
x
+
b
y
=
g
c
d
(
a
,
b
)
ax+by=gcd(a,b)
ax+by=gcd(a,b)
的整数解
x
,
y
x,y
x,y的方法就可以了。下面便给出如何使用欧几里得算法来求解该方程。以
22
x
+
60
y
=
g
c
d
(
22
,
60
)
22x+60y=gcd(22,60)
22x+60y=gcd(22,60)为例。
使用欧几里得算法计算最大公因数:
60
=
2
∗
22
+
16
22
=
1
∗
16
+
6
16
=
2
∗
6
+
4
6
=
1
∗
4
+
2
4
=
2
∗
2
+
0
60 = 2*22+16\\ 22 = 1*16 + 6\\ 16 = 2*6 + 4\\ 6 = 1*4 + 2\\ 4 = 2*2 + 0
60=2∗22+1622=1∗16+616=2∗6+46=1∗4+24=2∗2+0
我们得出 g c d ( 22 , 60 ) = 2 gcd(22, 60) = 2 gcd(22,60)=2,接下来我们使用算法的中间商和余数来求解 22 x + 60 y = 2 22x+60y=2 22x+60y=2。
首先, 将第一个式子改写成:
16
=
a
−
2
b
16 = a - 2b
16=a−2b
然后用这个等式替换第二个式子中的
16
16
16得:
6 = b − 1 ∗ ( a − 2 b ) = − a + 3 b 6 = b - 1*(a-2b) = -a +3b 6=b−1∗(a−2b)=−a+3b
用这两个等式替换第三个式子中的
6
6
6和
16
16
16得:
4
=
(
a
−
2
b
)
−
2
∗
(
−
a
+
3
b
)
=
3
a
−
8
b
4 = (a-2b) - 2*(-a+3b) = 3a - 8b
4=(a−2b)−2∗(−a+3b)=3a−8b
最后将第四个式子的
4
4
4和
6
6
6做替换得:
−
a
+
3
b
=
3
a
−
8
b
+
2
-a +3b = 3a-8b+2
−a+3b=3a−8b+2
移项得:
−
4
a
+
11
b
=
2
-4a + 11b = 2
−4a+11b=2
因此我们便得到了
22
x
+
60
y
=
2
22x+60y=2
22x+60y=2的解:
x
=
−
4
y
=
11
x = -4\\ y=11
x=−4y=11
这个方法的可行性在于,欧几里得算法的每一个步骤产生的新的余数都可以表示为 a a a的倍数加 b b b的倍数,即:
最
新
余
数
=
a
的
倍
数
+
b
的
倍
数
最新余数 = a的倍数+b的倍数
最新余数=a的倍数+b的倍数
我们最终得到的非零余数就是
g
c
d
(
a
,
b
)
gcd(a,b)
gcd(a,b),因此方程的解也就自然而然地得出来了。
3 解的讨论
现在我们知道方程 a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b)总有整数解 x , y x,y x,y,并且可以通过欧几里得算法求得。下面来讨论一下方程有多少个解以及怎样表述所有解。
首先考虑
a
,
b
a,b
a,b互素的情况,即
g
c
d
(
a
,
b
)
=
1
gcd(a,b)=1
gcd(a,b)=1,假设
(
x
1
,
y
1
)
(x_1,y_1)
(x1,y1)是方程
a
x
+
b
y
=
1
ax+by=1
ax+by=1的解,那么通过
x
1
x_1
x1加上
b
b
b的倍数,
y
1
y_1
y1减去
a
a
a的倍数我可以得到其他的解,即:
对
任
何
整
数
k
,
我
们
得
到
新
解
(
x
1
+
k
b
,
y
1
−
k
a
)
对任何整数k,我们得到新解(x_1+kb,y_1-ka)
对任何整数k,我们得到新解(x1+kb,y1−ka)
计算验证也很简单:
a
(
x
1
+
k
b
)
+
b
(
y
1
−
k
a
)
=
a
x
1
+
b
y
1
=
1
a(x_1+kb) + b(y_1-ka) = ax_1 + by_1 = 1
a(x1+kb)+b(y1−ka)=ax1+by1=1
另外,为了证明这种方法可以给出所有解,我们假设
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
(x_1,y_1),(x_2,y_2)
(x1,y1),(x2,y2)是方程
a
x
+
b
y
=
1
ax+by=1
ax+by=1的两个解,即:
a
x
1
+
b
y
1
=
1
a
x
2
+
b
y
2
=
1
ax_1 + by_1 = 1\\ ax_2 + by_2 = 1
ax1+by1=1ax2+by2=1
我们用
y
2
y_2
y2乘以第一个方程,用
y
1
y_1
y1乘以第二个方程,再相减得到:
a
x
1
y
2
−
a
x
2
y
1
=
y
2
−
y
1
ax_1y_2- ax_2y_1 = y_2 - y_1
ax1y2−ax2y1=y2−y1
类似地,我们用
x
2
x_2
x2乘第一个方程,用
x
1
x_1
x1乘第二个方程,在相减得到:
b
x
2
y
1
−
b
x
1
y
2
=
x
2
−
x
1
bx_2y_1 - bx_1y_2 = x_2 - x_1
bx2y1−bx1y2=x2−x1
令
k
=
x
2
y
1
−
x
1
y
2
k = x_2y_1 - x_1y_2
k=x2y1−x1y2,则有:
x
2
=
x
1
+
k
b
y
2
=
y
1
−
k
a
x_2 = x_1 + kb\\ y_2 = y_1 - ka
x2=x1+kby2=y1−ka
这样我们便证明了解
(
x
2
,
y
2
)
(x_2,y_2)
(x2,y2)可以由
(
x
1
,
y
1
)
(x_1,y_1)
(x1,y1)得到,因此这种方法可以找到
a
x
+
b
y
=
1
ax+by=1
ax+by=1的每一个解。
那么如果
g
c
d
(
a
,
b
)
>
1
gcd(a,b)>1
gcd(a,b)>1呢?和简单,我们只需要在方程两端同时除以
g
=
g
c
d
(
a
,
b
)
g = gcd(a,b)
g=gcd(a,b)不就变成了上面这种情况了嘛。即:
a
g
x
+
b
g
y
=
1
\frac{a}{g}x + \frac{b}{g}y = 1
gax+gby=1
然后我们直接套用前面的方法,就可以完成对
a
x
+
b
y
=
g
ax+by=g
ax+by=g的解的描述了。
4 线性方程定理
设
a
a
a与
b
b
b是非零整数,
g
=
g
c
d
(
a
,
b
)
g=gcd(a,b)
g=gcd(a,b)。方程:
a
x
+
b
y
=
g
ax+by=g
ax+by=g
总是有一个整数解
(
x
1
,
y
1
)
(x_1,y_1)
(x1,y1),它可以由欧几里得算法得到,则方程的每一个解可以由:
(
x
1
+
k
b
g
,
y
1
−
k
a
g
)
(x_1 + k\frac{b}{g},y_1-k\frac{a}{g})
(x1+kgb,y1−kga)
得到,其中
k
k
k可为任意整数。
5 扩展欧几里得算法
给定
a
x
+
b
y
=
g
ax +by = g
ax+by=g,扩展欧几里得算法可求得上述整数解。来看下面两个式子:
a
x
1
+
b
y
1
=
g
c
d
(
a
,
b
)
b
x
2
+
a
%
b
y
2
=
g
c
d
(
b
,
a
%
b
)
ax_1+by_1 = gcd(a,b)\\ bx_2 + a\%by_2 = gcd(b, a\%b)
ax1+by1=gcd(a,b)bx2+a%by2=gcd(b,a%b)
如果我们能够知道
x
1
,
x
2
,
y
1
,
y
2
x_1,x_2,y_1,y_2
x1,x2,y1,y2之间的关系,那么我们就可以递归求解。我们知道
a
%
b
=
a
−
⌊
a
b
⌋
∗
b
a\%b = a-\lfloor \cfrac{a}{b}\rfloor *b
a%b=a−⌊ba⌋∗b
,且
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),通过上式可求得:
x
1
=
y
2
y
1
=
x
2
−
⌊
a
b
⌋
∗
y
2
x_1 = y_2\\ y_1 = x_2 - \lfloor \cfrac{a}{b}\rfloor *y_2
x1=y2y1=x2−⌊ba⌋∗y2
欧几里得算法的停止状态是
a
=
g
c
d
,
b
=
0
a = gcd,b=0
a=gcd,b=0,放到这里的状态就是:
a
∗
1
+
b
∗
0
=
a
a*1 + b*0 =a
a∗1+b∗0=a
不管
b
b
b的系数是多少,但
a
a
a的系数一定得是
1
1
1。现在我们可以令上式
x
2
=
1
,
y
2
=
0
x_2 = 1,y_2=0
x2=1,y2=0然后一直往回推,就可以得到最初状态了。
def ext_gcd(a, b):
if not b:
return 1, 0, a
x, y, g = ext_gcd(b, a % b)
x, y = y, x - a//b * y
return x, y, g
print(ext_gcd(60, 22))
输出结果为
(-4, 11, 2)
6 裴蜀定理(贝祖定理)
在数论中,裴蜀定理是一个关于最大公约数的定理。裴蜀定理得名于法国数学家艾蒂安·裴蜀,说明了对任何整数
a
,
b
a,b
a,b和它们的最大公约数
g
g
g,关于未知数
x
x
x和
y
y
y的线性丢番图方程(称为裴蜀等式):
a
x
+
b
y
=
m
ax + by = m
ax+by=m
有解当且仅当
m
m
m是
g
g
g的倍数。裴蜀等式有解时必然有无穷多个整数解,每组解
x
,
y
x,y
x,y都称为裴蜀数,可用扩展欧几里得算法求得。
特别来说,方程 a x + b y = 1 ax + by = 1 ax+by=1 有解当且仅当整数 a a a和 b b b互素。
裴蜀等式也可以用来给最大公约数定义: g g g其实就是最小的可以写成 a x + b y ax + by ax+by形式的正整数。这个定义的本质是整环中“理想”的概念。因此对于多项式整环也有相应的裴蜀定理。
7 参考资料
- 《数论概论》第四版 P24-P28
- 百度百科 裴蜀定理