最大公约数定理(欧几里得定理):gcd(a,b) = gcd(b,a mod b) (a>b 且a mod b 不为0)
最小公倍数:lcm(a,b) = a/gcd(a,b)*b;
证明:
1. 由于a>b,可以得到如下结论:
a可以表示为 a = kb + r,则r = a mod b
因此d也是(b,a mod b)的
公约数
上面证明可得,所有(a,b)的公约数都是(b, a mod b)的公约数。
现假设a > b,a mod b = r,那么有 a = nb + r。
假设m是(b, r)的公约数,那么有m是b,r,a = nb + r的公约数,即m也是(a,b)的公约数
上面证明可得,所有(b, a mod b)的公约数都是(a,b)的公约数
因此(a,b)和(b,a mod b)的公约数完全一致,因而其最大公约数也必然相等。
终止条件:(a, a mod b)->.....(a,r)->( r, 0)直到a刚好可以整除r时,再执行一步,可得到r的值,即为输入的a值,此时b值为0。
代码
int gcd(int a,int b){
int temp;
if(a<b)
return gcd(b,a);
while(b!=0){
temp = b;
b = a % b;
a = b;
}
return a;
}
2. 最小公倍数,lcm(a,b)由唯一分解定理得到。
a = p1e1 p2e2 ....pr er(其中ei都是次方,质数分解)
b = p1f1 p2f2 ......pr fr(同上)
gcd(a,b) = p1 min{e1,f1} p2 min{e2,f2} ........ pr min{er,fr}(min{ei,fi}均为次方数)
lcm(a,b) = p1 max{e1,f1} p2 max{e2,f2} ....... pr max{er,fr}(max{ei,fi}均为次方数)
gcd(a,b) * lcm(a,b) = a * b
因此,可以先求最大公约数,再求最小公倍数。
代码为
a/gcd(a,b) * b