扩展欧几里得算法的笔记

       扩展欧几里得算法又称碾转相除法或者欧几里得算法,用于计算两个正整数a,b的最大公约数

理解欧几里得算法,首先看一个定义:ab的最大公约数gab的线性和中(绝对值)最小的一个,即所有形如xa + yb(其中xy是整数)的数中(绝对值)最小的数。

计算过程

    辗转相除法是一种递归算法,每一步计算的输出值就是下一步计算时的输入值。k表示步骤数(从0开始计数),算法的计算过程如下。

每一步的输入是都是前两次计算的余数rk−1rk−2。因为每一步计算出的余数都在不断减小,所以,rk−1小于rk−2。在第k步中,算法计算出满足以下等式的商qk和余数rk

rk−2 = qk rk−1 + rk

其中rk < rk−1。也就是rk−2要不断减去rk−1直到比rk−1小。

在第一步计算时(k = 0),设r−2r−1分别等于ab,第2步(此时k = 1)时计算r−1(即b)和r0(第一步计算产生的余数)相除产生的商和余数,以此类推。整个算法可以用如下等式表示:

a = q0 b + r0
b = q1 r0 + r1
r0 = q2 r1 + r2
r1 = q3 r2 + r3

如果输入参因为a < b,所以ab相除得到的商q0等于0,余数r0等于a。所以在运算的每一步中得出的余数一定小于上一步计算的余数(rk一定小于rk−1)。

由于每一步的余数都在减小并且不为负数,必然存在第N步时rN等于0,使算法终止,rN−1 就是ab的最大公约数。其中N不可能无穷大,因为在r0和0之间只有有限个自然数。

证明

辗转相除法的正确性可以用两步来证明。首先,算法的最终结果rN−1同时整除ab。因为它是一个公约数,所以必然小于或者等于最大公约数g。然后,任何ab的公约数都能整除rN−1。所以g一定小于或等于rN−1。两个不等式只在rN−1 = g是同时成立。具体证明如下:

  1. 证明rN−1同时整除ab
    因为余数rN是0,rN−1能够整除rN−2
    rN−2 = qN rN−1
    因为rN−1能够整除rN−2,所以也能够整除rN−3
    rN−3 = qN−1 rN−2 + rN−1
    同理可证rN−1可以整除所有之前步骤的余数,包括ab,即rN−1ab的公约数,rN−1 ≤ g
  2. 证明任何整除ab的自然数g(也就是ab的公约数)都能整除rN-1
    根据定义,ab可以写成g的倍数:a = mgb = ng,其中mn是自然数。因为r0 = a − q0b = mg − q0ng = (m − q0n)g,所以g整除r0。同理可证g整除每个余数r1r2……rN-1。所以,最大公约数g一定整除rN−1,因而g ≤ rN−1

因为第一步的证明告诉我们rN−1 ≤ g,所以g = rN−1。即:

g = GCD(ab) = GCD(br0) = GCD(r0r1) = … = GCD(rN−2rN−1) = rN−1

例子

用类似辗转相除法,求二元一次不定方程47x+30y=1的整数解。

47=30*1+17

30=17*1+13

17=13*1+4

13=4*3+1

然后把它们改写成“余数等于”的形式

17=47*1+30*(-1) //式1

13=30*1+17*(-1) //式2

4=17*1+13*(-1) //式3

1=13*1+4*(-3)

然后把它们“倒回去”

1=13*1+4*(-3) //应用式3

1=13*1+[17*1+13*(-1)]*(-3)

1=13*4+17*(-3) //应用式2

1=[30*1+17*(-1)]*4+17*(-3)

1=30*4+17*(-7) //应用式1

1=30*4+[47*1+30*(-1)]*(-7)

1=30*11+47*(-7)

得解x=-7, y=11。

这个方法就是扩展欧几里德算法。

        对于a*x+b*y=c;只要看c是不是a和b的公约数或者公约数的整数倍,就可以得出x和y有没有整数解。


JAVA实现

    
 int gcd(int a,int b)

 {

	return b==0?a:gcd(b,a%b);

 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值