- Slouží k nalezení největšího společného dělitele
- Postup
- Máme dvě čísla a ().
- Dělíme číslem a najdeme zbytek , tedy:
- Nahrazujeme hodnotou a hodnotou .
- Opakujeme, dokud . V tom okamžiku je výsledný největší společný dělitel.
- Příklad
- Najdeme
gcd(48,18)
- zbytek 12, takže .
- zbytek 6, tedy .
- zbytek 0, tedy .
- Výsledek: gcd(48,18)=6
- Najdeme
- Časová složitost je
- Často se používá v kryptografii
Věta - Bézoutova rovnost
Nechť . Pak existují čísla taková, že .
- Jinými slovy říká, že NSD dvou přirozených čísel lze zapsat jako lineární kombinaci s celočíselnými koeficienty. Tyto koeficienty můžeme získat použitím rozšířeného Euklidova algoritmu.
# 01 rekurzivní
def gcd_recursive(a, b):
if b == 0:
return a
return gcd_recursive(b, a % b)
# 02 iterativní
def gcd_iterative(a, b):
while b:
a, b = b, a % b
return a
# 03 rozšířený rekurzivní
def extended_gcd_recursive(a, b):
if b == 0:
return a, 1, 0 # NSD = a, x = 1, y = 0
gcd, x1, y1 = extended_gcd_recursive(b, a % b)
x = y1
y = x1 - (a // b) * y1
return gcd, x, y