Największy wspólny dzielnik Algorytm Euklidesa (także rozszerzony) WZAiP1: Chińskie twierdzenie o resztach

Podobne dokumenty
1. Liczby wymierne. x dla x 0 (wartością bezwzględną liczby nieujemnej jest ta sama liczba)

Wykład 4. Określimy teraz pewną ważną klasę pierścieni.

Dr inż. Robert Wójcik, p. 313, C-3, tel Katedra Informatyki Technicznej (K-9) Wydział Elektroniki (W-4) Politechnika Wrocławska

ALGORYTMY MATEMATYCZNE Ćwiczenie 1 Na podstawie schematu blokowego pewnego algorytmu (rys 1), napisz listę kroków tego algorytmu:

Matematyka dyskretna

Przykładowe zadania z teorii liczb

Teoria liczb. Magdalena Lemańska. Magdalena Lemańska,

Algorytmy i struktury danych. Wykład 4

1. Wykład NWD, NWW i algorytm Euklidesa.

Matematyka dyskretna

Wykład 1. Na początku zajmować się będziemy zbiorem liczb całkowitych

Algorytmy w teorii liczb

Kongruencje pierwsze kroki

Wybrane zagadnienia teorii liczb

Zadania do samodzielnego rozwiązania

2. Liczby pierwsze i złożone, jednoznaczność rozkładu na czynniki pierwsze, największy wspólny dzielnik, najmniejsza wspólna wielokrotność.

0 --> 5, 1 --> 7, 2 --> 9, 3 -->1, 4 --> 3, 5 --> 5, 6 --> 7, 7 --> 9, 8 --> 1, 9 --> 3.

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 5. Karol Tarnowski A-1 p.

Zadanie 1. Test (6 pkt) Zaznacz znakiem X w odpowiedniej kolumnie P lub F, która odpowiedź jest prawdziwa, a która fałszywa.

Kongruencje twierdzenie Wilsona

Ciała i wielomiany 1. przez 1, i nazywamy jedynką, zaś element odwrotny do a 0 względem działania oznaczamy przez a 1, i nazywamy odwrotnością a);

Podstawy programowania. Wykład: 13. Rekurencja. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Treść wykładu. Pierścienie wielomianów. Dzielenie wielomianów i algorytm Euklidesa Pierścienie ilorazowe wielomianów

Algebra Liniowa 2 (INF, TIN), MAP1152 Lista zadań

KONGRUENCJE. 1. a a (mod m) a b (mod m) b a (mod m) a b (mod m) b c (mod m) a c (mod m) Zatem relacja kongruencji jest relacją równoważności.

0 + 0 = 0, = 1, = 1, = 0.

Algorytm. a programowanie -

Zegar ten przedstawia reszty z dzielenia przez 6. Obrazuje on jak kolejne liczby można przyporządkować do odpowiednich pokazanych na zegarze grup.

Teoria liczb. Zajmuje się własnościami liczb, wszystkim całkowitych

Podstawy programowania 2. Temat: Funkcje i procedury rekurencyjne. Przygotował: mgr inż. Tomasz Michno

Matematyka dyskretna

Luty 2001 Algorytmy (8) 2000/2001

Kongruencje. Sławomir Cynk. 24 września Nowy Sącz. Instytut Matematyki Uniwersytetu Jagiellońskiego

Wstęp do Informatyki zadania ze złożoności obliczeniowej z rozwiązaniami

Rekurencja (rekursja)

5. Rozwiązywanie układów równań liniowych

Paweł Gładki. Algebra. pgladki/

Grupy, pierścienie i ciała

EGZAMIN MATURALNY Z INFORMATYKI

1. Liczby naturalne, podzielność, silnie, reszty z dzielenia

Luty 2001 Algorytmy (4) 2000/2001

Luty 2001 Algorytmy (7) 2000/2001

Algorytm Euklidesa. Największy wspólny dzielnik dla danych dwóch liczb całkowitych to największa liczba naturalna dzieląca każdą z nich bez reszty.

Paweł Gładki. Algebra. pgladki/

Analiza kongruencji. Kongruencje Wykład 3. Analiza kongruencji

Algebra abstrakcyjna

1. Określenie pierścienia

Funkcje wymierne. Jerzy Rutkowski. Działania dodawania i mnożenia funkcji wymiernych określa się wzorami: g h + k l g h k.

ZADANIE 1. Ważenie (14 pkt)

Kongruencje oraz przykłady ich zastosowań

2.8. Algorytmy, schematy, programy

MADE IN CHINA czyli SYSTEM RESZTOWY

Programowanie w Baltie klasa VII

Jarosław Wróblewski Matematyka Elementarna, lato 2012/13. W dniu 21 lutego 2013 r. omawiamy test kwalifikacyjny.

Wstęp do informatyki- wykład 1

Zadanie 1. Potęgi (14 pkt)

Kongruencje i ich zastosowania

2. Liczby pierwsze i złożone, jednoznaczność rozkładu na czynniki pierwsze, największy wspólny dzielnik, najmniejsza wspólna wielokrotność. (c.d.

Wstęp do Informatyki

Algorytm - pojęcie algorytmu, sposób zapisu, poziom szczegółowości, czynności proste i strukturalne. Pojęcie procedury i funkcji.

Sumy kolejnych bikwadratów

Obóz Naukowy Olimpiady Matematycznej Gimnazjalistów

Algorytm i złożoność obliczeniowa algorytmu

Zaawansowane algorytmy i struktury danych

Podstawy programowania. Podstawy C# Przykłady algorytmów

Liczby rzeczywiste. Działania w zbiorze liczb rzeczywistych. Robert Malenkowski 1

Algebra Boole a i jej zastosowania

Pierwiastki pierwotne, logarytmy dyskretne

Algorytm Euklidesa. ZADANIE 1. Oblicz korzystając z algorytmu Euklidesa: (a) NWD(120, 195), (b) NWD(80, 208), (c) NWD(36, 60, 90),

Wieczorowe Studia Licencjackie Wrocław, Wykład nr 6 (w oparciu o notatki K. Lorysia, z modyfikacjami) Sito Eratostenesa

MATEMATYKA WYMAGANIA EDUKACYJNE DLA KLASY V

Piotr Chrząstowski-Wachtel Uniwersytet Warszawski. Al Chwarizmi i trzy algorytmy Euklidesa

Programowanie dynamiczne

Kod U2 Opracował: Andrzej Nowak

LX Olimpiada Matematyczna

Jarosław Wróblewski Matematyka Elementarna, lato 2014/15

Kongruencje. Beata Łojan. Koło Naukowe Matematyków Uniwersytetu Śląskiego w Katowicach.

Samodzielnie wykonaj następujące operacje: 13 / 2 = 30 / 5 = 73 / 15 = 15 / 23 = 13 % 2 = 30 % 5 = 73 % 15 = 15 % 23 =

Podzielność liczb. Podzielność liczb

Twierdzenie Eulera. Kongruencje wykład 6. Twierdzenie Eulera

Maciej Grzesiak. Wielomiany

W. Guzicki Próbna matura, grudzień 2014 r. poziom rozszerzony 1

Algorytm Euklidesa. Dwie monety - jeden problem. Trochę matematyki 180=36*5 180=60*3

Laboratorium kryptograficzne dla licealistów 6

Funkcja kwadratowa. f(x) = ax 2 + bx + c = a

Przypomnienie wiadomości dla trzecioklasisty C z y p a m i ę t a s z?

LICZBY PIERWSZE. 14 marzec Jeśli matematyka jest królową nauk, to królową matematyki jest teoria liczb. C.F.

Wykład 2. Informatyka Stosowana. 10 października Informatyka Stosowana Wykład 2 10 października / 42

Kodowanie i kompresja Streszczenie Studia Licencjackie Wykład 15, Kryptografia: algorytmy asymetryczne (RSA)

EGZAMIN MATURALNY Z INFORMATYKI

3. FUNKCJA LINIOWA. gdzie ; ół,.

Liczby całkowite. Zadania do pierwszych dwóch lekcji

Wykład 2. Informatyka Stosowana. 9 października Informatyka Stosowana Wykład 2 9 października / 42

Sumy kwadratów kolejnych liczb naturalnych

Podstawą w systemie dwójkowym jest liczba 2 a w systemie dziesiętnym liczba 10.

Rozwiązaniem jest zbiór (, ] (5, )

Zadania z algebry liniowej - sem. I Struktury algebraiczne

B.B. 2. Sumowanie rozpoczynamy od ostatniej kolumny. Sumujemy cyfry w kolumnie zgodnie z podaną tabelką zapisując wynik pod kreską:

Wykład IV Algorytmy metody prezentacji i zapisu Rzut oka na język PASCAL

Złożoność obliczeniowa zadania, zestaw 2

Transkrypt:

Największy wspólny dzielnik Algorytm Euklidesa (także rozszerzony) Chińskie twierdzenie o resztach Wybrane zagadnienia algorytmiki i programowania I 27 października 2010

Największy wspólny dzielnik - definicja Największy wspólny dzielnik zbioru S R to taka liczba d R, że: 1 s S d s 2 g R (( s S g s ) ) = g d Skoncentrujemy się na szukaniu największego wspólnego dzielnika podzbiorów zbioru liczb naturalnych. Zważywszy, że dla liczb naturalnych zachodzi rozłączność największego wspólnego dzielnika, czyli dla niepustych zbiorów S 1, S 2 N: NWD(S 1 S 2 ) = NWD(NWD(S 1 ), NWD(S 2 )) Wystarczy zatem opracować rozwiązania problemu wyznaczania największego wspólnego dzielnika pary liczb naturalnych.

Największy wspólny dzielnik a Najmniejsza wspólna wielokrotność Pojęciem pokrewnym z NWD, z którego skorzystamy przy tej prezentacji jest NWW - najmniejsza wspólna wielokrotność. Liczeniu jej nie poświęca się jednak tyle uwagi co NWD - gdyż najprostszy sposób wyznaczania NWW polega na skorzystaniu z zależności: NWW(a, b) NWD(a, b) = a b Czyli: największa wspólna wielokrotność pomnożona przez największy wspólny dzielnik dowolnego podzbioru liczb naturalnych daje w wyniku iloczyn wszystkich jego elementów. Dowód tej zależności zostanie pominięty, ale wystarczy przeanalizować, jak wygląda w zależności od argumentów rozbicie NWD oraz NWW na dzielniki pierwsze, aby potwierdzić prawdziwość tej zależności. NWW, podobnie jak NWD, jest łączne, zatem możliwość obliczania go dla zbioru dwuelementowego jest wystarczająca.

Największy wspólny dzielnik - poprzez faktoryzację Dla każdego n N da się w sposób jednoznaczny zapisać: n = p k 1 1 pk 2 2 pk 3 3 pk 4 4 pk 5 5... Gdzie p 1, p 2, p 3,... to kolejne liczby pierwsze, k 1, k 2, k 3,... są pewnymi liczbami całkowitymi nieujemnymi, oraz Q N q N, q>q k q = 0. Jeżeli zapiszemy drugą liczbę naturalną w ten sam sposób: to: l = p m 1 1 p m 2 2 p m 3 3 p m 4 4 p m 5 5... NWD(n, l) = p min(k 1, m 1 ) 1 p min(k 2, m 2 ) 2 p min(k 3, m 3 ) 3 p min(k 4, m 4 ) 4 p min(k 5, m 5 ) 4...

Algorytm Euklidesa - podstawowe ujęcie Praktyczną metodą obliczania NWD jest algorytm Euklidesa, czyli schemat postępowania oparty na twierdzeniu: a, b N, a>b NWD(a, b) = NWD(a b, b) Powtarzanie powyższej operacji prowadzi do ciągłego malenia wartości argumentów naturalnych dla których chcemy poznać wartość NWD i kończy się, gdy nie da się wskazać większego spośród pary argumentów - wówczas wystarczy dokonać oczywistego spostrzeżenia, że NWD(a, a) = a. Zatem niniejsze twierdzenie pozwala zawsze w sposób jednoznaczny poznać wartość NWD pary liczb. Pesymistyczna złożoność tego ujęcia algorytmu liczenia NWD(n, m) przystaje do O(max(n, m)).

Implementacja algorytmu Euklidesa - popularna heurystyka Niech a, b, k N oraz a > k b. Wówczas posługując się klasycznym ujęciem algorytmu Euklidesa (z poprzedniego slajdu) do obliczenia NWD(a, b), wykonywalibyśmy obliczenia: NWD(a, b) = NWD(a b, b) = NWD(a 2b, b) =... = NWD(a k b, b) Proces ten można uprościć zastępując wielokrotne odejmowanie poprzez operację reszty z dzielenia (zapożyczając ze składni języka C, oznaczać ją będziemy poprzez %). Korzystać zatem będziemy z nieco zmienionej, także poprawnej wersji twierdzenia: a, b N, a>b NWD(a, b) = NWD(a%b, b) Złożoność algorytmu maleje wówczas do O(log(max(n, m))).

Implementacja algorytmu Euklidesa - prosta implementacja Warunek stopu postaci NWD(a, a) = a można zmodyfikować - gdyby nie zatrzymać obliczeń, następnym krokiem byłoby pytanie o NWD(a, 0) - przyjmijmy zatem, że implementacja powinna wskazywać wynik NWD(a, 0) = a, a otrzymamy prosty kod: # Najwiekszy wspolny d z i e l n i k wersja rekurencyjna d e f nwd ( a, b ) : a s s e r t a!= 0 i f b == 0 : r e t u r n a e l s e : return nwd ( b, a % b ) Czyli: jeżeli b jest zerem, to NWD(a, b) wynosi a, w przeciwnym wypadku - NWD(a, b) jest równe tyle, co NWD(b, a%b). Jeżeli w danych wejściowych a nie jest zerem, to nigdy w wyniku wykonywania obliczeń do tego nie dojdzie, bo zawsze a > a%b. Linijkę z asercją oczywiście w praktyce (np. na SPOJu) pomijamy, ufając sobie że nie wywołamy funkcji nwd z pierwszym argumentem równym zero.

Implementacja algorytmu Euklidesa - zwięzła implementacja w C++ Poniższa rekurencyjna implementacja jest niezwykle krótka, gdy zapisze się ją w języku C++ (lub C), z wykorzystaniem operatora trójargumentowego. Przykład poniżej: unsigned i n t nwd ( unsigned i n t const &a, unsigned i n t const &b ) { a s s e r t ( a!= 0 ) ; return b? a : nwd ( b, a % b ) ; } Po usunięciu asercji, zostałoby nam proste, jednolinijkowe ciało funkcji. Aby nie zredukować rozwiązywania zadań do przepisania kodu przygotowanego od razu w C++, w dalszej części prezentacji pokazywane jednak będą wyłącznie pseudokody oparte na składni Pythona, takie jak na poprzednim slajdzie.

Implementacja algorytmu Euklidesa - po derekursywacji Dokonując derekursywacji mini-implementacji zaproponowanej na poprzednich slajdach, możemy zapisać: # N a j w i e k s z y wspolny d z i e l n i k w e r s j a i t e r a c y j n a d e f nwd ( a, b ) : a s s e r t a!= 0 w h i l e b!= 0 : t = b b = a % b a = t r e t u r n a Ta wersja jest już zupełnie optymalnym rozwiązaniem w dziedzinie pojedynczego obliczania NWD pary liczb naturalnych - złożoność obliczeniowa to O(log(max(n, m))), po usunięciu rekurencji mamy także zagrawantowaną złożoność pamięciową O(1) - i nic asymptotycznie lepszego nie uda się zaproponować. Ale...

Algorytm Steina Zauważyliśmy już, że wielokrotne odejmowanie jest nieoptymalne. Jednakże, większość procesorów lepiej radzi sobie z operacjami bitowymi i dodawaniem, niż z obliczaniem reszty z dzielenia. Stąd rodzi się pomysł na implementację nazywany binarnym NWD lub algorytmem Steina. Opiera się on na sposrzeżeniach: 1 Jeżeli przyjmiemy, że NWD(a, 0) = NWD(0, a) = a, oraz NWD(0, 0) = 0, obliczenia pozostaną poprawne. 2 Dla parzystych a, b mamy NWD(a, b) = 2 NWD(a/2, b/2) (co łatwo jest zaimplementować przesunięciami bitowymi). 3 Jeżeli a jest parzyste, zaś b jest nieparzyste (pamiętajmy też o przemienności NWD), to NWD(a, b) = NWD(a/2, b) (można zredukować wszystkie zera z końca zapisu binarnego liczby a). 4 Dla nieparzystych a, b mamy NWD(a, b) = NWD( a b /2, min(a, b)). Algorytm Steina nie poprawia asymptotycznej złożoności, lecz pozwala zmniejszyć praktyczny czas obliczeń, nawet o 62%.

Rozszerzony algorytm Euklidesa - czego dotyczy? Nieznacznie rozszerzając postępowanie wykonywane przy liczeniu NWD za pomocą algorytmu Euklidesa (także z heurystyką polegającą na obliczaniu reszty z dzielenia), możemy uzyskać metodę szukania liczb całkowitych p i q takich, że dla zadanych liczb naturalnych a, b: p a + q b = NWD(a, b) Postępowanie polegające na jednoczesnym obliczaniu liczb p, q, oraz NWD(a, b) nazywamy rozszerzonym algorytmem Euklidesa.

Rozszerzony algorytm Euklidesa - przykład Zauważmy, jak postępujemy obliczając NWD(162, 60). W ujęciu klasycznym: NWD(160, 62) = NWD(102, 60) 102 = 162 60 NWD(102, 60) = NWD(42, 60) 42 = 102 60 = (162 60) 60 = 162 2 60 NWD(60, 42) = NWD(18, 42) 18 = 60 42 = 60 (162 2 60) = 162 + 3 60 NWD(42, 18) = NWD(24, 18) 24 = 42 18 = (162 2 60) ( 162 + 3 60) = 2 162 5 60 NWD(24, 18) = NWD(6, 18) 6 = 24 18 = (2 162 5 60) ( 162 + 3 60) = 3 162 8 60 NWD(18, 6) = NWD(12, 6) = NWD(6, 6) = 6 Wykonując typowe dla algorytmu Euklidesa operacje, przy okazji zauważyliśmy, że 6 = 3 162 8 60.

Rozszerzony algorytm Euklidesa - uproszczenie przykładu Znacznie mniej obliczeń, a ten sam efekt, otrzymamy stosując heurystykę polegającą na zastąpieniu odejmowania resztami z dzielenia. NWD(160, 62) = NWD(42, 60) 42 = 162 2 60 NWD(60, 42) = NWD(18, 42) 18 = 60 42 = 60 (162 2 60) = 162 + 3 60 NWD(42, 18) = NWD(6, 18) 6 = 42 2 18 = (162 2 60) 2 ( 162 + 3 60) = 3 162 8 60 NWD(18, 6) = NWD(0, 6) = 6 Zatem rozszerzenie algorytmu Euklidesa doskonale komponuje się ze stosowaniem reszt z dzielenia - znacznie szybciej, bez specjalnego dostosowywania się do nowej metody, otrzymaliśmy ten sam rezultat co poprzednio. Pesymistyczna złożoność tej wersji jest taka sama, jak bez rozszerzenia: O(log(max(n, m))) - jedynie stała jest kilkukrotnie większa.

Rozszerzony algorytm Euklidesa - pseudokod Postępowanie przedstawione na przykładzie, na poprzednich dwóch slajdach, jest bardzo intuicyjne. Oto przykład zapisania tego rozumowania w naszym pseudokodzie: # R o z s z e r z o n y a l g o r y t m E u k l i d e s a # wynikiem sa t r z y l i c z b y : [ r, p, q ] t a k i e, ze # NWD( a, b ) = r = p a + q b d e f r o z s z e r z o n y E u k l i d e s ( a, b ) : a s s e r t a!= 0 # a = pa a + qa b pa = 1 qa = 0 # b = pb a + qb b pb = 0 qb = 1 w h i l e b!= 0 : # d z i e l e n i e bez r e s z t y : i l e r a z y a s i e m i e s c i w b quot = a / b # z a p a m i e t a n i e w a r t o s c i a i p a s u j a c y c h do n i e j w s p o l c z y n n i k o w o l d a = a o l d p a = pa o l d q a = qa # p r z y p i s a n i e b do a ( wraz ze w s p o l c z y n n i k a m i ) a = b pa = pb qa = qb # p r z y p i s a n i e do b r e s z t y z d z i e l e n i a a p r z e z b, o b l. w s p o l c z y n n i k o w b = o l d a r b pb = o l d p a r pb qb = o l d q a r qb r e t u r n [ a, pa, qa ]

Odwrotność w pierścieniach Z n - definicja Odwrotnością przeważnie nazywa się element odwrotny względem działania mnożenia, czyli taki element a 1, który dla danego a spełnia zależność a 1 a = a a 1 = 1, gdzie 1 to element neutralny mnożenia. Tak jest też w tym przypadku. Mnożenie w pierścieniu Z n (jego elementami są liczby całkowite od 0 do n 1) oznacza wyznaczanie reszty z dzielenia iloczynu pary liczb przez n, np. w pierścieniu Z 7 otrzymujemy, że 5 pomnożone przez 4 daje 6 (gdyż w zwykłym zbiorze liczb całkowitych Z jest to liczba 20, która przy dzieleniu przez 7 daje resztę 6). Odwrotność elementu w pierścieniu Z n nie zawsze istnieje (za chwilę to pokażemy). Jeżeli jednak akurat istnieje odwrotność liczby a w pierścieniu Z n (oznaczmy ją jako p), to oznacza to, że: k Z a p = k n + 1

Odwrotność w pierścieniach Z n - wyznaczanie Okazuje się, że warunkiem koniecznym istnienia odwrotności liczby a w Z n jest to, aby liczby a i n były względnie pierwsze, czyli NWD(a, n) = 1. Przypomnijmy, co nam może dać rozszerzony algorytm Euklidesa: p a + q n = NWD(a, n) p a + q n = 1 p a = ( q) n + 1 p a (1 mod n) Jeżeli NWD(a, n) = 1, to odwrotnością liczby a w pierścieniu Z n jest liczba p, którą wyznaczamy za pomocą rozszerzonego algorytmu Euklidesa. Oznaczamy p (a 1 mod n).

Wreszcie - chińskie twierdzenie o resztach! Chińskie twierdzenie o resztach, w ujęciu formalnym, mówi o tym, mając dany układ kongruencji: x (m 1 mod n 1 ) x (m 2 mod n 2 ) x (m k mod n k ) Można jednoznacznie ( wskazać, ile wynosi reszta z dzielenia liczby ki=1 ) x przez NWW {n i }. Innymi słowy, istnieje dokładnie jedna ( ki=1 ) taka liczba 1 x 0 NWW {n i }, która spełnia wskazany układ kongruencji. Warto zauważyć, że jeżeli liczby n i (dla i = 1. (.. k) są parami względnie pierwsze, to ki=1 ) NWW {n i } = n 1 n 2... n k.

Chińskie twierdzenie o resztach - uproszczenie Aby rozwiązywać takie układy kongruencji, wystarczy jednak posiadać umiejętność sprowadzenia dwóch kongruencji do jednej równoważnej z nimi. Zapiszmy zatem: { x (m1 mod n 1 ) x (m 2 mod n 2 ) Co więcej, wystarczy, abyśmy potrafili rozwiązać przypadek względnie pierwszych n 1 i n 2. Jeżeli n 1 i n 2 nie są względnie pierwsze, to zamiast pary reszt z dzielenia przez n 1 i n 2 możemy rozważać reszty z dzielenia przez n 1 oraz n 2 /NWD(n 1, n 2 ), a sprowadzimy problem do składania kongruencji ze względnie pierwszymi dzielnikami (i w wyniku otrzymamy resztę z dzielenia przez n 1 (n 2 /NWD(n 1, n 2 )) = NWW(n 1, n 2 )).

Chińskie twierdzenie o resztach - wyznaczenie wzoru Zatem szukamy reszty z dzielenia liczby x przez n 1 n 2, wiedząc, że liczby n 1 oraz n 2 są względnie pierwsze, oraz: { x (m1 mod n 1 ) x (m 2 mod n 2 ) Z rozszerzonego algorytmu Euklidesa, możemy wskazać takie p 1, p 2, że: p 1 n 1 + p 2 n 2 = NWD(n 1, n 2 ) = 1 Wówczas p 1 n 1 daje resztę 0 przy dzieleniu przez n 1 i resztę 1 przy dzieleniu przez n 2. Analogicznie jest z p 2 n 2 - otrzymujemy resztę 0 przy dzieleniu przez n 2 i resztę 1 przy dzieleniu przez n 1. Zatem liczba x 0 = p 1 n 1 m 2 + p 2 n 2 m 1 musi spełniać obie kongruencje. Pozostałe rozwiązania różnią się o całkowitą wielokrotność n 1 n 2. Mamy zatem całą klasę rozwiązań, co należało wyznaczyć.

Chińskie twierdzenie o resztach - pseudokod Algorytm postępowania z układem kongruencji jest obudową na rozszerzony algorytm Euglidesa, a złożoność wynosi O(log(max(n 1, n 2 ))). Łączenie większej liczby kongruencji naraz nie poprawia tego wyniku, zatem wystarczy nam doklejać kongruencje z układu po jednej, aż do uzyskania wyniku końcowego. # przyjmuje jako argumenty dwie pary : [ ni, mi ] # o z n a c z a j a c e, ze szukane x p r z y s t a j e do mi modulo n i # wynikiem j e s t j e d n a para [ n, m] taka, ze x p r z y s t a j e do n modulo m # i wynik j e s t rownowazny k o n i u n k c j i argumentow d e f z l a c z K o n g r u e n c j e ( [ n1, m1 ], [ n2, m2 ] ) : # zapewniamy wzgledna p i e r w s z o s c n1 i n2 n2 = n2 / nwd ( n1, n2 ) # naprawiamy m2, j e s l i p o t r z e b a ( r e s z t a z r e s z t y d z i e l e n i a ) m2 = m2 % n2 # odczytujemy wynik r o z s z e r z o n e g o a l g o r y t m u E u k l i d e s a [ u, p1, p2 ] = r o z s z e r z o n y E u k l i d e s ( n1, n2 ) # NWD musi byc rowne jeden, bo p r z e c i e z to zapewnialismy a s s e r t u == 1 # ustalamy parametry wyniku, zgodnie z poprzednim slajdem n = n1 n2 m = p1 n1 m2 + p2 n2 m1 # zapewniamy, ze m nalezy do Z n m = m % n r e t u r n [ n, m]