Grafika przedstawia dwa splecione symbole węży. Jeden jest niebieski, a drugi żółty.
Grafika przedstawia dwa splecione symbole węży. Jeden jest niebieski, a drugi żółty.
Algorytm Euklidesa
Logo języka Python
Źródło: Dnu72, dostępny w internecie: commons.wikimedia.org, licencja: CC BY-SA 4.0.
Algorytm Euklidesa opisuje metodę znajdowania największego wspólnego dzielnika dwóch liczb naturalnych. Nazwa pochodzi od greckiego matematyka Euklidesa, który jako pierwszy opisał algorytm w IV w p.n.e., chociaż nie był jego autorem. Problem wyznaczania NWD rozwiązywany jest na wiele sposobów, w tym materiale wykorzystamy wersję opartą na odejmowaniu.
NWD
Największy wspólny dzielnik (NWD) dwóch liczb naturalnych a i b większych od 0 to największa liczba naturalna d, która jest dzielnikiem każdej z nich, czyli dzieli je bez reszty. Przyjmijmy, że będziemy ją oznaczać jako d = NWD(a, b).
NWD ma wiele zastosowań, m.in. pozwala skracać ułamki zwykłe do postaci, w której licznik i mianownik są liczbami względnie pierwszymi, czyli NWD(a, b) = 1.
Algorytm Euklidesa z zastosowaniem odejmowania
Skonstruujemy algorytm, który obliczy największy wspólny dzielnik dwóch dodatnich liczb naturalnych.
Specyfikacja algorytmu:
Dane:
a, b – dodatnie liczby naturalne
Wynik:
d - dodatnia liczba naturalna, NWD(a, b)
Do rozwiązania postawionego zadania użyjemy algorytmu Euklidesa w wersji z odejmowaniem.
Przykład 1
Przeanalizujmy wyznaczanie NWD według algorytmu Euklidesa z wykorzystaniem odejmowania dla danych: a = 4, b = 10.
Powtórzenia
a
b
działanie
1
4
10
b = 10 - 4
2
4
6
b = 6 - 4
3
4
2
a = 4 - 2
4
2
2
-
Liczba powtórzeń: 3. Wynik: NWD (4, 10) = 2
Z powyższego przykładu wynika, że dopóki liczby a i b są różne, w każdym powtórzeniu sprawdzamy, która liczba jest większa. Jeżeli a > b, obliczamy a = a - b, w przeciwnym razie wyliczamy b = b - a. Kiedy a i b są równe, wynikiem jest dowolna z tych liczb.
Zapiszmy algorytm w postaci listy kroków:
Wczytaj a, b.
Jeżeli a jest równe b, przejdź do kroku 5.
Jeżeli a > b, zmiennej a przypisz a - b, w przeciwnym razie b przypisz b - a.
Przejdź do kroku 2.
Wypisz a i zakończ algorytm.
Przeanalizujmy również schemat blokowy algorytmu:
R7eTw2k5l821C
Na grafice widoczny jest schemat blokowy ilustruje implementację klasycznego algorytmu Euklidesa służącego do obliczania największego wspólnego dzielnika (NWD). Schemat składa się z: zielonego owalu z napisem start.
Kolejnym elementem jest blok purpurowy równoległobok zawierający instrukcje "Wczytaj liczbę a" oraz "Wczytaj liczbę b".
Główna Pętla Algorytmiczna i Warunki Decyzyjne.
Centralnym elementem schematu jest struktura decyzyjna przedstawiona w formie niebieskiego rombu z warunkiem "Jeżeli a = b". W przypadku gdy wartości zmiennych a i b są równe, algorytm przechodzi do fazy zakończenia poprzez wyprowadzenie wyniku. Alternatywnie, gdy warunек równości nie jest spełniony, następuje przejście do kolejnej fazy przetwarzania danych.
Kolejnym elementem jest niebieski romb, zawiera warunek "Jeżeli a > b" i służy do określenia, która z dwóch zmiennych powinna zostać zmodyfikowana w bieżącej iteracji.
Operacje Arytmetyczne i Modyfikacja Zmiennych
Schemat zawiera dwa prostokątne elementy w kolorze jasnoniebieskim reprezentujące operacje arytmetyczne "a = a - b" oraz "b = b - a".
Gdy warunek a = b zostanie spełniony, algorytm przechodzi do fazy wyprowadzenia wyniku poprzez element "Wypisz a" przedstawiony w formie purpurowego równoległoboku. W tym momencie zmienna a (równa również zmiennej b) zawiera wartość największego wspólnego dzielnika liczb wprowadzonych na początku algorytmu. Wybór wyprowadzenia zmiennej a jest arbitralny, gdyż w stanie końcowym obie zmienne mają identyczną wartość będącą poszukiwanym NWD.
Element końcowy STOP, reprezentowany przez czerwony owal, oznacza formalne zakończenie wykonywania algorytmu.
Schemat blokowy algorytmu
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.
Wyrażenie a != b interpretujemy jako „a różne od b”.
Z obydwu sposobów zapisu algorytmu wynika, że na początku pobieramy dane wejściowe, czyli dwie dodatnie liczby całkowite. Następnie porównujemy je i większą pomniejszamy o mniejszą. Operacje te powtarzają się dopóki liczby a i b są różne. Kiedy zrównają się, wyprowadzamy wynik, tj. dowolną z tych liczb, i kończymy.
Notatnik
RwQTyLx3QQNTf
Miejsce na Twoje notatki: (Uzupełnij).
Animacja
Polecenie 1
Zapoznaj się z animacją, która pokazuje, w jaki sposób możemy uzyskać odpowiedź na pytanie o to, ile trzeba wykonać operacji odejmowania, zanim znajdziemy największy wspólny dzielnik z wykorzystaniem algorytmu Euklidesa.
Uruchom program nwd_odejmowanie_licznik.py i przetestuj jego działanie dla podanych danych:
Linia 1. kratka Pierwszy zestaw danych.
Linia 2. a znak równości 8.
Linia 3. b znak równości 32.
Linia 5. kratka Drugi zestaw danych.
Linia 6. a znak równości 8.
Linia 7. b znak równości 2848.
Linia 9. kratka Trzeci zestaw danych.
Linia 10. a znak równości 2.
Linia 11. b znak równości 10.
Linia 13. kratka Czwarty zestaw danych.
Linia 14. a znak równości 2.
Linia 15. b znak równości 22222.
Linia 17. kratka Piąty zestaw danych.
Linia 18. a znak równości 100.
Linia 19. b znak równości 200.
# Pierwszy zestaw danych
a = 8
b = 32
# Drugi zestaw danych
a = 8
b = 2848
# Trzeci zestaw danych
a = 2
b = 10
# Czwarty zestaw danych
a = 2
b = 22222
# Piąty zestaw danych
a = 100
b = 200
Oczekiwane wyniki:
Linia 1. NWD otwórz nawias okrągły 8 przecinek 32 zamknij nawias okrągły znak równości 8.
Linia 2. Liczba operacji znak równości 3.
Linia 4. NWD otwórz nawias okrągły 8 przecinek 2848 zamknij nawias okrągły znak równości 8.
Linia 5. Liczba operacji odejmowania znak równości 355.
Linia 7. NWD otwórz nawias okrągły 2 przecinek 10 zamknij nawias okrągły znak równości 2.
Linia 8. Liczba operacji odejmowania znak równości 4.
Linia 10. NWD otwórz nawias okrągły 2 przecinek 22222 zamknij nawias okrągły znak równości 2.
Linia 11. Liczba operacji odejmowania znak równości 11110.
Linia 13. NWD otwórz nawias okrągły 100 przecinek 200 zamknij nawias okrągły znak równości 100.
Linia 14. Liczba operacji odejmowania znak równości 1.
NWD( 8, 32 ) = 8
Liczba operacji = 3
NWD( 8, 2848 ) = 8
Liczba operacji odejmowania = 355
NWD( 2, 10 ) = 2
Liczba operacji odejmowania = 4
NWD( 2, 22222 ) = 2
Liczba operacji odejmowania = 11110
NWD( 100, 200 ) = 100
Liczba operacji odejmowania = 1
1
Polecenie 3
Do wykonania polecenia wykorzystaj następujące dwa zestawy danych:
Linia 1. kratka Pierwszy zestaw danych.
Linia 2. a znak równości 34.
Linia 3. b znak równości 16.
Linia 5. kratka Drugi zestaw danych.
Linia 6. a znak równości 16.
Linia 7. b znak równości 34.
# Pierwszy zestaw danych
a = 34
b = 16
# Drugi zestaw danych
a = 16
b = 34
R1dQ7DWSQpJk9
Wysłuchaj fragmentu książki innego filozofa, Oswalda Spenglera, pt. Zmierzch Zachodu (1918). Zastanów się i wyjaśnij tezę, iż cywilizacja jest dopełnieniem i zakończeniem kultury. Jak ma się ona do kryzysu Zachodu? (Uzupełnij).
Oczekiwane wyniki:
Linia 1. NWD otwórz nawias okrągły 34 przecinek 16 zamknij nawias okrągły znak równości 2.
Linia 2. Liczba operacji znak równości 9.
Linia 3. NWD otwórz nawias okrągły 16 przecinek 34 zamknij nawias okrągły znak równości 2.
Linia 4. Liczba operacji znak równości 9.
NWD( 34, 16 ) = 2
Liczba operacji = 9
NWD( 16, 34 ) = 2
Liczba operacji = 9
Wniosek: liczba operacji nie zależy od kolejności danych.
Zestaw ćwiczeń interaktywnych
RY9rpifYMr52W
Ćwiczenie 1
Przykładowy wygląd zakładki zadania. Pod poleceniem znajdują się panele z tekstem z miejscem do oznaczenia prawidłowej odpowiedzi. Poniżej znajduje się panel z napisem SPRAWDŹ a pod nim napis Pokaż odpowiedź.
Przykładowy wygląd zakładki zadania. Pod poleceniem znajdują się panele z tekstem z miejscem do oznaczenia prawidłowej odpowiedzi. Poniżej znajduje się panel z napisem SPRAWDŹ a pod nim napis Pokaż odpowiedź.
Źródło: Robert Bednarz, licencja: CC BY 3.0.
REjm0EzD1sX4T
Ćwiczenie 2
Przykładowy wygląd zakładki zadania. Pod poleceniem znajdują się panele z tekstem z miejscem do oznaczenia prawidłowej odpowiedzi. Poniżej znajduje się panel z napisem SPRAWDŹ a pod nim napis Pokaż odpowiedź.
Przykładowy wygląd zakładki zadania. Pod poleceniem znajdują się panele z tekstem z miejscem do oznaczenia prawidłowej odpowiedzi. Poniżej znajduje się panel z napisem SPRAWDŹ a pod nim napis Pokaż odpowiedź.
Źródło: Robert Bednarz, licencja: CC BY 3.0.
RRvpBsyDPhSUv
Ćwiczenie 3
Przykładowy wygląd zakładki zadania. Pod poleceniem znajdują się panele z tekstem z miejscem do oznaczenia prawidłowej odpowiedzi. Poniżej znajduje się panel z napisem SPRAWDŹ a pod nim napis Pokaż odpowiedź.
Źródło: Robert Bednarz, licencja: CC BY 3.0.
RARugbyugq6pi
Ćwiczenie 4
Przykładowy wygląd zakładki zadania. Pod poleceniem znajdują się panele z tekstem z miejscem do oznaczenia prawidłowej odpowiedzi. Poniżej znajduje się panel z napisem SPRAWDŹ a pod nim napis Pokaż odpowiedź.
Źródło: Robert Bednarz, licencja: CC BY 3.0.
1
Ćwiczenie 5
Rq5QSmwpt0Ywx
Wysłuchaj fragmentu książki innego filozofa, Oswalda Spenglera, pt. Zmierzch Zachodu (1918). Zastanów się i wyjaśnij tezę, iż cywilizacja jest dopełnieniem i zakończeniem kultury. Jak ma się ona do kryzysu Zachodu? (Uzupełnij).
Dla liczb a = 24, b = 10: 24 10 14 10 4 10 4 6 4 2 2 2
Dla liczb a = 16 i b = 24: 16 24 16 8 8 8
1
Ćwiczenie 6
R1Z6NGZTF4C4R
Wysłuchaj fragmentu książki innego filozofa, Oswalda Spenglera, pt. Zmierzch Zachodu (1918). Zastanów się i wyjaśnij tezę, iż cywilizacja jest dopełnieniem i zakończeniem kultury. Jak ma się ona do kryzysu Zachodu? (Uzupełnij).
Dla liczb a = 24, b = 10: 24 10 14 10 4 10 4 6 4 2 2 2
Przykładowy wygląd zakładki zadania. Pod poleceniem znajdują się panele ułożone po cztery w dwóch rzędach. Każdy z paneli zawiera treści do połączenia w pary. Poniżej znajduje się panel z napisem SPRAWDŹ a pod nim napis Pokaż odpowiedź.
Przykładowy wygląd zakładki zadania. Pod poleceniem znajdują się panele ułożone po cztery w dwóch rzędach. Każdy z paneli zawiera treści do połączenia w pary. Poniżej znajduje się panel z napisem SPRAWDŹ a pod nim napis Pokaż odpowiedź.
Źródło: Robert Bednarz, licencja: CC BY 3.0.
1
Ćwiczenie 8
Zastanów się: która para liczb wymaga więcej odejmowań: 100 i 99 czy 100 i 50? Uzasadnij odpowiedź.
Przeanalizuj kod programu dla podanych wartości
Para 100 i 99 wymaga 99 odejmowań, a para 100 i 50 – tylko 1.
11
Ćwiczenie 9
Wykonaj kolejne ćwiczenia.
R1A9wBV4KXzaF
Źródło: GroMar, licencja: CC BY 3.0.
Poprawny wynik działania programu dla a = 10 i b = 16:
Linia 1. 10 6 kratka wartości zmiennych a i b po 1 iteracji.
Linia 2. 4 6 kratka wartości zmiennych a i b po 2 iteracji.
Linia 3. 4 2 kratka wartości zmiennych a i b po 3 iteracji.
Linia 4. 2 2 kratka wartości zmiennych a i b po 4 iteracji.
Linia 5. 2 kratka wartość NWD otwórz nawias okrągły a przecinek b zamknij nawias okrągły.
10 6 # wartości zmiennych a i b po 1 iteracji
4 6 # wartości zmiennych a i b po 2 iteracji
4 2 # wartości zmiennych a i b po 3 iteracji
2 2 # wartości zmiennych a i b po 4 iteracji
2 # wartość NWD(a, b)
Wzoruj się na kodzie obliczającym i zwracającym NWD(a, b), który omówiony został w materiale.
Ważne!
Odpowiedzi mogą w niewielkim stopniu różnić się od napisanego przez ciebie kodu, zależnie od kolejności definiowania zmiennych i przypisywania.
Krok pierwszy:
Linia 1. a znak równości 10.
Linia 2. b znak równości 16.
a = 10
b = 16
Krok drugi:
Linia 1. def nwd otwórz nawias okrągły a przecinek b zamknij nawias okrągły dwukropek.
Linia 2. pass.
def nwd(a,b):
pass
Krok trzeci:
Linia 1. while a wykrzyknik znak równości b dwukropek.
Linia 2. pass.
while a != b:
pass
Krok czwarty:
Linia 1. if a zamknij nawias ostrokątny b dwukropek.
Linia 2. a znak równości a minus b.
Linia 3. else dwukropek.
Linia 4. b znak równości b minus a.
if a > b:
a = a - b
else:
b = b - a
Krok piąty:
Linia 1. print otwórz nawias okrągły a przecinek b zamknij nawias okrągły.
Linia 2. return a.
print(a, b)
return a
Krok szósty:
Linia 1. print otwórz nawias okrągły nwd otwórz nawias okrągły a przecinek b zamknij nawias okrągły zamknij nawias okrągły.
print(nwd(a, b))
Gotowy kod:
Linia 1. a znak równości 10.
Linia 2. b znak równości 16.
Linia 4. def nwd otwórz nawias okrągły a przecinek b zamknij nawias okrągły dwukropek.
Linia 5. while a wykrzyknik znak równości b dwukropek.
Linia 6. if a zamknij nawias ostrokątny b dwukropek.
Linia 7. a znak równości a minus b.
Linia 8. else dwukropek.
Linia 9. b znak równości b minus a.
Linia 10. print otwórz nawias okrągły a przecinek b zamknij nawias okrągły.
Linia 11. return a.
Linia 13. print otwórz nawias okrągły nwd otwórz nawias okrągły a przecinek b zamknij nawias okrągły zamknij nawias okrągły.
a = 10
b = 16
def nwd(a, b):
while a != b:
if a > b:
a = a - b
else:
b = b - a
print(a, b)
return a
print(nwd(a, b))