最大公约数与最小公倍数,又分别被称为gcd与lcm,在引入该概念之前,我们先来看看整除性问题。
定义:设a,b是两个整数,且b ≠ 0。如果存在整数c,使a=bc,则称a被b整除,或b整除a,记作 b | a。
最大公约数与最小公倍数的性质:
(1)若a | m,b | m,则 lcm(a,b) | m 。
(2)若d | a,d | b,则d | gcd(a,b)。
(3)lcm(a,b) = ab / gcd(a,b)。
(4)设m,a,b是正整数,则 lcm(ma,mb) = m*gcd(a,b)。
(5)设a=qb+r,其中a,b,q,r都是整数
则有:gcd(a,b) = gcd(b,r)
由性质5引伸出辗转相除法,又称欧几里得算法
long long gcd(long long a, long long b) { if (a < b)return gcd(b, a); if (b == 0)return a; else return gcd(b, a%b); }
经过优化的分奇数和偶数的欧几里得算法
long long gcd(long long x, long long y) { if (x < y) return gcd(y, x);//大数放在前面 if (y == 0) return x; else { if (!(x % 2)) { if (!(y % 2)) return 2 * gcd(x >> 1, y >> 1);//x,y皆为偶数 else return gcd(x >> 1, y);//x为偶数,y是奇数 } else { if (!(y % 2)) return gcd(x, y >> 1);//x是奇数,y是偶数 else return gcd(y, x - y);//x,y都是奇数 } } }
求最小公倍数的算法,这里直接套用公式,但是要注意,先除后乘,防止在运算过程爆数据
long long lcm(long long a, long long b) { return a / lcm(a, b)*b; }
拉梅定理
用欧几里得算法计算两个正整数的最大公因子时,所需的除法次数不会超过两个整数中较小的那个十进制数的倍数的5倍。
拉梅定理推论:求两个正整数a,b,a>b的最大公因子需要O(log2(a))^3次的位运算。