Algorytm szybkiego potęgowania
Algorytm szybkiego potęgowania to technika umożliwiająca efektywne obliczenie potęgi z wykładnikiem naturalnym. Metoda ta opiera się na dwójkowej reprezentacji wykładnika potęgi, a jej złożoność, wyrażona jako liczba mnożeń, wynosi Θ(log n), gdzie n to wykładnik potęgi, którą obliczamy.
Szybkie potęgowanie jest wykorzystywane w praktycznych zastosowaniach, takich jak obliczanie reszty z dzielenia potęgi przez zdefiniowaną liczbę, na przykład w algorytmach szyfru RSA.
Wprowadzenie
Potęgowanie można zdefiniować w oparciu o mnożenie:
xk = x ⋅ xk-1 = x ⋅ x ⋅ x ⋅ … ⋅ x (łącznie k – 1 mnożeń).
Dla dużych wartości k liczba wymaganych operacji może stać się znaczna. W przypadku, gdy k ma j cyfr, liczba tych operacji byłaby wykładnicza w odniesieniu do j.
Algorytm
Algorytm szybkiego potęgowania wynika z obserwacji, że do obliczenia wartości ab wystarczy znać wartość a⌊b/2⌋ (gdzie ⌊ ⋅ ⌋ oznacza część całkowitą) i wykonać jedno lub dwa mnożenia. Na przykład, aby obliczyć 5175, wystarczy znać wartość x = 587, a następnie obliczyć y = x2 = 5174, a wynik to y ⋅ 5.
W ten sposób, by przejść od 587 do 5175, wystarczy wykonać 2 mnożenia zamiast 88, jak sugerowałaby definicja.
Pseudokod
Na podstawie powyższych obserwacji można stworzyć rekurencyjną funkcję do szybkiego obliczania wartości xn:
funkcja potęga(x, n) jeżeli n = 0 zwróć 1 jeżeli n jest nieparzysta zwróć x · potęga(x, n - 1) w przeciwnym przypadku a = potęga(x, n/2) zwróć a2
Po optymalizacji funkcja może wyglądać następująco:
funkcja potęga(x, n) jeżeli n = 0 zwróć 1 jeżeli n jest nieparzysta zwróć x · (potęga(x, (n - 1)/2))2 zwróć (potęga(x, n/2))2
Algorytm w wersji iteracyjnej przedstawia się tak:
w := 1 dla a = m do 1 // m - liczba miejsc binarnych liczby n c = a-ta cyfra binarna liczby n jeżeli c = 0 w := w · w jeżeli c = 1 w := w · w · x
Po zakończeniu tego algorytmu w zmiennej w zapamiętana jest n-ta potęga liczby x.
Linki zewnętrzne
Szybkie potęgowanie – wykład, kanał Olimpiady Informatycznej Juniorów (OIJ) na YouTube, 14 listopada 2014 [dostęp 2023-11-24].