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

简介:

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

 本文转自银河使者博客园博客,原文链接http://www.cnblogs.com/nokiaguy/archive/2013/06/07/3124350.html如需转载请自行联系原作者


银河使者

相关文章
|
4天前
|
算法
求最大公约数和最小公倍数的算法
求最大公约数和最小公倍数的算法
26 0
|
4天前
|
算法 Python
最大公约数算法
最大公约数算法
|
7月前
|
算法 C++
基本算法-欧几里德算法(辗转相除法)
基本算法-欧几里德算法(辗转相除法)
|
11月前
|
算法 Python
转:最大公约数算法很无聊吗?一个轻松方法(辗转相除法)3行代码搞定
最大公约数算法不是很无聊,计算最大公约数是数学中一个重要的概念,可以用于判断两个数是否互质、求分数的约分等,在很多领域都有广泛的应用。辗转相除法3行代码搞定。
49 0
算法--递归辗转相除法求最大公约数
算法--递归辗转相除法求最大公约数
|
算法
求最大公约数和最小公倍数的几种算法
求最大公约数和最小公倍数的几种算法
90 0
|
算法 C语言
【C语言初阶】求两个数的最大公约数,三种算法
给定两个整数,让你求这两个数的最大公约数 最大公约数顾名思义就是:这几个整数共有的约数中最大的一个。
120 0
|
4天前
|
算法 数据安全/隐私保护 计算机视觉
基于二维CS-SCHT变换和LABS方法的水印嵌入和提取算法matlab仿真
该内容包括一个算法的运行展示和详细步骤,使用了MATLAB2022a。算法涉及水印嵌入和提取,利用LAB色彩空间可能用于隐藏水印。水印通过二维CS-SCHT变换、低频系数处理和特定解码策略来提取。代码段展示了水印置乱、图像处理(如噪声、旋转、剪切等攻击)以及水印的逆置乱和提取过程。最后,计算并保存了比特率,用于评估水印的稳健性。
|
20小时前
|
算法
m基于BP译码算法的LDPC编译码matlab误码率仿真,对比不同的码长
MATLAB 2022a仿真实现了LDPC码的性能分析,展示了不同码长对纠错能力的影响。短码长LDPC码收敛快但纠错能力有限,长码长则提供更强纠错能力但易陷入局部最优。核心代码通过循环进行误码率仿真,根据EsN0计算误比特率,并保存不同码长(12-768)的结果数据。
19 9
m基于BP译码算法的LDPC编译码matlab误码率仿真,对比不同的码长
|
2天前
|
算法
MATLAB|【免费】融合正余弦和柯西变异的麻雀优化算法SCSSA-CNN-BiLSTM双向长短期记忆网络预测模型
这段内容介绍了一个使用改进的麻雀搜索算法优化CNN-BiLSTM模型进行多输入单输出预测的程序。程序通过融合正余弦和柯西变异提升算法性能,主要优化学习率、正则化参数及BiLSTM的隐层神经元数量。它利用一段简单的风速数据进行演示,对比了改进算法与粒子群、灰狼算法的优化效果。代码包括数据导入、预处理和模型构建部分,并展示了优化前后的效果。建议使用高版本MATLAB运行。