辗转相除法(欧几里得算法)详解

什么是辗转相除法

辗转相除法又称欧几里德算法,是指用于计算两个正整数a,b的最大公因数的一种算法。

广泛应用于数学和计算机两个方面。

计算公式:gcd(a, b) = gcd(b, a%b)

高一数学必修三就有讲了,学起来也很简单啦……

辗转相除法的一些特点

  • 除法为主。
  • 两整数差值较大时运算次数较少
  • 相除余数为0时得到结果。
  • 循环表示的递推式子,也可以递归实现。

辗转相除法的证明

设两数为a, b(a>b),用gcd(a, b)表示a, b的最大公约数,r=a (mod b) 为a除以b的余数,k为a除以b的商,即a÷b=kr。辗转相除法即是要证明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)cd,b=nc=ycd,则a与b的一个公约数cd>c,故c非a与b的最大公约数,与前面结论矛盾),因此c也是b与r的最大公约数。

从而可知gcd(b, r)=c,继而gcd(a, b)=gcd(b, r)。

举个栗子

【例】求56和24的最大公因数

56%24 = 8

24%8 = 0

∴结果为8

拓展应用

由于 → 最大公约数和最小公倍数的乘积就是原两个数的积。

所以在根据gcd()求出最大公因数以后,就可以根据两数本身和其最大公因数求出最小公倍数咯!

Java的API

java.math.BigInteger 中有 gcd() 方法:
public BigInteger gcd​(BigInteger val)

Java模板

【非递归版本】

private static int gcd (int p, int q) {
    if (q == 0) {
        return p;
    } else {
        return gcd (q, p%q);
    }
}

【递归版本】

private static int gcd (int p, int q) {
    while (q != 0) {
        int temp = p % q;
        p = q;
        q = temp;
    }
    return p;
}

【long版本】

public static long gcd(long p, long q) {
    while(q != 0) {
        long temp = p % q;
        p = q;
        q = temp;
    }
    return p;
}

C/C++模板

int gcd(int p, int q) {
   if(q == 0) {
       return p;
   } else {
       gcd(q, p%q);
   }
}

实战演练

Here

说明

这个算法看似简单,但是一定要掌握的基本算法,要好好掌握呀~~

如果有帮助,是不是应该点个赞再走呢?OrzOrz

你可能感兴趣的:(#,Algorithm-Core)