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 wyznaczania największego wspólnego dzielnika opisany został przez greckiego matematyka Euklidesa. Algorytm ten ma dwie wersje. Pierwsza wykorzystuje odejmowanie i została przedstawiona w poprzednim e‑materiale, druga wersja, wykorzystująca operacje obliczania reszty z dzielenia, zostanie opisana w tym e‑materiale.
NWD
Największy wspólny dzielnik (NWD) dwóch liczb naturalnych a i b 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 nieskracalnej, tzn. takiej, w której licznik i mianownik są liczbami względnie pierwszymi, czyli NWD(a, b) = 1.
Algorytm Euklidesa z zastosowaniem działania reszty z dzielenia
Specyfikacja algorytmu:
Dane wejściowe:
a, b – dodatnie liczby naturalne
Wynik:
d – dodatnia liczba naturalna, NWD(a,b)
Do rozwiązania postawionego problemu użyjemy algorytmu Euklidesa w wersji z zastosowaniem działania reszty z dzielenia.
Przeanalizujemy schemat blokowy algorytmu.
R1crwcNRkMMEP
Na diagramie widoczny jest algorytm wyznaczania największego wspólnego dzielnika dwóch liczb przy użyciu metody Euklidesa. Diagram jest przedstawiony w formie schematu blokowego. Algorytm rozpoczyna się od zielonego owalu z napisem START. Od niego schodzi strzałka w dół prowadząca do pierwszego różowego równoległoboku. W nim wpisany jest tekst Wczytaj liczbę a, Wczytaj liczbę b. Od równoległoboku schodzi strzałka w dół do fioletowego rombu. W nim wpisane jest b znak większe od zero. Od rombu odchodzą dwie strzałki. Jedna z napisem tak, druga z napisem nie. Strzałka z napisem tak prowadzi do zielone prostokąta. W nim wpisany jest tekst r znak równości a mod b, a znak równości b, b znak równości r. Od prostokąta prowadzi strzałka, która zakręca do strzałki odchodzącej od różowego równoległoboku. Strzałka z napisem nie prowadzi do drugiego różowego równoległoboku. W nim wpisany jest tekst Wypisz a. Od tego równoległoboku prowadzi strzałka do czerwonego owalu z napisem STOP.
Schemat blokowy algorytmu Euklidesa z wykorzystaniem działania reszty z dzielenia
Źródło: Robert Bednarz, licencja: CC BY 3.0.
Przykład 1
Przeanalizujmy wyznaczanie NWD wg algorytmu Euklidesa z wykorzystaniem reszty z dzielenia (zgodnie ze schematem blokowym umieszczonym powyżej) dla danych: a = 76, b = 12.
Powtórzenia
a
b
działanie
1
76
16
r = 76 mod 16 = 12 a = 16 b = 12
2
16
12
r = 16 mod 12 = 4 a = 12 b = 4
3
12
4
r = 12 mod 4 = 0 a = 4 b = 0
0
Wynik: NWD (76, 16) = 4
Liczba powtórzeń: 3
Przykład pokazuje, że dopóki b > 0, powtarzamy wykonywanie następującego zestawu instrukcji: wyliczamy resztę z dzielenia a mod b, do a przypisujemy b, do b przypisujemy wyliczoną resztę. Kiedy b, czyli ostatnia obliczona reszta, wyniesie 0, algorytm kończy działanie, wynikiem jest wartość a, czyli wartość przedostatniej wyliczonej reszty.
Najważniejszą częścią algorytmu jest pętla, która wykonuje się dopóki warunek b > 0 jest prawdziwy. Wewnątrz pętli obliczamy resztę z dzielenia liczb r = a mod b i wykonujemy przypisania: a = b, b = r. Po zakończeniu pętli wypisujemy wynik, tj. wartość a.
Skracanie ułamków
Jednym z zastosowań algorytmu Euklidesa jest skracanie ułamków zwykłych. Wykorzystamy napisany wcześniej program do tego zadania.
Przyjmiemy, że danymi będą licznik i mianownik ułamka, który chcemy skrócić. Powinny to być liczby całkowite większe od 0.
Skracanie ułamka zwykłego polega na podzieleniu licznika i mianownika przez tę samą liczbę - największy wspólny dzielnik licznika i mianownika. W tym wypadku liczbą będzie największy wspólny dzielnik zapisany w zmiennej d. Jeżeli będzie on większy niż 1, wypiszemy skrócony ułamek.
1
Polecenie 1
Przeanalizuj działanie programu dla następujących danych:
Linia 1. kratka Pierwszy zestaw danych.
Linia 2. l1 znak równości 9.
Linia 3. l2 znak równości 45.
Linia 5. kratka Drugi zestaw danych.
Linia 6. l1 znak równości 7.
Linia 7. l2 znak równości 9.
# Pierwszy zestaw danych
l1 = 9
l2 = 45
# Drugi zestaw danych
l1 = 7
l2 = 9
Wypisane komunikaty:
Linia 1. NWD otwórz nawias okrągły 9 przecinek 45 zamknij nawias okrągły znak równości 9.
Linia 2. Ułamek dwukropek 9 prawy ukośnik 45.
Linia 3. Po skróceniu dwukropek 1 prawy ukośnik 5.
Linia 1. NWD otwórz nawias okrągły 7 przecinek 9 zamknij nawias okrągły znak równości 1.
Linia 2. Ułamka nie da się skrócić kropka.
NWD( 7 , 9 ) = 1
Ułamka nie da się skrócić.
Notatnik
R1FhhXaq8A0vG
Miejsce na Twoje notatki: (Uzupełnij)
.
Symulacja interaktywna
R1HnYmDmqDrqF
Symulacja dotyczy algorytmów do znajdowania największego wspólnego dzielnika (NWD) przy użyciu dwóch metod: odejmowania i dzielenia modulo. Na grafice znajduje się instrukcja dotycząca analizy tych algorytmów. Instrukcja jest umieszczona w ramce z niebieskim obramowaniem, z ilustracją osoby w lewym górnym rogu oraz pytajnikiem w różowym kółku nad ilustracją. Po lewej stronie widnieje tekst: „Korzystając z przygotowanej symulacji, przeanalizuj, jak przebiega znajdowanie NWD w obydwu algorytmach dla wartości podanych w polach zamieszczonych pod symulacją. Zwróć uwagę na wartości, które przyjmują zmienne w kolejnych powtórzeniach oraz liczbę powtórzeń koniecznych do uzyskania wyniku. By wykonać jedno powtórzenie działania pętli, użyj przycisku „Wykonaj jedno powtórzenie”. By obliczyć od razu wynik końcowy, użyj przycisku „Oblicz wynik końcowy'”. W centralnej części grafiki znajdują się dwa prostokąty z pseudokodem algorytmów: pętla wykorzystująca odejmowanie oraz pętla wykorzystująca dzielenie modulo. Poniżej znajdują się pola do wprowadzenia wartości liczb a i b oraz dwa przyciski: „Wykonaj jedno powtórzenie” oraz „Oblicz wynik końcowy”. Pola te umożliwiają użytkownikowi interaktywne wprowadzenie danych i przeprowadzenie symulacji działania algorytmów.
Symulacja dotyczy algorytmów do znajdowania największego wspólnego dzielnika (NWD) przy użyciu dwóch metod: odejmowania i dzielenia modulo. Na grafice znajduje się instrukcja dotycząca analizy tych algorytmów. Instrukcja jest umieszczona w ramce z niebieskim obramowaniem, z ilustracją osoby w lewym górnym rogu oraz pytajnikiem w różowym kółku nad ilustracją. Po lewej stronie widnieje tekst: „Korzystając z przygotowanej symulacji, przeanalizuj, jak przebiega znajdowanie NWD w obydwu algorytmach dla wartości podanych w polach zamieszczonych pod symulacją. Zwróć uwagę na wartości, które przyjmują zmienne w kolejnych powtórzeniach oraz liczbę powtórzeń koniecznych do uzyskania wyniku. By wykonać jedno powtórzenie działania pętli, użyj przycisku „Wykonaj jedno powtórzenie”. By obliczyć od razu wynik końcowy, użyj przycisku „Oblicz wynik końcowy'”. W centralnej części grafiki znajdują się dwa prostokąty z pseudokodem algorytmów: pętla wykorzystująca odejmowanie oraz pętla wykorzystująca dzielenie modulo. Poniżej znajdują się pola do wprowadzenia wartości liczb a i b oraz dwa przyciski: „Wykonaj jedno powtórzenie” oraz „Oblicz wynik końcowy”. Pola te umożliwiają użytkownikowi interaktywne wprowadzenie danych i przeprowadzenie symulacji działania algorytmów.
Źródło: GroMar Sp. z o.o., licencja: CC BY-SA 3.0.
1
Polecenie 2
Przeanalizuj w symulacji działanie algorytmu Euklidesa z wykorzystaniem odejmowania i działania reszty z dzielenia dla podanych niżej liczb. Podaj wynik oraz liczbę powtórzeń pętli dla każdego z algorytmów.
Do wykonania polecenia wykorzystaj następujące dane:
Linia 1. kratka Pierwszy zestaw.
Linia 2. a znak równości 56.
Linia 3. b znak równości 3.
Linia 5. kratka Drugi zestaw.
Linia 6. a znak równości 3.
Linia 7. b znak równości 56.
# Pierwszy zestaw
a = 56
b = 3
# Drugi zestaw
a = 3
b = 56
R6mZ14trtjfr1
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).
Przykładowe wyniki dla a = 24 i b = 5:
Odejmowanie:
NWD(24, 5) = 1 Liczba powtórzeń: 8
Działanie reszty z dzielenia:
NWD(24, 5) = 1 Liczba powtórzeń: 3.
Dla a = 56, b = 3
Odejmowanie: NWD(56, 3) = 1 Liczba powtórzeń: 20
Działanie reszty z dzielenia: NWD(56, 3) = 1 Liczba powtórzeń: 3
Dla a = 3, b = 56
Odejmowanie: NWD(3, 56) = 1 Liczba powtórzeń: 20
Działanie reszty z dzielenia: NWD(3, 56) = 1 Liczba powtórzeń: 4
Wniosek:
Kolejność podawanych argumentów nie ma wpływu na liczbę wykonywanych operacji w przypadku algorytmu Euklidesa wyznaczania NWD z wykorzystaniem operacji odejmowania.
Kolejność podawanych argumentów ma wpływ na liczbę wykonywanych operacji w przypadku algorytmu Euklidesa wyznaczania NWD z wykorzystaniem operacji reszta z dzielenia.
1
Polecenie 3
Przeanalizuj w symulacji działanie algorytmu Euklidesa z wykorzystaniem odejmowania i działania reszty z dzielenia dla podanych niżej liczb. Podaj wynik oraz liczbę powtórzeń pętli dla każdego z algorytmów.
Do wykonania polecenia wykorzystaj następujące dane:
Linia 1. kratka Pierwszy zestaw danych.
Linia 2. a znak równości 3.
Linia 3. b znak równości 566.
Linia 5. kratka Drugi zestaw danych.
Linia 6. a znak równości 3.
Linia 7. b znak równości 5666.
# Pierwszy zestaw danych
a = 3
b = 566
# Drugi zestaw danych
a = 3
b = 5666
R6HCR7l0uGXZ5
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).
Przykładowe wyniki dla a = 24 i b = 5:
Odejmowanie: NWD(24, 5) = 1 Liczba powtórzeń: 8
Dzielenie: NWD(24, 5) = 1 Liczba powtórzeń: 3.
Dla a = 3, b = 566
Odejmowanie: NWD(3, 566) = 1 Liczba powtórzeń: 190
Działanie reszty z dzielenia: NWD(3, 566) = 1 Liczba powtórzeń: 4
Dla a = 3, b = 5666
Odejmowanie: NWD(3, 5666) = 1 Liczba powtórzeń: 1890
Działanie reszty z dzielenia: NWD(3, 5666) = 1 Liczba powtórzeń: 4
A teraz... czas na ćwiczenia!
R1TgTJ8iRKu2j
Ćwiczenie 1
Wskaż poprawnie obliczone wartości NWD.
RtFxGsZEAWKkx
Ćwiczenie 2
Wskaż, ile razy wykona się pętla while w algorytmie obliczania NWD z wykorzystaniem reszty z dzielenia dla liczb 170 oraz 2023.
RVsHd9M4sEGB1
Ćwiczenie 3
Zaznacz poprawne dokończenie zdania. Jeżeli nagłówek funkcji wyliczającej NWD z wykorzystaniem algorytmu Euklidesa z działaniem reszty z dzielenia ma postać def NWD(a, b), pętla wykonująca obliczenia kończy się, kiedy…
RV4IIUDPTx1Mq
Ćwiczenie 4
Uporządkuj podane instrukcje wewnątrz funkcji obliczającej NWD przy użyciu algorytmu Euklidesa z wykorzystaniem dzielenia. Elementy do uszeregowania: 1. a = b, 2. b = r, 3. r = a % b, 4. while b > 0:, 5. return a
Uporządkuj podane instrukcje wewnątrz funkcji obliczającej NWD przy użyciu algorytmu Euklidesa z wykorzystaniem dzielenia. Elementy do uszeregowania: 1. a = b, 2. b = r, 3. r = a % b, 4. while b > 0:, 5. return a
Źródło: Robert Bednarz, licencja: CC BY 3.0.
RvQxMmFeAXqSL
Ćwiczenie 5
Zaznacz wszystkie poprawne odpowiedzi. Do zakodowania pętli obliczającej NWD przy użyciu algorytmu Euklidesa z wykorzystaniem dzielenia użyjesz: Możliwe odpowiedzi: 1. instrukcji pobierania, 2. pętli for, 3. pętli while, 4. instrukcji przypisania, 5. instrukcji warunkowej
Źródło: Robert Bednarz, licencja: CC BY 3.0.
RwlNIhUuLwOfo
Ćwiczenie 6
Po zakończeniu działania pętli w algorytmie Euklidesa obliczającym NWD z wykorzystaniem dzielenia i funkcji wynikiem jest: Możliwe odpowiedzi: 1. przedostatnia obliczona reszta, 2. zmienna b (drugi parametr), 3. ostatnia obliczona reszta, 4. zmienna a (pierwszy parametr)
Źródło: Robebert Bednarz, licencja: CC BY 3.0.
311
Ćwiczenie 7
Uzupełnij program obliczający największy wspólny dzielnik wg algorytmu Euklidesa z wykorzystaniem działania reszty z dzielenia w taki sposób, aby wypisywał wartości przyjmowane przez zmienne r, a, b wykorzystywane w pętli while, liczbę wykonanych iteracji oraz największy wspólny dzielnik zadanych wartości l1 oraz l2.
Specyfikacja problemu:
Dane wejściowe:
l1, l2 - liczby naturalne
Wyniki:
wartości przyjmowane przez zmienne r, a i b w kolejnych iteracjach pętli while
tekst Liczba powtórzeń: oraz liczba iteracji (wartość zmiennej licznik)
wartości l1, l2 oraz NWD(l1, l2)
Przykład:
Dla l1= 63 i l2= 8:
Linia 1. 7 8 7.
Linia 2. 1 7 1.
Linia 3. 0 1 0.
Linia 4. Liczba powtórzeń dwukropek 3.
Linia 5. 63 8 1.
7 8 7
1 7 1
0 1 0
Liczba powtórzeń: 3
63 8 1
Ćwiczenie wykonaj w kolejnych etapach w poniższej testerce:
R19FI55kldpP31
Źródło: GroMar Sp. z o.o, licencja: CC BY 3.0.
Zwróć uwagę na komunikaty wyświetlane w testerce po błędnym zapisaniu kodu lub niespełnieniu wszystkich warunków polecenia w danym etapie.
W pętli while użyj instrukcji print() do wypisania wartości zmiennych oraz instrukcji, która zwiększy wartość licznika o 1. Poza pętlą while użyj instrukcji print() do wypisania liczby powtórzeń. Do ostatniej instrukcji w programie wstaw wywołanie funkcji obliczającej NWD.
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. print otwórz nawias okrągły r przecinek a przecinek b zamknij nawias okrągły.
Linia 2. licznik znak równości licznik plus 1.
print(r, a, b)
licznik = licznik + 1
Krok drugi:
Linia 1. print otwórz nawias okrągły cudzysłów Liczba powtórzeń dwukropek cudzysłów przecinek licznik zamknij nawias okrągły.
Linia 2. oblicz podkreślnik nwd otwórz nawias okrągły l1 przecinek l2 zamknij nawias okrągły.
Linia 1. def oblicz podkreślnik nwd otwórz nawias okrągły a przecinek b zamknij nawias okrągły dwukropek.
Linia 2. licznik znak równości 0.
Linia 3. while b zamknij nawias ostrokątny 0 dwukropek.
Linia 4. r znak równości a procent b.
Linia 5. a znak równości b.
Linia 6. b znak równości r.
Linia 7. print otwórz nawias okrągły r przecinek a przecinek b zamknij nawias okrągły.
Linia 8. licznik znak równości licznik plus 1.
Linia 9. print otwórz nawias okrągły cudzysłów Liczba powtórzeń dwukropek cudzysłów przecinek licznik zamknij nawias okrągły.
Linia 10. return a.
Linia 12. l1 znak równości 3.
Linia 13. l2 znak równości 77.
Linia 14. print otwórz nawias okrągły l1 przecinek l2 przecinek oblicz podkreślnik nwd otwórz nawias okrągły l1 przecinek l2 zamknij nawias okrągły zamknij nawias okrągły.
def oblicz_nwd(a, b):
licznik = 0
while b > 0:
r = a % b
a = b
b = r
print(r, a, b)
licznik = licznik + 1
print("Liczba powtórzeń:", licznik)
return a
l1 = 3
l2 = 77
print(l1, l2, oblicz_nwd(l1, l2))
311
Ćwiczenie 8
Napisz funkcję oblicz_nww(a, b), która będzie obliczała najmniejszą wspólną wielokrotność przekazanych argumentów. Program powinien wyświetlić liczby l1 i l2 oraz ich najmniejszą wspólną wielokrotność.
Specyfikacja problemu:
Dane wejściowe:
l1, l2 – liczby naturalne
Wyniki:
liczby l1 i l2 oraz NWW(l1, l2)
Przykład:
Dla l1= 7 i l2= 3:
Linia 1. 7 3 21.
7 3 21
Ćwiczenie wykonaj w kolejnych etapach w poniższej testerce:
R1AaVqIEjWbW21
Źródło: GroMar Sp. z o.o, licencja: CC BY 3.0.
Zwróć uwagę na komunikaty wyświetlane w testerce po błędnym zapisaniu kodu lub niespełnieniu wszystkich warunków polecenia w danym etapie.
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. return a asterysk b prawy ukośnik prawy ukośnik oblicz podkreślnik nwd otwórz nawias okrągły a przecinek b zamknij nawias okrągły.
return a * b // oblicz_nwd(a, b)
Gotowy kod:
Linia 1. def oblicz podkreślnik nwd otwórz nawias okrągły a przecinek b zamknij nawias okrągły dwukropek.
Linia 2. while b zamknij nawias ostrokątny 0 dwukropek.
Linia 3. r znak równości a procent b.
Linia 4. a znak równości b.
Linia 5. b znak równości r.
Linia 6. return a.
Linia 8. def oblicz podkreślnik nww otwórz nawias okrągły a przecinek b zamknij nawias okrągły dwukropek.
Linia 9. return a asterysk b prawy ukośnik prawy ukośnik oblicz podkreślnik nwd otwórz nawias okrągły a przecinek b zamknij nawias okrągły.
Linia 11. l1 znak równości 12.
Linia 12. l2 znak równości 5.
Linia 13. print otwórz nawias okrągły l1 przecinek l2 przecinek oblicz podkreślnik nww otwórz nawias okrągły l1 przecinek l2 zamknij nawias okrągły zamknij nawias okrągły.
def oblicz_nwd(a, b):
while b > 0:
r = a % b
a = b
b = r
return a
def oblicz_nww(a, b):
return a * b // oblicz_nwd(a, b)
l1 = 12
l2 = 5
print(l1, l2, oblicz_nww(l1, l2))