描述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})}}
,
证毕。
程式代碼
以下使用輾轉相除法 求得最大公因數,之後再求最小公倍數。
C
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 );
}
C++
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 );
}
C#
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 );
}
Go
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 )
}
Java
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 );
}
Pascal
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 ;
Python
def gcd ( a , b ):
return a if b == 0 else gcd ( b , a % b )
def lcm ( a , b ):
return a * b / gcd ( a , b )
Ruby
def gcd ( a , b )
b . zero? ? a : gcd ( b , a % b )
end
def lcm ( a , b )
a * b / gcd ( a , b )
end
Swift
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的最小公倍数。
參見
參考來源