Popraw to lub przedyskutuj rzeczy do sprawdzenia . Jeśli właśnie umieściłeś baner, wskaż punkty do sprawdzenia tutaj .
W matematyce , a dokładniej w modułowej arytmetyki The modułowy potęgowanie jest typu potęgowanie ( potęgowania ) wykonywane modulo liczba całkowita . Jest szczególnie wykorzystywany w informatyce , zwłaszcza w dziedzinie kryptologii .
Generalnie, modularne problemy potęgowania są wyrażane w postaci: mając podstawę b , wykładnik e i liczbę całkowitą m, chcemy obliczyć c tak, że:
Jeśli b , e i m są dodatnie lub zero i b < m , Istnieje unikalne rozwiązanie c takie, że . Na przykład, jeśli b = 5, e = 3 i m = 13, obliczenie c daje 8.
Problemy potęgowania modułowego podobne do poprzedniego przykładu są uważane za łatwe do rozwiązania, mimo że ich liczby są ogromne. Wręcz przeciwnie, obliczenie dyskretnego logarytmu (znalezienie e z b , c i m ) jest trudne. To jednokierunkowe zachowanie funkcji sprawia, że potęgowanie modularne jest dobrym kandydatem do użycia w algorytmach kryptologicznych.
Naiwne obliczenie wykładnika modularnego jest następujące: mnożymy e razy liczbę b przez samą liczbę b , a po uzyskaniu liczby całkowitej b e obliczamy jej resztę modulo m za pomocą algorytmu dzielenia Euklidesa . Ta metoda ma dwie wady:
W dalszej części artykułu opisano te różne adaptacje i omówiono ich skuteczność w zależności w szczególności od wielkości danych.
Najbardziej bezpośrednią metodą obliczenia wykładnika modularnego jest obliczenie b e bezpośrednio, a następnie przyjęcie tej liczby modulo m . Spróbujmy obliczyć c , przy b = 4, e = 13 i m = 497:
Użyjmy kalkulatora, aby obliczyć 4 13 , otrzymamy wartość 67 108 864. Weźmy ten modulo 497, otrzymany wynik c to 445. Chociaż b ma tylko jedną cyfrę, a e dwa, wartość b e osiąga jedną długość 8 cyfr.
W silnej kryptologii b często ma co najmniej 256 cyfr binarnych (77 cyfr dziesiętnych). Weźmy b = 5 × 10 76 i e = 17, dwie doskonale rozsądne wartości. W tym przykładzie b ma 77 cyfr dziesiętnych, a e dwa, ale b e ma 1304 cyfry. Tego rodzaju obliczenia są możliwe na nowoczesnych komputerach, ale ogrom tego rodzaju liczby znacznie spowalnia szybkość obliczeń. Wraz ze wzrostem rozmiaru b i e w celu poprawy bezpieczeństwa szyfrowania, wartość b e staje się niemożliwa do zarządzania.
Czas wymagany do wykonania potęgowania zależy od środowiska operacyjnego i procesora. Obliczenie potęgi przez szereg mnożeń wymaga czasu O ( e ).
Druga metoda obliczania potęgowania modularnego wymaga większej liczby operacji niż pierwsza metoda. Jednak ze względu na mniejsze zapotrzebowanie na pamięć operacje zajmują mniej czasu niż wcześniej. W rezultacie ten algorytm może być szybszy:
Algorytm ten wykorzystuje fakt, że dla dwóch danych liczb całkowitych b i c z pierwszych relacji wynika, co następuje:
Poniższy algorytm:
Zauważ, że za każdym razem, gdy przechodzisz przez krok 3, równanie staje się prawdziwe. Kiedy krok 3 zostało przeprowadzone th czas, a następnie, c zawiera odpowiedź, która została poszukiwanych.
Wróćmy do przykładu b = 4, e = 13 i m = 497. Algorytm przechodzi przez krok 3 trzynaście razy:
Ostateczna odpowiedź dla c to 445, tak jak w pierwszej metodzie.
Podobnie jak pierwsza metoda, wymaga to czasu obliczeń w O ( e ). Ponieważ jednak liczby użyte w tych obliczeniach są mniejsze niż liczby użyte w obliczeniach pierwszego algorytmu, współczynnik stały tej metody jest zwykle mniejszy.
Trzecia metoda drastycznie zmniejsza zarówno liczbę operacji, jak i miejsce w pamięci niezbędne do wykonania potęgowania modularnego. Jest to połączenie poprzedniej metody i bardziej ogólnej zasady zwanej szybką potęgą (znaną również jako potęgowanie kwadratowe).
Przede wszystkim musimy zamienić wykładnik e na notację binarną , czyli piszemy:
W tym zapisie długość od E jest N bitów. a i może przyjąć wartość 0 lub 1 dla dowolnego i takiego, że 0 ≤ i < n - 1. Z definicji a n - 1 = 1.
Wartość b e można wtedy zapisać:
Rozwiązaniem v jest zatem:
Taki algorytm można łatwo zaimplementować w języku programowania, który posiada przeciążenia operatorów i garbage collectory . Poniższy przykład jest w języku C# . Klasa Bignum reprezentuje dowolną dużą liczbę dodatnią. Zmienne wejściowe są podstawą dla podstawy ( b ), exp dla wykładnika ( e ) i m dla modułu.
Bignum modpow(Bignum base, Bignum exp, Bignum m) { Bignum result = 1; while (exp > 0) { if ((exp & 1) > 0) result = (result * base)b% m; exp >>= 1; base = (base * base)*% m; } return result; }Kod ten, oparty na jednej stronie 244 na Applied Cryptography przez Bruce Schneier , 2 th ed. ( ISBN 0471117099 ) wykorzystuje pętlę while do wykonania całej pracy wymaganej do obliczenia potęgowania modularnego.
Zauważ, że przy pierwszym wejściu do pętli zmienna podstawowa zawiera b . Następnie powtórzenie kwadratury w trzecim wierszu kodu zapewnia, że na końcu każdej pętli zmienna base jest równa , gdzie i jest liczbą iteracji pętli. (Co sprawia, że i jest następnym bitem do przetworzenia w wykładniku binarnym exp , najmniej znaczącym bitem, którym jest exp 0 ).
Pierwszy wiersz kodu po prostu wykonuje mnożenie w . Jeśli i wynosi zero, kod nie jest wykonywany, co jest równoznaczne z pomnożenia sumie o jeden. Jeśli z drugiej strony a i jest równe jeden, wynik jest po prostu mnożony przez zmienną bazową (zawierającą wartość pierwotnej bazy).
Na koniec przetestujmy na przykładzie b = 4, e = 13 i m = 497. Zauważ, że e jest równe 1101 w systemie binarnym. Ponieważ e ma długość czterech cyfr binarnych, pętla uruchomi się tylko cztery razy:
Pętla się kończy, ponieważ exp wynosi zero i zwracany jest wynik 445 . Jest to zgodne z dwoma poprzednimi algorytmami.
Czas wykonania tego algorytmu wynosi O (log e ). Podczas pracy z dużymi wartościami e jest znacznie szybszy niż dwa poprzednie algorytmy.