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

来源:互联网 发布:淘宝运营推广计划书 编辑:程序博客网 时间:2024/06/05 05:19

欧几里得算法
有两个数 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),就可以用扩展欧几里得算法求解不定方程了。

原创粉丝点击