|
Article on other languages:
|
Algorytm Euklidesa – algorytm znajdowania największego wspólnego dzielnika (NWD) dwóch różnych liczb naturalnych. Nie wymaga rozkładania liczb na czynniki pierwsze. Algorytm wymyślił Eudoksos z Knidos (IV wiek p.n.e.), a Euklides jedynie zawarł go w swoim dziele Elementy. W algorytmie wykorzystywana jest zależność
AlgorytmPrzebieg algorytmu Euklidesa obliczania NWD liczb a i b:
Zapis w pseudokodzie:
PrzykładyObliczanie NWDObliczenie największego wspólnego dzielnika liczb
Sprawdzenie, czy liczby są względnie pierwszeLiczby są względnie pierwsze, gdy ich największym wspólnym dzielnikiem jest 1. Przykład dla 46406 i 36957:
Dowód poprawnościLemat:
Z lematu wynika przez indukcję, że jeśli algorytm się zakończy, to da poprawny wynik. Pozostaje udowodnić, że się zakończy. Wystarczy w tym celu zauważyć, że Złożoność czasowaDla dowolnych liczb Dowód
Największej liczby kroków algorytmu wymagają dwa kolejne elementy ciągu Fibonacciego. Rozszerzony algorytm EuklidesaJeśli przechowywana będzie informacja o kolejnych ilorazach, to będzie też można wyznaczyć liczby całkowite w równaniu Na przykład dla liczb 174 i 18 w algorytmie Euklidesa uzyskuje się wyniki pośrednie: lub przepisując wszystkie równania w taki sposób, by w pierwszym równaniu po prawej stronie występowała tylko suma pewnych wielokrotności liczb 174 i 18: Zauważmy, że w pierwszym równaniu po prawej stronie występuje kombinacja liniowa liczb 174 i 18, podobnie jak w równaniu Kluczowa dla rozszerzonego algorytmu Euklidesa staje się możliwość stopniowego zastępowania tych liczb przez kombinacje liniowe liczb wejściowych aż do otrzymania równości: np. Zapis algorytmu w pseudokodzie: // Zakładamy, że a > 0 i b > 0. a0 = a b0 = b // Inicjalizacja. Utrzymujemy niezmienniki p*a0 + q*b0 = a oraz r*a0 + s*b0 = b p = 1; q = 0; r = 0; s = 1; // algorytm while (b != 0) c = a '''mod''' b quot = floor( a/b ) a = b b = c new_r = p - quot * r new_s = q - quot * s p = r; q = s r = new_r s = new_s // Wówczas NWD(a0, b0) = p*a0 + q*b0 Rekurencyjna wersja rozszerzonego algorytmu w języku SML
fun nwd2 a0 b0 =
let fun nwd2' a b p q r s =
if b = 0 then (a, p, q)
else nwd2' b (a mod b) r s (p - (a div b) * r) (q - (a div b) *s)
in nwd2' a0 b0 1 0 0 1 end;
(* nwd2 zwraca trójkę taką, że a*p + b*q = nwd *)
val a = 108; val b = 14;
val (nwd, p, q) = nwd2 a b;
Zobacz też |
This article is from Wikipedia. All text is available under the terms of the GNU Free Documentation License.