Zdjęcie przedstawia pomarańczowy blok z dużą liczbą okien.
PYI_R_W14_M31 Jak skrócić obliczenia - potęgowanie w wersji smart
Źródło: Alan Weiner, domena publiczna.
Wstęp – po co szybkie potęgowanie?
Zadanie: obliczyć .
Naiwnie (na podstawie definicji): mnożymy przez siebie n razy → O(n) operacji mnożenia.
Lepiej: wykorzystać fakt, że:
Dzięki temu zmniejszamy wykładnik o połowę w każdym kroku.
To podejście nazywa się szybkim potęgowaniem (ang. fast exponentiation) i działa w czasie O(log n).
Implementacja algorytmu szybkiego potęgowania (wersja rekurencyjna)
Linia 1. def szybkie podkreślnik potegowanie otwórz nawias okrągły a przecinek n zamknij nawias okrągły dwukropek.
Linia 2. kratka przypadek podstawowy.
Linia 3. if n znak równości znak równości 0 dwukropek.
Linia 4. return 1.
Linia 6. kratka rekurencyjne obliczenie a kareta otwórz nawias okrągły n prawy ukośnik prawy ukośnik 2 zamknij nawias okrągły.
Linia 7. polowa znak równości szybkie podkreślnik potegowanie otwórz nawias okrągły a przecinek n prawy ukośnik prawy ukośnik 2 zamknij nawias okrągły.
Linia 9. kratka jeśli n jest parzyste.
Linia 10. if n procent 2 znak równości znak równości 0 dwukropek.
Linia 11. return polowa asterysk polowa.
Linia 12. else dwukropek.
Linia 13. return a asterysk polowa asterysk polowa.
Jak działa algorytm?
Przykład: obliczmy
Algorytm:
dzieli problem na mniejszy (rekurencja),
zapamiętuje wynik połowy,
składa wynik w drodze powrotnej.
Implementacja iteracyjna (dla porównania)
Linia 1. def szybkie podkreślnik potegowanie podkreślnik iter otwórz nawias okrągły a przecinek n zamknij nawias okrągły dwukropek.
Linia 2. wynik znak równości 1.
Linia 4. while n zamknij nawias ostrokątny 0 dwukropek.
Linia 5. if n procent 2 znak równości znak równości 1 dwukropek.
Linia 6. wynik asterysk znak równości a.
Linia 7. a asterysk znak równości a.
Linia 8. n prawy ukośnik prawy ukośnik znak równości 2.
Linia 10. return wynik.
Jak działa program?
Gdy wykładnik jest nieparzysty → mnożymy dodatkowo przez
aPodnosimy
ado kwadratuDzielimy wykładnik przez 2
Powtarzamy, aż
n == 0