欧几里得算法求解最大公约数
2018-03-16 22:43
369 查看
这里主要要介绍的欧几里得算法,主要是用于求解两个整数的最大公约数的问题。
传统的求解方法是采用暴力枚举的方法,即枚举所有可能值取其最大。其算法描述如下:
显然,暴力破解所花费的时间会随着两个整数的增大而上升,尤其是当超过10000000后,求解速度就不是很理想了。
接下来介绍的欧几里得算法可用于简化该问题求解的规模。
假设 gg 是两个整数 aa 和 bb 的公约数,即存在整数 ll 和 mm,使得下列式成立
a=g⋅mb=g⋅l(1)(1)a=g⋅mb=g⋅l
不妨假设 a>ba>b,则有如下成立:
a=b⋅k+r(2)(2)a=b⋅k+r
其中 r≡a(modb),k∈Nr≡a(modb),k∈N,即 rr 是 aa 除 bb 的余数
将 (1) 代入 (2) 可得:
g⋅m=g⋅l⋅k+r⇒r=g⋅(m−l⋅k)(3)(3)g⋅m=g⋅l⋅k+r⇒r=g⋅(m−l⋅k)
即 rr 可以整除 gg
通过(1)、(2)、(3)可知,gg 同时是 a,b,ra,b,r的公约数
那么,求解 a,ba,b 的最大公约数,是不是等价于求解 b,rb,r 的最大公约数呢?
接下来证明这个命题:
假设 gg是 a,ba,b 的最大公约数,而r,br,b的最大公约数为 g∗g∗,其中 g∗>gg∗>g,即
r=g∗⋅nb=g∗⋅l∗(4)(4)r=g∗⋅nb=g∗⋅l∗
将(4)代入(2)
a=g∗⋅l∗⋅k+g∗⋅n∗⇒a=g∗(l∗⋅k+n)a=g∗⋅l∗⋅k+g∗⋅n∗⇒a=g∗(l∗⋅k+n)
即
a=g∗(l∗⋅k+n)b=g∗⋅l∗(5)(5)a=g∗(l∗⋅k+n)b=g∗⋅l∗
由(5)可知,g∗g∗也是 a,ba,b的公约数。但之前假设 gg 是 a,ba,b 的最大公约数,而 g∗>gg∗>g,所以这与条件相矛盾。故说明求解 a,ba,b 的最大公约数等价于求解 b,rb,r 的最大公约数。
通过欧几里得算法,可以将求解 a,ba,b 的最大公约数转化为求解 b,rb,r 的最大公约数。注意到,该过程是可以重复的。其伪代码如下:
传统的求解方法是采用暴力枚举的方法,即枚举所有可能值取其最大。其算法描述如下:
给定两个整数a,b c = min{a, b} max = 0; // 保存最大公约数 for i:0->c if (a % i == 0) And (b % i == 0) // '%'表示取模运算 if (max < i) max = i; return max;
显然,暴力破解所花费的时间会随着两个整数的增大而上升,尤其是当超过10000000后,求解速度就不是很理想了。
接下来介绍的欧几里得算法可用于简化该问题求解的规模。
假设 gg 是两个整数 aa 和 bb 的公约数,即存在整数 ll 和 mm,使得下列式成立
a=g⋅mb=g⋅l(1)(1)a=g⋅mb=g⋅l
不妨假设 a>ba>b,则有如下成立:
a=b⋅k+r(2)(2)a=b⋅k+r
其中 r≡a(modb),k∈Nr≡a(modb),k∈N,即 rr 是 aa 除 bb 的余数
将 (1) 代入 (2) 可得:
g⋅m=g⋅l⋅k+r⇒r=g⋅(m−l⋅k)(3)(3)g⋅m=g⋅l⋅k+r⇒r=g⋅(m−l⋅k)
即 rr 可以整除 gg
通过(1)、(2)、(3)可知,gg 同时是 a,b,ra,b,r的公约数
那么,求解 a,ba,b 的最大公约数,是不是等价于求解 b,rb,r 的最大公约数呢?
接下来证明这个命题:
假设 gg是 a,ba,b 的最大公约数,而r,br,b的最大公约数为 g∗g∗,其中 g∗>gg∗>g,即
r=g∗⋅nb=g∗⋅l∗(4)(4)r=g∗⋅nb=g∗⋅l∗
将(4)代入(2)
a=g∗⋅l∗⋅k+g∗⋅n∗⇒a=g∗(l∗⋅k+n)a=g∗⋅l∗⋅k+g∗⋅n∗⇒a=g∗(l∗⋅k+n)
即
a=g∗(l∗⋅k+n)b=g∗⋅l∗(5)(5)a=g∗(l∗⋅k+n)b=g∗⋅l∗
由(5)可知,g∗g∗也是 a,ba,b的公约数。但之前假设 gg 是 a,ba,b 的最大公约数,而 g∗>gg∗>g,所以这与条件相矛盾。故说明求解 a,ba,b 的最大公约数等价于求解 b,rb,r 的最大公约数。
通过欧几里得算法,可以将求解 a,ba,b 的最大公约数转化为求解 b,rb,r 的最大公约数。注意到,该过程是可以重复的。其伪代码如下:
给定两个整数a,b // 假设 a > b > 0 while (r == 0) { r = a % b; a = b; b = r; } return a;
相关文章推荐
- 用欧几里得算法求解最大公约数
- 求解最大公约数——欧几里得算法及其(解同余方程)拓展欧几里得
- 欧几里得算法求解最大公约数和最小公倍数
- 特殊数求解(最大公约数/最小公倍数/素数)
- Java实现算法导论中求解模线性方程解(基于最大公约数欧几里得扩展算法)
- 使用Python求解最大公约数
- 递归的练习——使用递归算法利用欧几里得算法,得出最大公约数
- 欧几里得算法_求最大公约数
- C++实现求解最大公约数和最小公倍数
- 最大公约数(欧几里得算法)
- Python基于辗转相除法求解最大公约数的方法示例
- 最大公约数 欧几里得算法 连续监测算法
- (学习博客园Ider的学习结果)最大公约数GCD的求解
- 算法怎么就这么难?----使用欧几里得算法求两数的最大公约数
- 使用Python求解最大公约数的实现方法
- C++求解最大公约数编程
- 【递归经典题目】欧几里得算法求最大公约数
- HDU 1713 相遇周期 — 欧几里得算法与最大公约数,最小公倍数
- 利用最大公约数求解问题
- 欧几里得算法 --- 辗转相除法求最大公约数