Nejmenším společným násobkem (nsn, least common multiple - zkratka: lcm) přirozených čísel je číslo, které je násobkem každého z čísel
a je minimální.
Nejmenší společný násobek čísel značíme jako:
Výpočet
Rozklad na prvočísla
Nejjednodušším způsobem výpočtu nejmenšího společného násobku čísel je tato čísla rozložit na prvočísla a z rozkladů vybrat prvočinitele v nejvyšších mocninách. Jejich následným vynásobením získáme
.
Příklad
Jaký je nejmenší společný násobek čísel 6, 8 a 15?
Příklad
Jaký je nejmenší společný násobek čísel 140 a 72.
Příklad
Jaký je nejmenší společný násobek čísel 288 a 420?
Výše zmíněný postup si můžeme ilustrovat také pomocí Vennova diagramu, v němž budou čísla 288 a 420 reprezentována množinami svých prvočíselných dělitelů. Jelikož tyto množiny mají společné dělitele (průnik množin) uvedeny právě jednou, tak na diagramu najdeme všechny prvočinitele v jejich nejvyšších mocninách. Vynásobením všech čísel z diagramu tedy získáme nejmenší společný násobek čísel 288 a 420 (tj. 10080).
Euklidův algoritmus
Pro výpočet nejmenšího společného násobku dvou čísel lze také využít přepočtu z největšího společného dělitele. Tato metoda je zejména u velkých čísel výrazně výpočetně jednodušší než rozklad na prvočísla.
Pro efektivní výpočet nejvyššího společného dělitele můžeme použít Euklidův algoritmus.
Příklad
Kód
01.
/**
02.
* Returns least common multiple of two numbers
03.
* @param a number 1
04.
* @param b number 2
05.
* @return lcm(a, b)
06.
*/
07.
public
static
int
lcm(
int
a,
int
b) {
08.
if
(a ==
0
|| b ==
0
) {
09.
return
0
;
10.
}
11.
return
(a * b) / gcd(a, b);
12.
}
13.
14.
/**
15.
* Returns greatest common divisor of the given numbers
16.
* @param a number 1
17.
* @param b number 2
18.
* @return gcd(a, b)
19.
*/
20.
public
static
int
gcd(
int
a,
int
b) {
21.
if
(a <
1
|| b <
1
) {
22.
throw
new
IllegalArgumentException(
"a or b is less than 1"
);
23.
}
24.
int
remainder =
0
;
25.
do
{
26.
remainder = a % b;
27.
a = b;
28.
b = remainder;
29.
}
while
(b !=
0
);
30.
return
a;
31.
}
01.
/**
02.
* Nejmensi spolecny nasobek cisel "a" a "b"
03.
* @param a cislo "a"
04.
* @param b cislo "b"
05.
* @return lcm(a, b)
06.
* @autor Thomas (www.adamjak.net)
07.
*/
08.
public
static
int
lcm(
int
a,
int
b)
09.
{
10.
if
(a == 0 || b == 0)
11.
{
12.
return
0;
13.
}
14.
return
(a * b) / gcd(a, b);
15.
}
16.
17.
/**
18.
* Nejvetsi spolecny delitel cisel "a" a "b"
19.
* @param a cislo "a"
20.
* @param b cislo "b"
21.
* @return gcd(a, b)
22.
* @autor Thomas (www.adamjak.net)
23.
*/
24.
public
static
int
gcd(
int
a,
int
b)
25.
{
26.
if
(a < 1 || b < 1)
27.
{
28.
throw
new
ArgumentException(
"a or b is less than 1"
);
29.
}
30.
int
r = 0;
31.
do
32.
{
33.
r = a % b;
34.
a = b;
35.
b = r;
36.
}
while
(b != 0);
37.
return
a;
38.
}
01.
/**
02.
* Nejmensi spolecny nasobek cisel "a" a "b"
03.
* @param $a cislo "a"
04.
* @param $b cislo "b"
05.
* @return lcm(a, b)
06.
* @autor Thomas (www.adamjak.net)
07.
*/
08.
function
lcm(
$a
,
$b
) {
09.
if
(
$a
== 0 ||
$b
== 0) {
10.
return
0;
11.
}
12.
return
(
$a
*
$b
) / gcd(
$a
,
$b
);
13.
}
14.
15.
/**
16.
* Nejvetsi spolecny delitel cisel "a" a "b"
17.
* @param $a cislo "a"
18.
* @param $b cislo "b"
19.
* @return gcd(a, b)
20.
* @autor Thomas (www.adamjak.net)
21.
*/
22.
function
gcd(
$a
,
$b
) {
23.
if
(
$a
< 1 ||
$b
< 1) {
24.
die
(
"a or b is less than 1"
);
25.
}
26.
$r
= 0;
27.
do
{
28.
$r
=
$a
%
$b
;
29.
$a
=
$b
;
30.
$b
=
$r
;
31.
}
while
(
$b
!= 0);
32.
return
$a
;
33.
}
Literatura
- POLÁK, Josef. Přehled středoškolské matematiky. 8. vydání. Praha 4 : Prometheus, 2005. 608 s.