描述12、18之間的因倍數關係的文氏圖 最小公倍數 (英語:least common multiple,lcm)是数论 中的一个概念。若有一個數X {\displaystyle X} ,可以被另外兩個數A {\displaystyle A} 、B {\displaystyle B} 整除 ,且X {\displaystyle X} 同時大於或等于A {\displaystyle A} 和B {\displaystyle B} ,則X {\displaystyle X} 為A {\displaystyle A} 和B {\displaystyle B} 的公倍數 。A {\displaystyle A} 和B {\displaystyle B} 的公倍數有無限個,而所有正的公倍數中,最小的公倍數就叫做最小公倍數。同样地,若干个整数公有的倍数中最小的正整数称为它们的最小公倍数。n {\displaystyle n} 个整数a 1 , a 2 , ⋯ , a n {\displaystyle a_{1},a_{2},\cdots ,a_{n}} 的最小公倍数一般记作:[ a 1 , a 2 , ⋯ , a n ] {\displaystyle [a_{1},a_{2},\cdots ,a_{n}]} ,或者参照英文记法记作lcm ( a 1 , a 2 , ⋯ , a n ) {\displaystyle \operatorname {lcm} (a_{1},a_{2},\cdots ,a_{n})} 。
对分數 进行加減运算時,要求兩數的分母 相同才能計算,故需要通分;标准的计算步骤是将兩個分數的分母通分成它们的最小公倍數,然后将通分后的分子相加。
两个整数 的最小公倍数与最大公因数 之间有如下的关系:
lcm ( a , b ) = | a ⋅ b | gcd ( a , b ) {\displaystyle \operatorname {lcm} (a,b)={\frac {|a\cdot b|}{\operatorname {gcd} (a,b)}}} 最小公倍数可以通过多种方法得到,最直接的方法是列举法,从小到大列举出其中一个数(如最大數)的倍数,当这个倍数也是另一个数的倍数时,就求得最小公倍数。另一个方法是利用公式lcm ( a 1 , a 2 ) = a 1 a 2 gcd ( a 1 , a 2 ) {\displaystyle \operatorname {lcm} (a_{1},a_{2})={\frac {a_{1}a_{2}}{\gcd(a_{1},a_{2})}}} 来求解,这时首先要知道它们的最大公因数。而最大公因数可以通过短除法 得到。
利用整数的唯一分解定理 ,还可以用質因數分解 法。将每个整数进行质因数分解。对每个质数,在质因数分解的表达式中寻找次数最高的乘幂,最后将所有这些质数乘幂相乘就可以得到最小公倍数。譬如求216 、384 和210 的最小公倍數。对216 、384 和210 来说:
216 = 2 3 × 3 3 {\displaystyle 216=2^{3}\times 3^{3}} ,384 = 2 7 × 3 1 {\displaystyle 384=2^{7}\times 3^{1}} ,210 = 2 1 × 3 1 × 5 1 × 7 1 {\displaystyle 210=2^{1}\times 3^{1}\times 5^{1}\times 7^{1}} 。其中2 {\displaystyle 2} 对应的最高次乘幂为2 7 {\displaystyle 2^{7}} ;3 {\displaystyle 3} 对应的最高次乘幂为3 3 {\displaystyle 3^{3}} ;5 {\displaystyle 5} 和7 {\displaystyle 7} 对应的最高次乘幂分别是5 1 {\displaystyle 5^{1}} 与7 1 {\displaystyle 7^{1}} 。将这些乘幂乘起来,就可以得到最小公倍数: [ 216 , 384 , 210 ] = 2 7 × 3 3 × 5 1 × 7 1 = 120960 {\displaystyle [216,384,210]=2^{7}\times 3^{3}\times 5^{1}\times 7^{1}=120960} 。短除法
利用短除法,可以快速计算出多个整数的最小公倍数。
以下为例子:
假设我们要求12、20和42的最小公倍数。
a: 6|12 18 42
b: 2 3 7
最小公倍数=a×b
因此,12、18和42和最小公倍数=6×2×3×7
所以,6×2×3×7=252,12、18和42的最小公倍数是252
可以递归求出多个整数的最小公倍数:欲求lcm ( a 1 , . . . , a n ) ( n ≥ 3 ) {\displaystyle \operatorname {lcm} (a_{1},...,a_{n})(n\geq 3)} ,只需求lcm ( a 1 , . . . , a n − 2 , lcm ( a n − 1 , a n ) ) {\displaystyle \operatorname {lcm} (a_{1},...,a_{n-2},\operatorname {lcm} (a_{n-1},a_{n}))} 。
这利用了性质lcm ( a 1 , a 2 , a 3 ) = lcm ( lcm ( a 1 , a 2 ) , a 3 ) {\displaystyle \operatorname {lcm} (a_{1},a_{2},a_{3})=\operatorname {lcm} (\operatorname {lcm} (a_{1},a_{2}),a_{3})} 。该性质证明如下:
记a 1 , a 2 , a 3 {\displaystyle a_{1},a_{2},a_{3}} 的质因数分解分别为∏ i = 1 n p i e 1 i , ∏ i = 1 n p i e 2 i , ∏ i = 1 n p i e 3 i {\displaystyle \prod _{i=1}^{n}p_{i}^{e_{1i}},\prod _{i=1}^{n}p_{i}^{e_{2i}},\prod _{i=1}^{n}p_{i}^{e_{3i}}} ,其中p i {\displaystyle p_{i}} 是第i {\displaystyle i} 个质数。
那么根据最小公倍数的定义,lcm ( a 1 , a 2 , a 3 ) = ∏ i = 1 n p i max ( e 1 i , e 2 i , e 3 i ) {\displaystyle \operatorname {lcm} (a_{1},a_{2},a_{3})=\prod _{i=1}^{n}p_{i}^{\max(e_{1i},e_{2i},e_{3i})}} ,
lcm ( lcm ( a 1 , a 2 ) , a 3 ) = lcm ( ∏ i = 1 n p i max ( e 1 i , e 2 i ) , a 3 ) = ∏ i = 1 n p i max ( max ( e 1 i , e 2 i ) , e 3 i ) = ∏ i = 1 n p i max ( e 1 i , e 2 i , e 3 i ) {\displaystyle \operatorname {lcm} (\operatorname {lcm} (a_{1},a_{2}),a_{3})=\operatorname {lcm} (\prod _{i=1}^{n}p_{i}^{\max(e_{1i},e_{2i})},a_{3})=\prod _{i=1}^{n}p_{i}^{\max(\max(e_{1i},e_{2i}),e_{3i})}=\prod _{i=1}^{n}p_{i}^{\max(e_{1i},e_{2i},e_{3i})}} ,
证毕。
以下使用輾轉相除法 求得最大公因數,之後再求最小公倍數。
int GCD ( int a , int b ) { if ( b ) while (( a %= b ) && ( b %= a )); return a + b ; } int LCM ( int a , int b ) { return a * b / GCD ( a , b ); } template < typename T > T GCD ( T a , T b ) { if ( b ) while (( a %= b ) && ( b %= a )); return a + b ; } template < typename T > T LCM ( T a , T b ) { return a * b / GCD ( a , b ); } int GCD ( int a , int b ) { return a % b == 0 ? b : GCD ( b , a % b ); } int LCM ( int a , int b ) { return a * b / GCD ( a , b ); } func GCD ( a , b int ) int { if b == 0 { return a } return GCD ( b , a % b ) } func LCM ( a , b int ) int { return a * b / GCD ( a , b ) } int GCD ( int a , int b ) { return a % b == 0 ? b : GCD ( b , a % b ); } int LCM ( int a , int b ) { return a * b / GCD ( a , b ); } function gcd ( a , b : integer ) : longint ; begin if b = 0 then gcd := a else gcd := gcd ( b , a mod b ) ; end ; function lcm ( a , b : integer ) : longint ; begin lcm := ( a * b ) div gcd ( a , b ) ; end ; def gcd ( a , b ): return a if b == 0 else gcd ( b , a % b ) def lcm ( a , b ): return a * b / gcd ( a , b ) def gcd ( a , b ) b . zero? ? a : gcd ( b , a % b ) end def lcm ( a , b ) a * b / gcd ( a , b ) end func gcd ( _ a : Int , _ b : Int ) -> Int { return b == 0 ? a : gcd ( b , a % b ) } func lcm ( _ a : Int , _ b : Int ) -> Int { return a * b / gcd ( a , b ) } 求最小公倍数是进行分数加减法时的步骤之一。将分母通分时,会把所有分数的分母通分为它们的最小公倍数,然后将分子相加。例如:
2 21 + 1 6 = 4 42 + 7 42 = 11 42 {\displaystyle {2 \over 21}+{1 \over 6}={4 \over 42}+{7 \over 42}={11 \over 42}} 其中分母42就是21与6的最小公倍数。