最大公約數與最小公倍數,又分別被稱爲gcd與lcm,在引入該概念以前,咱們先來看看整除性問題。算法
定義:設a,b是兩個整數,且b ≠ 0。若是存在整數c,使a=bc,則稱a被b整除,或b整除a,記做 b | a。優化
最大公約數與最小公倍數的性質:spa
(1)若a | m,b | m,則 lcm(a,b) | m 。code
(2)若d | a,d | b,則d | gcd(a,b)。blog
(3)lcm(a,b) = ab / gcd(a,b)。class
(4)設m,a,b是正整數,則 lcm(ma,mb) = m*gcd(a,b)。gc
(5)設a=qb+r,其中a,b,q,r都是整數數據
則有:gcd(a,b) = gcd(b,r)di
由性質5引申出展轉相除法,又稱歐幾里得算法co
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次的位運算。