Algorytm Euklidesa – Co to jest, do czego służy i jak obliczyć NWD?

Algorytm Euklidesa jest to jeden z najpowszechniejszych i najstarszych algorytmów używanych do tej pory. Służy on do obliczania Największego Wspólnego Dzielnika (NWD), dla dwóch liczb.

Algorytm Euklidesa – metody tradycyjne

Podstawowe pytanie, zadawane przez wielu uczniów brzmi: co to jest algorytm Euklidesa? W dużym skrócie to oryginalna metoda opracowana przez Euklidesa z Aleksandrii w III w. p.n.e. opierająca się na odejmowaniu mniejszej liczby z pary od większej, i podmienianiu wyniku działania za większą wartość. Czynność tę powtarza się do momentu, w którym jedna z liczb nie wynosi 0. W ten sposób można obliczyć NWD, czyli największą możliwą wartość, pozwalającą na podzielenie całkowicie dwóch konkretnych liczb.

Algorytm obejmuje dwa główne sposoby:

  • przez odejmowanie,
  • przez liczenie reszty z dzielenia.

Algorytm Euklidesa NWD może być stosowany nie tylko dla liczb naturalnych, ale także do liczb całkowitych, wymiernych czy zmiennoprzecinkowych. Złożoność czasowa wynosi O(log2(a+b)), gdzie a i b to wejściowe liczby całkowite.

Co ciekawe, “Elementy” Euklidesa były wykorzystywane jako podręcznik matematyki przez ponad 2000 lat i były podstawą nauki w szkołach na całym świecie.

Algorytm Euklidesa NWD – Kalkulator

NWD: Metoda poprzez odejmowanie

Wytłumaczmy tę metodę na przykładzie dwóch liczb (504, 315):

Algorytm Euklidesa - odejmowanie
Algorytm ten opiera się na prostej metodzie odejmowania mniejszej liczby od większej, aż do momentu, gdy obie liczby są sobie równe, czyli wynik wynosi 0.

315 jest mniejszą liczbą z pary, więc odejmujemy ją od 504:

504 – 315 = 189

Wynik różnicy podmieniamy z większą liczbą w parze.

Wygląda to teraz tak: (189, 315)

Różnica jest mniejsza niż 315:

315 – 189 = 126

(189, 126)

189 – 126 = 63

(63, 126)

126 – 63 = 63

(63, 63)

63 – 63 =0

(0, 63) Tutaj kończymy działanie algorytmu, ponieważ otrzymaliśmy liczbę 0.

Największym dzielnikiem liczb 504 i 315 jest 63.

Powyższą metodą byliśmy w stanie uzyskać wynik, to prosty sposób na to jak obliczyć NWD, ale jak możemy sobie wyobrazić, używanie tego algorytmu dla dużych liczb pokroju miliona byłoby bardzo powolne. Istnieje również druga metoda, która zamiast odejmować wykorzystuje resztę z dzielenia, aby znaleźć NWD.

ads banner

NWD: Metoda poprzez liczenie reszty z dzielenia

Przetestujmy nową metodę na trochę większych liczbach (1230, 528):

Algorytm Euklidesa - modulo
Algorytm Euklidesa z dzieleniem modulo jest bardziej wydajny niż wersja z odejmowaniem, ponieważ uzyskiwanie reszty z dzielenia pozwala na mniejszą liczbę kroków. To efektywny sposób na to jak obliczyć największy wspólny dzielnik z dużych wartości.

1230 % 528 = 174

(174, 528)

528 % 174 = 6

(6, 174)

174 % 6 = 0

(0,6)

Widzimy, że nawet dla tak dużych liczb, algorytm znalazł Największy Wspólny Dzielnik w zaledwie kilku krokach.

Algorytm Euklidesa – schemat blokowy i pseudokod

Pod spodem znajdziesz algorytm Euklidesa zapisany w formie schematu blokowego. Taka forma zapisu umożliwi Ci łatwe zrozumienie tego rozwiązania, niezależnie od tego czy chodzi o metodę wykorzystującą modulo (resztę z dzielenia), czy też odejmowanie.

NWD: Metoda odejmowania – schemat blokowy i pseudokod

Euklides odejmowanie - schemat blokowy
Algorytm Euklidesa w wersji z odejmowaniem jest jedną z podstawowych metod obliczania największego wspólnego dzielnika (NWD) dwóch liczb całkowitych.

NWD: Metoda reszty z dzielenia – schemat blokowy i pseudokod

Euklides dzielenie - schemat blokowy
Rozwiązanie opiera się na wykorzystaniu operacji dzielenia modulo (operator %) do obliczania reszty z dzielenia.

Optymalizacja algorytmu Euklidesa

Tak jak w przypadku praktycznie każdego algorytmu, także i tutaj można pokusić się o optymalizację. Można to rozwiązać na różne sposoby:

  1. Algorytm binarny Euklidesa – informatyka często wykorzystuje działania binarne ze względu na ich szybkość. Dlatego też powstało specjalnie dopasowane rozwiązanie będące zoptymalizowaną wersją algorytmu Euklidesa, która wykorzystuje operacje takie jak przesunięcia bitowe i AND, zamiast standardowych działań arytmetycznych. Działa on szybciej dla wartości z systemu dwójkowego w porównaniu ze standardową implementacją.
  2. Wykorzystanie pamięci podręcznej –  algorytm Euklidesa często jest używany w różnych częściach programu. Można wykorzystać pamięć podręczną (cache) w celu przechowywania wyników obliczeń NWD, aby uniknąć wielokrotnego obliczania dzielnika dla tych samych par liczb. Te wyniki są zawsze takie same, o ile korzysta się z identycznych wartości. Jest to istotne w przypadku programów, gdzie algorytm jest wywołany więcej niż jeden raz.

Poza tym dla poprawy czytelności kodu, rozsądnym rozwiązaniem okazuje się uwzględnianie wartości bezwzględnej – algorytm Euklidesa działa dla dodatnich liczb całkowitych. Jednak jeśli liczby wejściowe mogą być ujemne, warto uwzględnić wartość bezwzględną w celu obliczenia NWD. Na przykład, można użyć funkcji Math.abs() w języku Java, aby uzyskać liczbę bez znaku minusa. Dzięki temu ogranicza się konieczność stosowania większej ilości dodatkowych warunków w przypadku liczb ujemnych.

Zastanówmy się teraz nad implementacją algorytmu znajdowania największego wspólnego dzielnika w C++, Python i Java.

Algorytm Euklidesa – C++:

Algorytm Euklidesa – Python:

Algorytm Euklidesa – Java:

Powyższe algorytmy NWD są zaimplementowane zarówno w formie iteracyjnej, jak i rekurencyjnej. Jak widzimy, ich składnia nie jest złożona i są podobne do siebie.

Podsumowanie – Algorytm Euklidesa

Algorytm Euklidesa, okazuje się istotny w różnych przypadkach. Skorzystasz z niego zarówno w czasie nauki informatyki w szkole średniej jak i na studiach. Warto więc zapoznać się z tym rozwiązaniem, w wersji iteracyjnej oraz rekurencyjnej. Należy zauważyć, że w momencie gdy NWD wynosi 1, to znaczy, że wartości są liczbami względnie pierwszymi. Jest to ciekawe wykorzystanie tej metody, co przydaje w wykonywaniu rozmaitych zadań matematycznych.

Najczęściej zadawane pytania o algorytm Euklidesa

Gdzie wykorzystuje się algorytm Euklidesa?
  1. NWD jest przydatny w wielu zagadnieniach matematycznych i inżynieryjnych, takich jak uproszczenie ułamków, czy testowanie wzajemnej pierwszości liczb.
  2. Algorytm Euklidesa jest wykorzystywany w protokołach kryptograficznych, takich jak RSA, do generowania kluczy publicznych i prywatnych oraz do obliczania odwrotności modularnych.
Jakie są inne metody obliczania NWD oprócz algorytmu Euklidesa?

Wykorzystuje się również klasyczny sposób “na piechotę”. Ten sposób opiera się o sprawdzanie kolejnych dzielników obu liczb, rozpoczynając od największej możliwej wartości. Gdy znaleziony zostanie pierwszy dzielnik, który jest wspólny dla obu liczb, staje się on NWD.

Czy algorytm Euklidesa jest deterministyczny?

Algorytm Euklidesa jest deterministyczny, czyli dla tych samych danych wejściowych zawsze zwraca ten sam wynik. Działanie tego rozwiązania opiera się na prostych regułach matematycznych, które są niezależne od jakiejkolwiek losowości czy zewnętrznych czynników.

ads banner

Wpisy, które mogą Cię zainteresować: