世界上最早的算法:辗转相除法(求两个自然数最大公约数)
来源:互联网 发布:en是什么软件 编辑:程序博客网 时间:2024/05/28 16:04
在数学界,辗转相除法,又称欧几里得算法,被认为是世界上最早的算法(公元前300年),该算法用于求两个最大公约数的算法。辗转相除法首次出现于欧几里得的《几何原本》(第VII卷,命题yⅠ和Ⅱ)中,而在中国则可以追溯至东汉出现的《九章算术》。
两个自然数的最大公约数是能够同时整除它们的最大的正整数。辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的相除余数的最大公约数。例如,1254和390的最大公约数是6(1254 = 6 × 209;390 = 6 × 65);用这两个数推导最大公约数的过程如下:
1254 % 390 = 84
390 % 84 = 54
84 % 54 = 30
54 % 30 = 24
30 % 24 = 6
所以这两个数的最大公约数是6,这很明显是递归算法
这个算法的证明如下:
设两数为a、b(b<a),用gcd(a,b)表示a,b的最大公约数,r=a mod b 为a除以b以后的余数,k为a除以b的商。辗转相除法即是要证明gcd(a,b)=gcd(b,r)。
第一步:令c=gcd(a,b),则设a=mc,b=nc
第二步:根据前提可知r =a-kb=mc-knc=(m-kn)c
第三步:根据第二步结果可知c也是r的因数
第四步:可以断定m-kn与n互素【否则,可设m-kn=xd,n=yd,(d>1),则m=kn+xd=kyd+xd=(ky+x)d,则a=mc=(ky+x)dc,b=nc=ycd,故a与b最大公约数成为cd,而非c,与前面结论矛盾】
从而可知gcd(b,r)=c,继而gcd(a,b)=gcd(b,r)。
PS:这个结论是根据第二步r =(m-kn)c,第一步b =nc 将r带入gcd(b,r),得到gcd(nc, (m-kn)c),所以只有n和m-kn互为素数,b和r的最大公约数才为c
下面给出Java的实现
public class GCD{ public static int getGCD(int a, int b) { if(a < 0 || b < 0) return -1; if(a < b) { int c = b; b = a; a = c; } int c = a % b; if(c == 0) return b; else return getGCD(b, c); } public static void main(String[] args) { System.out.println(getGCD(1254, 390)); }}
- 世界上最早的算法:辗转相除法(求两个自然数最大公约数)
- 世界上最早的算法:辗转相除法(求两个自然数最大公约数)
- C语言 求两个数的最大公约数 (算法)--辗转相减法、辗转相除法
- python求两个数字的最大公约数(辗转相除法)
- 利用辗转相除法求两个自然数的最大公因数
- 两个数的最大公约数------欧几里德算法(辗转相除法)
- 欧几里德算法(辗转相除法):求两个整数最大公约数
- 辗转相除法求两个数最大公约数
- 辗转相除法求两个正整数的最大公约数
- 求两个数的最大公约数:辗转相除法
- 用辗转相除法求两个数的最大公约数
- 辗转相除法求两个数的最大公约数
- 辗转相除法求两个数的最大公约数
- 辗转相除法求两个数的最大公约数
- 辗转相除法求两个数的最大公约数
- 辗转相除法求两个数的最大公约数
- 辗转相除法求两个数的最大公约数
- 习题:求两个数的最大公约数-辗转相除法
- 详解linux vi命令用法
- 如何在有UITextField的界面让键盘更从容的失去第一响应者
- 关于相对路径的说明
- css颜色代码对应表
- Chrome扩展:让你使用浏览器打开Office文件
- 世界上最早的算法:辗转相除法(求两个自然数最大公约数)
- sql 判断字段是否为空
- Android 读取并显示通讯录
- Sql server 2005中output用法解析
- Extjs 4.0 ComboBox JSON
- apache 开源项目
- 找回笔记本在win7系统中的蓝牙选项
- nginx和apache+crontab下的压力测试汇总
- Ubuntu安装英汉词典