Szybkie Potęgowanie Modulo dotyczy równań takich jak xn ≡m z. Podczas operacji potęgowania mogą pojawić się dwa problemy: jeden związany z przepełnieniem zmiennej, a drugi z szybkością działania dla bardzo dużych wartości x i y. Korzystając z własności modulo oraz twierdzenia Eulera proces obliczania można znacząco przyśpieszyć.
Przypuśćmy, że do wyliczenia jest wartość z w równaniu xn ≡m z. Wartości x, y i m są dane.
Rozpatrzmy na początek problem przepełnienia. Można go bardzo łatwo ominąć korzystając z faktu, że x mod m = (a mod m)(b mod m), gdzie x = ab. Oznacza to, że można rozpisać podane równanie jako: z = (((x·x mod m)·x mod m) ... )·x mod m. Dzięki takiemu zabiegowi wyjście poza zakres będzie możliwe jedynie wtedy, gdy x2 jest większe, równe maksymalnemu zakresowi typu zmiennej x.
Pozostaje teraz pytanie czy proces można przyśpieszyć. Otóż można wykorzystując w tym celu twierdzenie Eulera. Twierdzenia stwierdza, że dla dla dowolnych x i m jeśli NWD(m, x) = 1 to xϕ(m) ≡m 1, gdzie ϕ(m) to liczba wszystkich liczb względnie pierwszych z m. O sposobie wyliczania tej funkcji można przeczytać tutaj. Metoda ta w większości przypadków pozwoli znacznie ograniczyć liczbę potrzebnych operacji.
Najprostsza implementacja szybkiego Potęgowania Modulo, która ma uniknąć problemów z przepełnieniem zmiennej ma następującą postać:
Jednak nie jest to kod optymalny. Dalej został przedstawiony kod, który
Poniżej została przedstawiona przykładowa implementacja funkcji szybkiePotegowanieModulo(), która wylicza wynik xn mod m:
Algorytm jest bardzo krótki. (2.) Początkowo wartość wynikowa to x. Jeśli (3.) liczba potęgowana i dzielnik są względnie pierwsze to (4.) z potęgi jest odejmowana odpowiednia wartość. (5.) Następnie dla pozostałych potęg: (6.) aktualny wynik należy pomnożyć przez x i wyciągnąć resztę modulo m. Na koniec (7.) zwróć wartość w.
Do sprawdzenia czy dwie wartości są względnie pierwsze wykorzystany został algorytm Euklidesa:
Do wyliczania wartości funkcji ϕ użyty został następujący kod:
W celu przetestowania napisanej funkcji można skorzystać z poniższej funkcji main():
Otrzymany wynik potęgowanie modulo nie jest jednoznaczny. Przykładowo 6 mod 5 = 1, ale poprawną odpowiedzią jest też np. 6 mod 5 = -4. Korzystając z tej wskazówki postaraj się tak zmienić wartość zmiennej x, aby jej wartość była jak najmniejsza podczas operacji potęgowania.