欧几里得算法

欧几里得算法

  • 欧几里得算法自然语言的描述
    • 概念理解

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

计算两个非负整数p和q的最大公约数:若q是0,则最大公约数为p。否则,将p除以q得到余数r,p和q的最大公约数即为q和r的最大公约数。

概念理解

  1. 最大公约数

最大公约数:也称最大公因数,是指两个或两个以上的整数之间存在的最大共有约数,也叫除数。例如:
a=8 b=12
则a的约数分别为:1,2,4,8
b的约数分别为:1,2,3,4,6,12
经过比较可得a与b的最大公约数为4
注意: 0和任何数的最大公约数都是这个数本身

例如:a=0,b=12,则它们的最大公约数为12

  1. 辗转相除法

辗转相除法:又称欧几里得算法,其核心是:

两个整数的最大公约数= 较小的那个数与两数相除的余数最大公约数
由此可得以下假设:
假设有两个数a,b,且a>b,则a和b的最大公约数等于b与a和b相除的余数的最大公约数
知道余数为0,则根据第一点最大公约数中的注意项,我们就能得到其最大公约数


由此不断反复,我们就可以得到一个迭代算法思想

3.举例

假如需要求 1997 和 615 两个正整数的最大公约数,用欧几里德算法,是这样进行的:
1997 / 615 = 3 (余 152)
615 / 152 = 4(余7)
152 / 7 = 21(余5)
7 / 5 = 1 (余2)
5 / 2 = 2 (余1)
2 / 1 = 2 (余0)
至此,最大公约数为1
以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数,所以就得出了 1997 和 615 的最大公约数 1。

4.证明

证法一:
a可以表示成a = kb + r(a,b,k,r皆为正整数,且r 假设d是a,b的一个公约数,记作d|a,d|b,即a和b都可以被d整除。
而r = a - kb,两边同时除以d,r/d=a/d-kb/d=m,由等式右边可知m为整数,因此d|r
因此d也是b,a mod b的公约数
假设d是b,a mod b的公约数, 则d|b,d|(a-k*b),k是一个整数。
进而d|a.因此d也是a,b的公约数
因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证。

证法二:
假设c = gcd(a,b),则存在m,n,使a = mc, b = nc;
令r = a mod b,即存在k,使r = a-kb = mc - knc = (m-kn)c;
故gcd(b,a mod b) = gcd(b,r) = gcd(nc,(m-kn)c) = gcd(n,m-kn);
则c为n与m-kn的公约数;
假设d = gcd(n,m-kn), 则存在x,y, 使n = xd, m-kn = yd; 故m = yd+kn = yd+kxd = (y+kx)d;
故有a = mc = (y+kx)dc, b = nc = xdc; 可得 gcd(a,b) = gcd((y+kx)dc,xdc) = dc;
由于gcd(a,b) = c, 故d = 1;
即gcd(n,m-kn) = 1, 故可得gcd(b,a mod b) = c;
故得证gcd(a,b) = gcd(b,a mod b).## 功能快捷键

5.使用程序代码编写如下:

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

你可能感兴趣的:(算法)