R1TJG4XNVH752
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ć an.

  • Naiwnie (na podstawie definicji): mnożymy a przez siebie n razyO(n) operacji mnożenia.

  • Lepiej: wykorzystać fakt, że:

    • a 2 k = ( a k ) 2

    • a2k+1=a(ak)2

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 213

  1. 213=2(26)2

  2. 26=(23)2

  3. 23=2(21)2

  4. 21=2(20)2

  5. 20=1

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 a

  • Podnosimy a do kwadratu

  • Dzielimy wykładnik przez 2

  • Powtarzamy, aż n == 0