Algorithms4th 1.1.25 欧几里得算法——数学归纳法证明

欧几里得算法的自然语言描述

计算两个非负整数p和q的最大公约数:

若q是0,则最大公约数为p。否则将p除以q得到余数r,p和q的最大公约数即为q和r的最大公约数。

 

数学归纳法证明

基础步骤:

若q = 0,则 gcd(p, q) = gcd(p, 0) = p。

归纳步骤:

令 p = a * q + r, 其中 p、a、q、r 均为非负整数。

设 d 整除 p 和 q, 则 d 可以整除 p - a * q = r,即 p / d = a*q / d + r / d 。

此时, d 为 p,q 的公约数,且 d 为 q,r 的公约数,即 p 和 q 的公约数 = q 和 r 的公约数 = d 。

也即 gcd(p, q) = gcd(q, r) ,  其中 r 为 p 除以 q 的余数。

不断归纳,直至函数 gcd 的第二个参数为0,此时得到基础步骤。

此时我们已经证明了最终的结果是 p 和 q 的一个约数。

 

然而这还没完,因为我们只证明了最终结果是一个公约数,但没有证明它是最大的公约数。

 

因为 d 整除 p 和 q,可得 d 整除 p - a * q = r, 因此 p 和 q 的任意约数也为 q 和 r 的约数;

同理,d整除 q 和 r, 可得 d 整除 a * q + r  = p, 因此q 和 r 的任意约数也为 p 和 q 的约数。

综上,p 和 q 的约数集等于 q 和 r 的约数集。

 

接下来由递推法:

假定当函数gcd()的第二个参数为0时,第一个参数为m,可得 p 和 q 的约数集与 m 和 0 的约数集相同。

由数学归纳法的基础情况知, 而 m 和 0 的最大公约数为 m, 即 m 和 0 的约数集的最大值为 m,

由此可得 p 和 q 的约数集的最大值也为 m 。

 

综上,欧几里得算法得证。

 

献上Java代码:

 1 public class Euclid
 2 {
 3     public static int gcd(int p, int q) {
 4       if(q == 0)
 5           return p;
 6       int r = p % q;
 7       return gcd(q,r);
 8     }
 9 
10     public static void main(String[] args) {
11         int result = gcd(16, 24);
12         System.out.println(result);
13   }
14 }

 

posted @ 2019-03-12 22:31  Amadues  阅读(907)  评论(0编辑  收藏  举报