世界上最早的算法:辗转相除法(求两个自然数最大公约数)

      在数学界,辗转相除法,又称欧几里得算法,被认为是世界上最早的算法(公元前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));
    }

}
时间: 2024-07-29 17:05:53

世界上最早的算法:辗转相除法(求两个自然数最大公约数)的相关文章

最古老的算法:辗转相除法(求两个自然数最大公约数)

在数学界,辗转相除法,又称欧几里得算法,被认为是世界上最早的算法(公元前300年),该算法用于求两个最大公约数的算法.辗转相除法首次出现于欧几里得的<几何原本>(第VII卷,命题yⅠ和Ⅱ)中,而在中国则可以追溯至东汉出现的<九章算术>. 两个自然数的最大公约数是能够同时整除它们的最大的正整数.辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的相除余数的最大公约 数.例如,1254和390的最大公约数是6(1254 = 6 × 209:390 = 6 × 65):用

世界上最早的一百个域名

知道吗,世界上最早的域名是在二十二年前注册的.whois上面可以查询到:symbolics.com--1985年3月15日.早在1984年,人们创造了域名解析系统,.com, .org, .edu, .gov, .mil 和国家顶级域名是最先被注册的一批顶级域名. 首先注册这些顶级域名的是: 第一个 .com域名 - symbolics.com 第一个edu域名 - cmu.edu, purdue.edu, rice.edu, ucla.edu (1985年4月) 第一个.gov域名 - css

c++-这个大数相加程序用了哪些算法在逻辑结构上定义了哪些算法并求流程图

问题描述 这个大数相加程序用了哪些算法在逻辑结构上定义了哪些算法并求流程图 #include #include #include #define max(a,b) (a)>(b)?(a):(b) int big_add(char*,char*,char*); int big_compare(char*,char*,int*); int is_number_string(char*); int main() { char num1[80],num2[80],num3[100]; puts("

澳大利亚是世界上最早制定互联网管理法律法规的国家之一

新华网悉尼6月10日电(报道员匡林)与其他西方国家相比,澳大利亚在互联网管理方面较为严格.联邦政府以法律为基础,与互联网服务提供商.家庭.学校等多方协同,力图过滤互联网不良信息,保障网络安全,尤其保护未成年人不受网络不良信息的侵害. 澳大利亚是世界上最早制定互联网管理法律法规的国家之一.<广播服务法><反垃圾邮件法><互联网内容法规>和<电子营销行业规定>等都为互联网管理提供了法律依据. 为加强互联网管理,澳大利亚政府将广播管理局和电信管理局合并,于2005

世界上最早的黑客:女性高手揭秘

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 纪录片制片人(左)和4名"奶奶级"电脑高手在一起,她们分别是贝蒂(左二).马琳(左三).凯瑟琳(右一),前排坐着的贝蒂·辛德·霍伯顿目前也已去世. 世界上最早的黑客 据美国媒体5日报道,在电脑时代,许多老年人不甘落后,然而鲜为人知的是,在美国仍然生活着几名80多岁的"奶奶级"电脑高手:她们曾在二战中帮助

域名简史:走近世界上最早的域名

中介交易 SEO诊断 淘宝客 云主机 技术大厅 域名简史:走近世界上最早的域名 域名历史:2011年3月15日,.com域名26岁生日,难以想象的世界上最早的域名简史 3月15日是互联网发展历史上一个具有重要意义的日子:全球首个.com域名注册25周年纪念日. 1985年3月15日,历史上第一个.com域名Symbolics.com出现在互联网上,经营 这个域名的是一家名为Symbolics的电脑生产商.这一事件标志着万维网进入了商用时代. 1985年,全球一共只有5家公司注册了.com域名.

算法 数据结构-求两个数最大公约数,欧几里得算法

问题描述 求两个数最大公约数,欧几里得算法 求两个数最大公约数,欧几里得算法,这两种方法除第一种可以避免除数为零的情况,两者有什么区别?谢谢 public static int gcd(int p, int q) { if (q == 0) return p; int r = p % q; return gcd(q, r) ; } public static int gcd(int p, int q) { int r = p % q; if (r == 0) return q; return g

详解C语言求两个数的最大公约数及最小公倍数的方法_C 语言

求两个正整数的最大公约数       思路:这是一个很基本的问题,最常见的就是两种方法,辗转相除法和辗转相减法.通式分别为 f(x, y) = f(y, x%y), f(x, y) = f(y, x - y) (x >=y > 0).根据通式写出算法不难,这里就不给出了.这里给出<编程之美>上的算法,主要是为了减少迭代的次数.      对于x和y,如果y = k * y1, x= k * x1,那么f(x, y) = k * f(x1, y1).另外,如果x = p * x1,假

世界上最早的100个域名

1.15-Mar-1985SYMBOLICS.COM2.24-Apr-1985BBN.COM3.24-May-1985THINK.COM4.11-Jul-1985MCC.COM5.30-Sep-1985DEC.COM6.07-Nov-1985NORTHROP.COM7.09-Jan-1986XEROX.COM8.17-Jan-1986SRI.COM9.03-Mar-1986HP.COM10.05-Mar-1986BELLCORE.COM11=19-Mar-1986IBM.COM11=19-Mar