欧几里得及扩展欧几里得算法详解

欧几里得算法
有两个数 a b,现在,我们要求 a b 的最大公约数,有欧几里得算法:
gcd(a,b) = gcd(b,a%b)
若b>a,则第一步先完成了交换,再开始了求最大公约数的过程。
代码:
这里写图片描述
为什么要在b = 0时回溯呢?
对于两个数a b,显然在辗转相除的过程中一定会得到一个状态一个数非0,一个数为0。
简单的证明:
这里写图片描述
上图为欧几里得算法分部过程。
观察最后的a%b,由于取模运算的性质,其结果k1一定是:1<=k1<=b-1的,
则其外面括号运算结果k2一定是:1<=k2<=b-2(k1)的,
则一定会有b依次-1被减为0的情况,那么此时的a即为a b的最大公约数
有两种理解:
1. 此时在上一个算法过程中,a和b的gcd为此时的a。
2. 方便起见,一个非0数和0的gcd为非0数本身,则gcd为此时的a。
回溯最终结果即可。

扩展欧几里得算法
而对于a b和gcd(a,b),我们一定可以找到一组x y,使得ax + by = gcd(a,b)。
这是一个不定方程。显然这个不定方程存在无数组解,但事实上我们只要得到一组特解(x0,y0),便可推知其他所有的解(x,y)。设gcd(a,b)为d
x = x0 - (b / d) * t
y = y0 + (a / d) * t
t为任意整数
证明:
相当于减去了一个(a * b)/d,又在后面加上了一个(a * b)/d
如何得到一组特解呢?
当b = 0时,不定方程变为:ax = gcd(a,b)
而由欧几里得算法可知,此时a = gcd(a,b),那么此时方程的解为:x=1,y=0
这是算法的最终状态,如何由此反推回初始状态呢?
注意关于a,b最终状态 = 初始状态,但关于的x,y不是。
模运算实质:
a % b = a – a/b *b,注意这里的/是整除下取整
那么对于不定方程:
gcd(a,b) = a * x + b * y
= b * x1 + (a - (a/b) * b) * y1
= b * x1 + a * y1–(a/b) * b * y1
= a * y1 + b * (x1–a/b * y1)
可以推知初始状态的x,y与上一状态x1,y1有关:
x = y1
y = x1 – a/b * y1
那么就可以递归推出特解了。
代码:
这里写图片描述
而对于对于不定方程ax + by = c,若c % gcd(a,b) = 0则存在解,反之则不存在解,其解x1 = x * c / gcd(a,b),y1 = y * c / gcd(a,b),就可以用扩展欧几里得算法求解不定方程了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值