LCM(最小公倍数)和 GCD(最大公因数)在做 ACM 题时经常会用到,求两个整数的 LCM 和 GCD 有两种方法。
1. 辗转相除法(欧几里得算法)
-
定理:对于任意的两个整数 a,b(a≥b), 有 (a,b)=(b,a%b) 。((a,b) 表示 a 和 b 的最大公因数)
证明如下:
a=qb+r,其中 q 为整数,0≤a<b 。
设 d=(a,b),则 b=md,a=nd 。
则 a=qmd+r=nd,进一步推出 r=(n−qm)d 。
故 d 也是 r 的因数,即 d≤(b,r)=(b,a%b) 。
同理,设 p=(a,a%b)=(a,r),则 r=sp,b=tp,d≤p 。
则 a=qtp+sp=(qt+s)p 。
故 p 也是 a 的因数, 即 p≤(a,b)=d 。
综上,d=p,原命题得证 。
所以要求两个数的最大公因数,只需根据递推式不断进行递推,并更新 a=b, b=a%b, 直到 a%b=0 为止,则此时的 a 即为 (a,b) . 求得 (a,b) 以后,则 [a,b] (最小公倍数)便可由 ab/(a,b) 求得 。
2. 素因子分解
-
定理:任意一个正整数都能分解成若干个素数的幂的乘积的形式。
证明略 。
由此可知,a=p1a1p2a2⋯pnan,b=p1b1p2b2⋯pnbn . 其中 ai,bi≥0 。
故
(a,b)=p1min(a1,b1)p2min(a2,b2)⋯pnmin(an,bn)[a,b]=p1max(a1,b1)p2max(a2,b2)⋯pnmax(an,bn)