Rozszerzony algorytm Euklidesa wyznacza współczynniki kombinacji dwóch liczb, która w sumie daje ich największych wspólny dzielnik. Tego typu algorytm wykorzystuje się w kryptografii zarówno do szyfrowania jak również łamania szyfrów. Przykładowo został on wykorzystany w szyfrze Afinicznym w celu jak najszybszego znalezienia elementu odwrotnego.
Rozszerzony algorytm Euklidesa pozwala na wyznaczenie współczynników p i q w równaniu NWD(a, b) = a·p + b·q
W celu znalezienia obu współczynników p i q należy upewnić się, że a > b. Jeśli tak nie jest liczby a i b wystarczy zamienić miejscami. Następnie:
Po wypisaniu wszystkich kolejnych równań należy do ostatniego równania podkładać wszystkie poprzednie, nie wymnażać żadnego iloczynu z a i b!. Całe równanie powinno się uprościć do postaci a·p + b·q.
Znaleziona para liczb p i q nie jest jednoznacza!
Przypuśćmy, że chcemy wyliczyć NWD(123, 27). Wtedy:
a | b | Równanie |
---|---|---|
123 | 27 | 123 = 4·27 + 15 |
27 | 15 | 27 = 1·15 + 12 |
15 | 12 | 15 = 1·12 + 3 |
12 | 3 | 12 = 4·3 + 0 |
3 | 0 | - |
Wynikiem NWD(123, 27) = 3. Wyznaczmy teraz współczynniki p i q:
3 = 15 - 1·12 = 15 - 1·(27 - 1·15) = 15 - 27 + 15 = 2·15 - 27 = 2·(123 - 4·27) - 27 = 2·123 - 8·27 - 27 = 2·123 - 9·27
Z tego ostatecznie wynika, że p = 2, a q = -9.
W celu znalezienia NWD dwóch liczb wystarczy prosta funkcja iteracyjna, która nie wymaga pamiętania wszystkich kroków wykonanych po kolei. Wtedy kod będzie miał następującą postać:
(2.) Najpierw należy upewnić się, że a > b. Jeśli tak nie jest to (3.) wartości należy zamienić miejscami. (4.) Następnie deklarujemy tymczasową zmienną t i w pętli (5. - 9.) dopóki b jest różne od 0 wyliczane są kolejne wartości a i b. Na koniec wystarczy (10.) zwrócić wartość zmiennej a.
Należy zauważyć, że tego typu funkcja traci cenne informacje, które możnaby wykorzystać do obliczenia współczynników p i q!
Powyższy kod można przetestować przy pomocy poniższej funkcji main():
W celu wyliczenia współczynników p i q trzeba pamiętać wszystkie poprzednie wartości a i b. Tutaj warto zastosować rekurencję tak, aby najpierw dojść do ostatecznego wyniku i podczas powrotu do pierwszego wywołania składać od razu szukane równanie.
W kodzie została wykorzystana funkcjonalność biblioteki utility, która pozwala na tworzeniu par obiektów. Przykładowy kod wygląda następująco:
(2. - 3.) Zawsze należy upewnić się, że a > b. Następnie jeśli (4.) b jest 0 to (5.) należy zwrócić parę liczb (1, 0). Jednak w przypadku normalny: (6.) wywołujemy rekurencyjnie funkcję z nowymi argumentami. Po odczytaniu wyniku można (7.) przejść do wyliczenia następnego i jego zwrócenia.
Funkcję tę można przetestować poniższą funkcją main():
Zmodyfikuj funkcję NWD tak, aby wypisywała na ekran kolejne równania, które powstają podczas wykonywania algorytmu. Przykładowo program powinien wypisać na ekran: