Przeczytaj
Przeanalizujmy działanie algorytmu Euklidesa w wersji z odejmowaniem. Oto jego realizacja w języku Python:
Wyznaczmy przykładowe NWD, używając powyżej zdefiniowanej funkcji:
Spróbujmy wykorzystać tę metodę w przypadku dużych liczb. W języku Python istnieje ograniczenie maksymalnej wartości typu int
. Możemy to sprawdzić, wywołując odpowiednie właściwości modułów sys
oraz platform
:
Zatem największą liczbą całkowitą, którą możemy podać w 64‑bitowym systemie Linux, jest:
Oto wersja programu, która liczy, ile operacji odejmowania należy wykonać podczas wyznaczania NWD:
Wyznaczmy NWD dla liczb o wiele mniejszych niż maksymalna wartość int
zapisana w 64‑bitowym systemie Linux:
Niewykluczone, że obliczenia zajmą ponad minutę. W przypadku bardzo dużych liczb program uruchomiony na szybkim komputerze mógłby pracować nawet kilkadziesiąt minut (ze względu na dużą liczbę operacji odejmowania). Przedstawiamy obraz z Monitora systemu – pokazuje on, że nawet proste obliczenia potrafią obciążać procesor:
Możemy zmierzyć czas niezbędny do obliczenia NWD
. Spróbujmy napisać funkcję NWD_odejmowanie_zliczanie_czas(x, y)
, która oprócz liczby odejmowań poda czas niezbędny do ich wykonania.
Specyfikacja problemu:
Dane:
x, y
– liczby całkowite
Wynik:
NWD
– liczba całkowita, największy wspólny dzielnik liczbx
iy
odejmowania
– liczba całkowita, liczba wykonanych operacjit
– czas trwania programu; liczba rzeczywista
Na szczęście proces wyznaczania NWD da się zoptymalizowaćzoptymalizować. Przeanalizujmy zmodyfikowaną wersję algorytmu, tzw. obliczanie NWD metodą dzielenia z resztą.
Oto implementacja algorytmu w języku Python:
Wersja programu, która zlicza wykonane operacje, może wyglądać następująco:
Wyznaczmy NWD dla dużych argumentów funkcji. Okaże się, że liczba wykonywanych operacji jest bardzo mała:
Możemy obliczyć czas niezbędny do wyznaczenia NWD
. Zdefiniujmy funkcję NWD_modulo_zliczanie_czas(x, y)
, która oprócz liczby operacji zmierzy także czas ich wykonania.
Specyfikacja problemu:
Dane:
x, y
– liczby całkowite
Wynik:
NWD
– liczba całkowita, największy wspólny dzielnik liczbx
iy
dzielenia
– liczba całkowita, liczba wykonanych operacjit
– czas trwania programu; liczba rzeczywista
Możemy obliczyć NWD dla więcej niż dwóch liczb.
Obliczenie NWD dla trzech liczb odbywa się w dwóch etapach. Najpierw wyznaczamy NWD dla liczb pierwszej i drugiej oraz NWD liczb drugiej i trzeciej. Następnie obliczamy NWD dla otrzymanych wyników. Przedstawmy tę zasadę za pomocą pseudokodu:
Algorytm Euklidesa wykorzystujący odejmowanie opiera swoje działanie o spostrzeżenie, że największy wspólny dzielnik jest równy największemu wspólnemu dzielnikowi mniejszej liczby i różnicy liczb większej oraz mniejszej.
Napisz program, który obliczy największy wspólny dzielnik dwóch liczb całkowitych dodatnich. Zaimplementuj algorytm Euklidesa, wykorzystując:
odejmowanie,
resztę z dzielenia.
Specyfikacja problemu:
Dane:
a
,b
– liczby całkowite
Wynik:
NWD
– liczba całkowita, największy wspólny dzielnik liczbya
ib
Porównaj swoje rozwiązanie z przedstawionym w filmie.
Słownik
operacja wyznaczania reszty z dzielenia dwóch liczb; działanie takie oznaczane jest w Pythonie operatorem %
upraszczanie procesu, poszukiwanie najlepszego rozwiązania z punktu widzenia pewnego kryterium, np. liczby wykonywanych operacji przez procesor czy czasu niezbędnego do przeprowadzonych działań lub ilości zajmowanej pamięci