美文网首页
2019-02-27 辗转相除(数学证明及算法)

2019-02-27 辗转相除(数学证明及算法)

作者: 做梦枯岛醒 | 来源:发表于2019-02-27 21:23 被阅读0次

1.概述

辗转相除,又称欧几里得算法,用于求最大公约数
Java实现如下:

//循环实现
 private static int gcd(int a, int b) {
        int temp = 0;
        while(b != 0){
          // 换位 
            temp = a % b;
            a = b;
            b = temp;
        }
        return a;
    }
//递归实现
 int gcd(int a, int b) {
      return b == 0 ? a : gcd(b, a % b);
 }

这个算法实现很简单,但是这么难理解可是让人“辗转”呀

那到底是什么样子呢?我们以递归的代码来分析。
首先我们证明一个东西

下面的证明参考:http://www.cnblogs.com/zwffff/archive/2010/08/25/1808178.html

求证:gcd(m,n)=gcd(n,b)

其中

  • m和n是两个数,gcd(m,n)表示m和n的最大公约数
  • 设a , b分别是m除以n的商和余数,即m=n * a+b

证明:

设c=gcd(m,n), d=gcd(n,b)

∵ c为m和n的公约数,
∴ m能被c整除,n也能被c整除
∴ n * a可以被c 整除 【注1】
∴ m - n * a 也能被c整除 【注2】
∵ 题目条件m=n * a+b
∴ m - n * a = b
∴ c为n和b的公约数
∵d为n和b的最大公约数
∴ c <= d 【注3】

∵ d为n和b的公约数
∴ n能被d整除,b也能被d整除
∴ n * a 能被d整除 【注1】
∴ n * a + b 能被d整除,根据题目条件,也即m能被d整除
∴ d为m和n的公约数
∵ c为m和n的最大公约数
∴ d <= c

∴ 综上,d = c
即gcd(m,n)=gcd(n,b) 证毕

【注1】:

n / c = x (其中x为整数)
n * a / c = x * a (a也为整数)
即n能被c整除,n*a也能

【注2】

m ÷ c = x1 (x1为整数)
n * a ÷ c = x * a(x,a为整数)
m ÷ c - n * a ÷ c = x1 - x * a (结果也为整数)

【注3】

注意公约数与最大公约数之间的区别。
如第一段证明,我们所求只能的c是n和b的公约数,但不能下定论说c是最大公约数。

2.求解算法

有了上面的证明过程,我相信你已经明白了算法的内含。

//递归实现
 int gcd(int m, int n) {
      return b == 0 ? m : gcd(n, m % n);
 }

因为gcd(m,n)=gcd(n,b)啊,
所以我们求m和n的公约数,只需要求n和b(即m % n)的即可
那什么时候是个头呢? 应该是 b = 0的时候,b是个余数,余数都等于0了就是最简状态了,而且下一步0不能被当作分母来运算,这就标志着算法的结束。

而此时最简状态的 m(形参) 即是最大公约数。
更深入的理解 当 m % n = 0,(这里的m,n指的是形参)即 m 是 n 的倍数时,此时,n 就是 m 的最大公约数 。(形参中对应m,好绕好绕……)

同样,循环算法也是类似的道理。

注:你不必管m ,n谁大谁小,因为有个辗转的过程,他们会自动调整。

相关文章

  • 2019-02-27 辗转相除(数学证明及算法)

    1.概述 辗转相除,又称欧几里得算法,用于求最大公约数Java实现如下: 这个算法实现很简单,但是这么难理解可是让...

  • 算法-辗转相除法

    算法:辗转相除法(欧几里得算法) GCD递归定理 辗转相除法算法概述 辗转相除法伪代码 辗转相除法代码实现 对于两...

  • [最大公约数] 欧几里得算法(辗转相除法)

    在数学中,欧几里得算法,又称辗转相除法,是求最大公约数(greatest common divisor)的算法。辗...

  • 辗转相除法求最大公因数 2020-03-12

    今天做了一道题,需要求最大公因数,已经完全把辗转相除法忘记了,特此记录 辗转相除法 辗转相除法,也叫欧几里得算法,...

  • 算法:辗转相除法

    题目:要求方法传两个正整数参数,返回值就是他们的最大公约数。 解法一:(性能最差) 解法二:辗转相除法,又名欧几里...

  • 扩展欧几里德算法

    扩展欧几里得算法(英语:Extended Euclidean algorithm)是欧几里得算法(又叫辗转相除法)...

  • 欧几里得算法(最大公因数)

    问题## 欧几里德算法又称辗转相除法,用于计算两个正整数a,b的最大公约数。例如,gcd(50,15)=5。 证明...

  • 扩展欧几里得算法

    扩展欧几里得算法(Extended Euclidean algorithm)是欧几里得算法(又叫辗转相除法)的扩展...

  • 欧几里得算法

    欧几里得算法 介绍 概念 欧几里得算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数。应用领域有数学和...

  • 用java实现欧几里得算法

    “欧几里得算法:欧几里德算法又称辗转相除法,是指用于计算两个正整数a,b的最大公约数。应用领域有数学和计算机两个方...

网友评论

      本文标题:2019-02-27 辗转相除(数学证明及算法)

      本文链接:https://www.haomeiwen.com/subject/vodquqtx.html