最大公约数&最小公倍数
最大公约数
最大公约数\((Greatest Common Divisor)\),常缩写为\(GCD\)。一组数的公约数,是指同时同时整除这组数中每一个数的数。最大公约数,是指所有公约数中最大的数。
那么如何求最大公约数呢?我们先考虑两个数的情况。
欧几里得算法
现在我们一张两个数,那么要如何求它们的最大公约数呢?我们不妨设\(a>b\)。
-
当\(b\mid a\)时,那么\(b\)就是两者的最大公约数
-
当\(b \nmid a\),即\(a=b\times q+r\),其中\(r<b\)时,我们可以证明得到\(gcd(a,b) = gcd(b,a \: mod\: b)\)。
设\(a=b\times k+c\),显然有\(c=a\:mod\:b\)。设,\(d\:|\:a,d\:|\:b\),则有\(c\:|\:d\),因为\(c=a-b\times k,\) 所以\(d\:|(a-b\times k)\),即\(d\:|(a\:mod\:b)\)。
既然\(d\)是它们两个的公约数,所以有\(gcd(a,b) = gcd(b,a \: mod\: b)\)。于是我们也就得到了关于两个数的最大公约数的一个递归求法。时间复杂度为\(O(logN)\)。
inline int gcd(int a, int b){ return b ? gcd(b,a%b) : a; }
这个函数也揭示了一个概念,即任何非零整数和零的最大公约数为它本身。
当\(gcd(a,b)=1\)时,我们称之为互质。
最小公倍数
最小公倍数(Least Common Multiple),常缩写为\(LCM\)。两个或多个整数公有的倍数叫做它们的公倍数,其中除0以外最小的一个公倍数就叫做这几个整数的最小公倍数。
我们都知道\(gcd(a,b)\times lcm(a,b)=a\times b\)。所以我们要求两个数的最小公倍数,先求出最大公约数即可。