线性方程与最大公因数(扩展欧几里得算法)

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+bygcd(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+bygcd(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=222+1622=116+616=26+46=14+24=22+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=a2b
然后用这个等式替换第二个式子中的 16 16 16得:

6 = b − 1 ∗ ( a − 2 b ) = − a + 3 b 6 = b - 1*(a-2b) = -a +3b 6=b1(a2b)=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=(a2b)2(a+3b)=3a8b
最后将第四个式子的 4 4 4 6 6 6做替换得:

− a + 3 b = 3 a − 8 b + 2 -a +3b = 3a-8b+2 a+3b=3a8b+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,y1ka)
计算验证也很简单:
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(y1ka)=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 ax1y2ax2y1=y2y1
类似地,我们用 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 bx2y1bx1y2=x2x1
k = x 2 y 1 − x 1 y 2 k = x_2y_1 - x_1y_2 k=x2y1x1y2,则有:
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=y1ka
这样我们便证明了解 ( 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,y1kga)
得到,其中 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=abab
,且 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=x2bay2
欧几里得算法的停止状态是 a = g c d , b = 0 a = gcd,b=0 a=gcd,b=0,放到这里的状态就是:
a ∗ 1 + b ∗ 0 = a a*1 + b*0 =a a1+b0=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
  • 百度百科 裴蜀定理
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值