Největším společným dělitelem (nsd, greatest common divisor (zkratka: gcd)) přirozených čísel je číslo, které dělí každé z těchto čísel, a je maximální.
Výpočet
Rozklad na prvočísla
Nejjednodušším způsobem výpočtu největšího společného dělitele je rozložit jednotlivá zkoumaná čísla na prvočísla a z nich vybrat prvočinitele v nejmenší společné mocnině (nejmenším z exponentů). Vynásobením prvočinitelů v příslušných mocninách získáme největšího společného dělitele daných čísel.
Příklad
Jaký je nejvyšší společný dělitel čísel 72, 48 a 54?
Příklad
Jaký je nejvyšší společný dělitel čí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ů. V průniku těchto množin nalezneme největšího společného dělitele zmíněných čísel.
Euklidův algoritmus
Rozklad na prvočísla (faktorizace) je z výpočetního hlediska velmi náročný problém. Proto pro efektivní výpočet největšího společného dělitele velkých čísel používáme Euklidův algoritmus.
Princip
Vstupem algoritmu jsou dvě přirozená čísla a
. Algoritmus v každém svém kroku vydělí se zbytkem číslo
číslem
. Pokud zbytek není nulový, tak do
přiřadí číslo
a zbytek po dělení přiřadí do uvolněné proměnné
a celý postup opakuje.
V okamžiku, kdy je zbytek po dělení nulový, je v proměnné uložen největší společný dělitel čísel
a
.
Pro podrobnější výklad si můžete přečíst tento článek.
Příklad
Jaký je největší společný dělitel čísel 133 a 15?
Příklad
Jaký je největší společný dělitel čísel 140 a 15?
Nejmenší společný násobek
Pro získání nejmenšího společného násobku dvou čísel můžeme využít následující přepočet:
Příklad
Jaký je nejmenší společný násobek čísel 140 a 15?
Kód
01.
/**
02.
* Vstup: Čísla a > 0, b > 0
03.
* Výstup: gcd(a, b)
04.
*/
05.
function gcd(a, b)
06.
if
a >= b then
07.
m = a
08.
n = b
09.
else
10.
m = b
11.
n = a
12.
13.
while
n !=
0
do
14.
m = p*n + z
15.
m = n
16.
n = z
17.
18.
return
m
01.
/**
02.
* Returns greatest common divisor of the given numbers
03.
* @param a number 1
04.
* @param b number 2
05.
* @return gcd(a, b)
06.
*/
07.
public
static
int
gcd(
int
a,
int
b) {
08.
if
(a <
1
|| b <
1
)
throw
new
IllegalArgumentException(
"a or b is less than 1"
);
09.
while
(b !=
0
) {
10.
int
tmp = a;
11.
a = b;
12.
b = tmp % b;
13.
}
14.
return
a;
15.
}
01.
/**
02.
* Nejvetsi spolecny delitel cisel "a" a "b"
03.
* @param a cislo "a"
04.
* @param b cislo "b"
05.
* @return gcd(a, b)
06.
* @autor Thomas (www.adamjak.net)
07.
*/
08.
int
gcd(
int
a,
int
b)
09.
{
10.
if
(a < 1 || b < 1)
11.
{
12.
printf
(
"a or b is less than 1"
);
13.
return
-1;
14.
}
15.
16.
int
r = 0;
17.
18.
do
19.
{
20.
r = a % b;
21.
a = b;
22.
b = r;
23.
}
while
(b != 0);
24.
25.
return
a;
26.
}
01.
/**
02.
* Nejvetsi spolecny delitel cisel "a" a "b"
03.
* @param a cislo "a"
04.
* @param b cislo "b"
05.
* @return gcd(a, b)
06.
* @autor Thomas (www.adamjak.net)
07.
*/
08.
public
static
int
gcd(
int
a,
int
b)
09.
{
10.
if
(a < 1 || b < 1)
11.
{
12.
throw
new
ArgumentException(
"a or b is less than 1"
);
13.
}
14.
int
r = 0;
15.
do
16.
{
17.
r = a % b;
18.
a = b;
19.
b = r;
20.
}
while
(b != 0);
21.
return
a;
22.
}
01.
/**
02.
* Nejvetsi spolecny delitel cisel "a" a "b"
03.
* @param $a cislo "a"
04.
* @param $b cislo "b"
05.
* @return gcd(a, b)
06.
* @autor Thomas (www.adamjak.net)
07.
*/
08.
function
gcd(
$a
,
$b
) {
09.
if
(
$a
< 1 ||
$b
< 1) {
10.
die
(
"a or b is less than 1"
);
11.
}
12.
$r
= 0;
13.
do
{
14.
$r
=
$a
%
$b
;
15.
$a
=
$b
;
16.
$b
=
$r
;
17.
}
while
(
$b
!= 0);
18.
return
$a
;
19.
}
1.
mgcd(
X
,
X
,
X
).
2.
mgcd(
X
,
Y
,
X
) :-
Y
== 0.
3.
mgcd(
X
,
Y
,
R
) :-
Y
>
X
, mgcd(
Y
,
X
,
R
).
4.
mgcd(
X
,
Y
,
R
) :-
X
>
Y
,
R
1
is
X
mod
Y
, mgcd(
Y
,
R
1,
R
).