原文地址:http://blog.csdn.net/niushuai666/article/details/7278027
辗转相除算法的简介
在数论中,辗转相除法(国际上一般称为Euclidean Algorithm 或 Euclid's Algorithm,即欧几里得算法)是一种求任意两个欧几里得环(Euclidean Domain)中的单位(如:整数)的最大公约数的算法。这个算法的一个重要特点就是其不需要通过分解因式来求取最大公约数。辗转相除法正因为其易操作性与易实现性而成为了计算机编程中的一个重要的求最大公约数的常用算法。
辗转相除法的过程描述与应用
给出两个自然数 a 和 b:检查 b 是否为0;如果是,则 a 为最大公约数。如果不是,则分别用 b 和 a 除 b 的余数作为上一步中的 a 和 b 重复这一检查步骤。
正如上面所提到的,辗转相除法是编程中求最大公约数的常用算法,那么下面就是一个C++中通过递归实现辗转相除法的程序段范例:
int gcd(int a, int b)
{
return b == 0 ? a : gcd(b, a % b);
}
注:过程名设为 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
原式得证。及两个数的最大公约数和最小公倍数之积与这两个数之积相等。