Skip to content

Latest commit

 

History

History
74 lines (51 loc) · 2.72 KB

File metadata and controls

74 lines (51 loc) · 2.72 KB

Programming-course-cpp

Jakub Piskorowski on 30/08/2023 wersja: 1.0

Temat: Potęgowanie szybkie

Przedstawienie działania algorytmu szybkiego potęgowania.

Kod źródłowy: iteracyjnie-szybkie-potegowanie.cpp

📒 Poziom 2

Powrót do Algorytmika


Objaśnienie

Algorytm szybkiego potęgowania – metoda pozwalająca na szybkie obliczenie potęgi o wykładniku naturalnym. Metoda ta wykorzystuje pośrednio dwójkową reprezentację wykładnika potęgi, a jej złożoność, wyrażona jako liczba wykonywanych mnożeń, wynosi Θ (log n), gdzie n oznacza wykładnik obliczanej potęgi.

Standardowe potęgowanie dla wyrażenia an potrzebuje aż n-1 mnożeń, natomiast algorytm potęgowania szybkiego pozwala na wykonanie tego zadania wykonując maksymalnie 2*log2n mnożeń, czyli bardzo szybko.

Dla przykładu popatrzmy na takie wyrażenie:
210 = 2* 2*...*2 = 1024
Potęgę
210
można rozpisać w inny sposób:
210=(25)2= (2 * 24)2=(2 * (22)2)2 = (2 * (2 * 2)2)2
Licząc ilość mnożeń otrzymujemy w tym przypadku tylko cztery. Dla dużych wykładników oszczędność jest ogromna. Gdybyśmy chcieli podnieść do potęgi miliard, wykonalibyśmy nie więcej niż 100 mnożeń a więc się opłaca.

Tak na prawdę wystarczy lepiej przyjrzeć się wykładnikowi i jego postaci binarnej, w tym przykładzie.
10 = ( 1010 )2
Zasada jest następująca:
Ustawmy wynik = 1:
jeżeli kolejny bit jest równy 0 (licząc od prawej), podstawę nadpisujemy jej kwadratem.
jeśli kolejny bit jest równy 1, wynik przemnażamy przez aktualną wartość podstawy, a podstawę nadpisujemy jej kwadratem.
Czynności powtarzamy do wyczerpania bitów w liczbie.

Funkcja szybkiego potęgowania metodą iteracyjną

Wejście:
a – podstawa
n - wykładnik

Wyjście:
w - wynik potęgowania szybkiego

Lista kroków:
K1:   w ← 1 początkowa wartość zmiennej przechowującej wynik
K2:   dopóki n > 0
      wykonuj kroki K3...K5
K3:   jeżeli n modulo 2 = 1   jeżeli bit jest równy 1
      to w ← w * a
K4:   a ← a * a
K5:   n ← n \ 2
K6:   zwróć w

Wynik działania programu:

Podaj podstawe: 2
Podaj wykladnik: 6
2 do potegi 6 wynosi: 64

Kod źródłowy: iteracyjnie-szybkie-potegowanie.cpp