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
/** * Vstup: Čísla a > 0, b > 0 * Výstup: gcd(a, b) */ function gcd(a, b) if a >= b then m = a n = b else m = b n = a while n != 0 do m = p*n + z m = n n = z return m
/** * Returns greatest common divisor of the given numbers * @param a number 1 * @param b number 2 * @return gcd(a, b) */ public static int gcd(int a, int b) { if (a < 1 || b < 1) throw new IllegalArgumentException("a or b is less than 1"); while (b != 0) { int tmp = a; a = b; b = tmp % b; } return a; }
/** * Nejvetsi spolecny delitel cisel "a" a "b" * @param a cislo "a" * @param b cislo "b" * @return gcd(a, b) * @autor Thomas (www.adamjak.net) */ int gcd(int a, int b) { if (a < 1 || b < 1) { printf("a or b is less than 1"); return -1; } int r = 0; do { r = a % b; a = b; b = r; } while (b != 0); return a; }
/** * Nejvetsi spolecny delitel cisel "a" a "b" * @param a cislo "a" * @param b cislo "b" * @return gcd(a, b) * @autor Thomas (www.adamjak.net) */ public static int gcd(int a, int b) { if (a < 1 || b < 1) { throw new ArgumentException("a or b is less than 1"); } int r = 0; do { r = a % b; a = b; b = r; } while (b != 0); return a; }
/** * Nejvetsi spolecny delitel cisel "a" a "b" * @param $a cislo "a" * @param $b cislo "b" * @return gcd(a, b) * @autor Thomas (www.adamjak.net) */ function gcd($a, $b) { if ($a < 1 || $b < 1) { die("a or b is less than 1"); } $r = 0; do { $r = $a % $b; $a = $b; $b = $r; } while ($b != 0); return $a; }
mgcd(X, X, X). mgcd(X, Y, X) :- Y == 0. mgcd(X, Y, R) :- Y > X, mgcd(Y, X, R). mgcd(X, Y, R) :- X > Y, R1 is X mod Y, mgcd(Y,R1,R).