zoukankan      html  css  js  c++  java
  • 计算最大公因数的欧几里得算法

    计算最大公因数的欧几里得算法

    最大公因数
    最大公因数,也称最大公约数,指两个或多个整数共有约数中最大的一个。a,b的最大公约数记为(a,b)。求最大公约数有多种方法,常见的有质因数分解法、辗转相除法等等。

    欧几里得算法
    欧几里德算法又称辗转相除法,是指用于计算两个正整数a,b的最大公约数。应用领域有数学和计算机两个方面。计算公式gcd(a,b) = gcd(b,a mod b)。欧几里得算法在RSA加密算法中有运用。

    源码

     1 //当N>M时,第一次循环之后两数将进行交换
     2 int Gcd(int m,int n){
     3     int r;
     4     while(n > 0){
     5         r = m % n;
     6         m = n;
     7         n = r;
     8     }
     9     return m;
    10 }

    算法分析
    算法通过连续计算余数,知道余数是0为止,最后所得的非0余数就是最大公因数。例如 M=1989 ,N=1590,则余数序列为399,393,6,3,0。因而,Gcd(1989,1590)=3,从余数的序列可知,这是一个快速收敛的算法。要想得出该算法的运行时间,就需要确定余数序列究竟有多长?不妨大胆的猜测log(N)看似是非常理想的答案,但是余数序列递减的规律并非是按照常数因子所递减的,事实上,数学家们已经证明了,在两次迭代以后,余数的值最多是原始值的一半。由此可知,迭代次数之多是2log(N) = O(logN)从而得到算法的时间复杂度。下面,我们从数学家那里问来了证明过程。

    时间复杂度证明
    定理:
    如果 M > N ,则 M mod N < M/2
    证明:如果 N<=M/2 ,则余数小于N,故定理在这种情况下成立
    如果 N>M/2 ,此时M仅含有一个N,从而余数为M-N<M/2 ,定理成立。
    从上面的例子来看,2logN 大约是20,但是实际上,我们只是运行了7次计算,可能有人会说,这个常数2不是最好的界限值。事实上,欧几里得算法的平均时间复杂度是需要大量的数学分析进行证明的,算法迭代的平均次数是(12ln2lnN)/pi^2+1.47。

    有兴趣的同学可以研究一下质因数分解等其他算法哦

  • 相关阅读:
    pbfunc外部函数扩展应用-直接在Datawindow中生成QR二维码,非图片方式
    一、PBNI环境搭建及初步使用
    Powerbuilder编写身份证校验码
    Maven本地安装JAR包组件
    使用SSH通过秘钥登录Linux
    Intellij IDEA下载
    ubuntu使用root用户登录桌面
    Ubuntu安装JDK1.8与配置环境变量
    Ubuntu 安装 JDK 7 / JDK8 的两种方式
    CentOS 7.0关闭默认防火墙启用iptables防火墙
  • 原文地址:https://www.cnblogs.com/baby-lily/p/10657288.html
Copyright © 2011-2022 走看看