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:
![Zdjęcie ekranu przedstawia 3 wykresy. Pierwszy to zestawienie obciążenia 8 rdzeni procesora. Drugi to wykorzystanie pamięci i przestrzeni wymiany. Ostatni to wykres pobierania i wysyłania danych w sieci. Wykorzystanie internetu jest umiarkowane, wartości skaczą, ale nie przekraczajć 50%. Wykorzystanie pamięci jest stałe, na około 40%. Wykorzystanie procesora nie jest równomierne, jeden z rdzeni wykorzystany jest na 100%, podczas gdy inne nie przekraczają 20%.](https://static.zpe.gov.pl/portal/f/res-minimized/RC1z2TvxYr5sZ/1662543909/2kPgkyBCiKLDxQooRmU9EsOJbSJ6Mnbr.png)
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.
![](https://static.zpe.gov.pl/portal/f/res-minimized/RbNtfLMrgEPh1/1689532434/2CkU5jwuoXBoarzgAq06XjOh9xrpKQwr.jpg)
Film dostępny pod adresem /preview/resource/RbNtfLMrgEPh1
Film nawiązujący do treści materiału: Algorytm Euklidesa zastosowanie różnych pętli.
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