辗转相除算法的简介
在数论中,辗转相除法(国际上一般称为Euclidean Algorithm 或Euclid's Algorithm,即欧几里得算法)是一种求任意两个欧几里得环(Euclidean Domain)中的单位(如:整数)的最大公约数的算法。
这个算法的一个重要特点就是其不需要通过分解因式来求取最大公约数。
辗转相除法正因为其易操作性与易实现性而成为了计算机编程中的一个重要的求最大公约数的常用算法。
辗转相除法的过程描述与应用
给出两个自然数a 和b:检查b是否为0;如果是,则a为最大公约数。
如果不是,则分别用b和a 除b的余数作为上一步中的 a 和 b重复这一检查步骤。
正如上面所提到的,辗转相除法是编程中求最大公约数的常用算法,那么下面就是一个C++中通过递归实现辗转相除法的程序段范例:
[cpp]view plaincopy
1.int gcd(int a, int b)
2.{
3.return b == 0 ? a : gcd(b, a % b);
4.}
注:过程名设为gcd是为了更明显的标明这段程序的意图。
因为gcd 是greatest common divisor (最大公约数)的缩写。
再编写辗转相除法求最大公约数的过程是,最好将其命名为gcd 以方便他人日后阅读。
辗转相除法的证明
设两数为a、b(a > b),求它们最大公约数的步骤如下:
设q = a / b,r = a % b, 得a=bq+r(0≤r<b)。
1)若r = 0, 则b是a和b的最大公约数。
2)若r≠0,则继续考虑。
首先,应该明白的一点是任何a 和b 的公约数都是r 的公约数。
要想证明这一点,就要考虑把r 写成r=a-bq。
现在,如果a 和b 有一个公约数d,而且设a=sd , b=td, 那么r = sd-tdq = (s-tq)d。
因为这个式子中,所有的数(包括s-tq )都为整数,所以r 可以被d 整除。
对于所有的d 的值,这都是正确的;所以a 和b 的最大公约数也是b 和r 的最大公约数。
因此我们可以继续对b 和r 进行上述取余的运算。
这个过程在有限的重复后,可以最终得到r=0 的结果,我们也就得到了 a 和b 的最大公约数。
最小公倍数证明:
最小公倍数= 两数之积/ 最大公约数(可以了解一下短除法)
证明:
设a,b两个整数,最大公约数为gcd,最小公倍数为lcm。
则a = k1 * gcd, b = k2 * gcd
lcm = a * t1 = k1 * gcd * t1 = p * k1;
lcm = b * t2 = k2 * gcd * t2 = q * k2;
又因为gcd(k1, k2) = 1,所以lcm = k1 * k2 * gcd = a * b / gcd;
所以,最小公倍数= 两数之积/ 最大公约数
证法2:
因为k1 * gcd * t1 = lcm = k2 * gcd * t2
并且k1,k2互质,t1,t2互质,所以,k1 = t2, k2 = t1;
代入lcm = k1 * gcd * t1 = k1 * k2 * gcd = a * b / gcd ;
所以,最小公倍数= 两数之积/ 最大公约数
两个数的最大公约数和最小公倍数之积与这两个数之积相等证明:
证明:设两个数a,b,他们的最大公约数是p,最小公倍数是q,令:
a=pm,b=pn,a=q/e,b=q/d。
………………………………………①
那么由最大公约数和最小公倍数的定义可得知:m与n互质,e与d也互质。
……②由①知道:m/n=d/e,再由②继续得知:m=d,n=e
而ab=pm×q/d=pq×m/d=pq,ab=pq
原式得证。
及两个数的最大公约数和最小公倍数之积与这两个数之积相等。