博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最大公约数的欧几里德[辗转相除]算法及其扩展
阅读量:5974 次
发布时间:2019-06-19

本文共 886 字,大约阅读时间需要 2 分钟。

欧几里德算法描述:

E1.[求余数]

       以n除m并令r为所得余数。(我们将有0 ≤ r ≤ n。)

E2[余数为0?]

       若r=0,算法结束,n即为答案。

E3[减少]

       置m←n, n←r,并返回步骤E1.

 

其原理依赖于下面的定理

gcd(a, b) = gcd(b, a mod b)

 证明:

a可以表示成a = kb + r,则r = a mod b

假设d是a, b的一个公约数,则有

d | a, d | b,而r = a - kb,因此d | r

因此d是(b, a mod b)的公约数

 

 假设d 是(b,a mod b)的公约数,则

 d | b , d |r ,但是a = kb +r

 因此d也是(a,b)的公约数

 

 因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证。

 

欧几里得算法的C语言表达:

int gcd(int a, int b) { if(a == 0) reutn b; if(b == 0) return a; if(a < b) swap(a, b); int c; while(c = a % b) { b = c; a = b; } return b; }

 

欧几里得算法的改进(避免a、b之间的交换):

F1.[余数m / n]

       以n除m并令m是余数。

F2[它为0?]

       如果m = 0,则此算法以n为答案而终止。

F3[余数n / m]

       以m除n并令n为余数。

F4[它为0?]

如果n = 0, 则算法以答案m为终止;否则返回步骤F1。

实际上是通过提前完成下一次的取余来弥补交换的过程。

欧几里得改进算法的C语言表达:

int gcd(int a, int b) { if(a == 0) reutn b; if(b == 0) return a; if(a < b) swap(a, b); while(a = a % b) { b = b % a; } return b; }

 

 

另外:

GCD (greatest common divisor 或者 highest common factor )

 

转载地址:http://npbox.baihongyu.com/

你可能感兴趣的文章
关于使用Java开发Mis系统
查看>>
CSS 溢出文本显示省略号的方法(兼容 IE、FF、Chrome)
查看>>
[原创]Android从xml加载到View对象过程解析
查看>>
并发问题的资源与待准备
查看>>
C++基础
查看>>
【12-26】go.js
查看>>
HDU 1241 Oil Deposits
查看>>
脚印:关于扩展方法的使用
查看>>
标准文件描述符与标准文件句柄
查看>>
049_Search Lookup (二)
查看>>
Js apply方法详解
查看>>
Maven使用详解
查看>>
js jquery css 选择器总结
查看>>
《我想和你虚度时光》--------李元胜
查看>>
Java 应该被记住的8位大人物
查看>>
Spring注解详解
查看>>
NSArray,NSMutable和NSSet,NSMutableSet和NSDictionary,NSMutableDictionary用法
查看>>
mysql错误日志路径
查看>>
Bzoj4152: [AMPPZ2014]The Captain
查看>>
NSCache
查看>>