Ćwiczenia z teoria liczb, ciąg dalszy (pt 15 maja) Matematyka Dyskretna Przypomnienie: Mówimy a⊥b (a jest względnie pierwsze z b) jeśli N W D(a, b) = 1. (Zero jest podzielne przez każdą liczbę naturalną, więc jest względnie pierwsze tylko z 1). Zbiór liczb względnie pierwszych z n oznaczamy Z∗n (na Wikipedii (Z/nZ)× ). Mnożenie dwóch liczb w Z∗n daje znowu liczbę ⊥n. Dla każdej liczby a⊥n istnieje dokładnie jedna liczba a−1 taka, że aa−1 ≡ a−1 a ≡ 1 (mod n) (np. 13 mod 10 ≡ 7, więc 23 mod 10 ≡ 4 i rzeczywiście 4 · 3 mod 10 = 2; ale żadna liczba pomnożona przez 2 nie da 1 mod 10, więc 2−1 mod 10 nie ma sensu, dokładnie tak jak dzielenie przez zero). Z tego wynika, że Z∗n tworzy grupę ze względu na mnożenie, czyli póki posługujemy się liczbami względnie pierwszymi z n modulo n to można normalnie mnożyć i dzielić. Małe tw. Fermata: ap−1 ≡ 1 (mod p) dla p pierwszego i a⊥p (ten ostatni warunek znaczy po prostu, że a nie jest podzielne przez p, ale lepiej tak go zapamiętać). Ogólniej tw. Eulera aϕ(n) ≡ 1 (mod n) dla a⊥n. Tu ϕ(n) to liczba liczb względnie pierwszych z n, czyli ϕ(n) = |Z∗n |. Np. ϕ(p) = p − 1 dla pierwszych p, bo wszystkie liczby od 1 do p − 1 są ⊥p. Generalnie łatwo pokazać ϕ(pα ) = pα − pα−1 = pα (1 − p1 ) oraz że dla a⊥b zachodzi ϕ(a · b) = ϕ(a) · ϕ(b). Więc jak znamy rozkład liczby n = pα1 1 pα2 2 · · · , to łatwo policzyć φ(n) = n · (1 − p11 ) · (1 − p12 ) · · · . Np. φ(100) = φ(22 · 52 ) = 100 · (1 − 12 ) · (1 − 15 ) = 40. To w szczególności daje metodę na liczenie odwrotności modulo: jeśli a⊥n, to a−1 ≡ aφ(n)−1 (mod n), no bo iloczyn aφ(n)−1 · a ≡ 1 (mod n) z tw. Eulera. Jeśli rozkładu nie znamy, to szybsza metoda wynika z rozszerzonego algorytmu Euklides: skoro N W D(a, n) = 1, to znajduje on liczby x, y takie, że ax + ny = 1. Czyli ax ≡ 1 (mod n) i x (mod n) jest szukaną odwrotnością. Q1.: Udowodnij, że iloczyn trzech kolejnych liczb naturalnych, z których środkowa jest sześcianem, dzieli się przez 504. Przypomnienie: ChTwoR mówi, że dla n = n1 · n2 · · · gdzie ni ⊥nj , mamy bijekcję między resztami mod n a ciągami reszt mod ni . Inaczej mówiąc każdy układ równań x ≡ a1 (mod n1 ), x ≡ a2 (mod n2 ), · · · ma dokładnie jedno rozwiązanie x ∈ {0, . . . , n − 1}. Q2.: Wiemy z tw. Eulera, że ∀a⊥100 aφ(100) ≡ 1 (mod 100). Znajdź liczbę 0 < λ < φ(100) = 40 taką, że ∀a⊥100 aλ ≡ 1 (mod 100). Jak użytą metodę uogólnić do n innych niż 100? Q3.: Pokaż, że istnieje 2011 kolejnych liczb naturalnych, z których każda jest podzielna przez jakiś sześcian. A1.: Chcemy pokazać, że dla każdego n ∈ N zachodzi 504 | (n3 − 1)n3 (n3 + 1). Łatwo znaleźć rozkład 504 = 8 · 63 = 8 · 9 · 7, czyli wystarczy pokazać, że dla każdego n mamy 8 | (n3 − 1)n3 (n3 + 1) i 7 | (n3 − 1)n3 (n3 + 1) i 9 | (n3 − 1)n3 (n3 + 1) (czyli możemy się skupić na podzielności przez potęgę liczby pierwszej, a drobniej już raczej trudno będzie patrzeć, bo z tego że dwa razy pokażemy podzielność przez 3 rzadko wynika podzielność przez 9). To, że 8 | (n3 − 1)n3 (n3 + 1) widać z tego, że albo n jest parzyste i wtedy 8 | n3 , albo jest nieparzyste i wtedy jeden z nawiasów jest podzielny przez 4 a drugi przez 2 albo odwrotnie. Sprobójmy pokazać 7 | (n3 − 1)n3 (n3 + 1). Jeśli 7 dzieli n to ok, a jeśli nie to może dzielić tylko (n3 − 1)(n3 + 1). Tu można zauważyć, że (n3 − 1)(n3 + 1) = n6 − 1. Teraz z małego tw. Fermata wynika, że n6 ≡ 1 (mod 7), skoro n nie jest podzielne przez 7. Czyli rzeczywiście 7 | n6 − 1. Podobnie dla 9 | (n3 − 1)n3 (n3 + 1): albo 3 dzieli n i jest ok, albo nie dzieli i wtedy n3 nic nie pomoże. Czyli chcemy pokazać w tym drugim przypadku 9 | n6 −1 i to rzeczywiście zachodzi z tw. Eulera, bo założyliśmy, że 3 nie dzieli n oraz liczymy φ(9) = 9(1 − 31 ) = 6. Inne rozwiązanie to sprawdzić, że 13 , 23 , . . . , b9 − 1c3 (mod 9) przystają do −1, 0 lub 1, ale jest to w ogólności bardziej pracochłonne no i nie widać dlaczego się akurat tak zgodziło. A2.: Musimy jakoś skorzystać z a⊥100. Potrafimy z tw. Eulera powiedzieć, że wtedy np.: aφ(10) ≡ 1 (mod 10) aφ(4) ≡ 1 (mod 4) aφ(25) ≡ 1 (mod 25) No i jak by tu skorzystać z różnych kongruencji żeby dostać jedną? Narzuca się ChTwoR: jeśli pokażemy, że aλ1 ≡ 1 (mod n1 ) a λ2 ≡ 1 (mod n2 ) dla jakichś n1 ⊥n2 , to z tego np. wynika, że a λ1 λ2 ≡ 1 λ2 ≡ 1 (mod n1 ) a λ1 λ2 ≡ 1 λ1 ≡ 1 (mod n2 ) Z ChTwoR aλ1 λ2 jest jedyną liczbą (mod n1 n2 ), która daje reszty 1 (mod ni ), ale taką liczbą jest 1, więc aλ1 λ2 ≡ 1 (mod n1 n2 ). Żeby to wykorzystać musimy mieć n1 ⊥n2 , więc możemy skorzystać tylko z kongruencji dla 4 i dla 25. I rzeczywiście φ(4) = 2, φ(25) = 20 , czyli mamy a2 ≡ 1 (mod 4) a20 ≡ 1 (mod 25) Potegując pierwszą do dziesiątej dostaniemy a20 ≡ 1 (mod 4) a20 ≡ 1 (mod 25) a20 ≡ 1 (mod 100) czyli z ChTwoR Więc λ = 20 spełnia warunki zadania. αi Ogólniej każdą liczbę n możemy rozłożyć na n = pα1 1 pα2 2 · · · , użyć kongruencji aφ(pi ) ≡ 1 (mod pαi i ), wszystkie dopotęgować żeby uzyskać wspólny wykładnik i użyć ChTwoR, żeby dostać α1 α2 aN W W (φ(p1 ),φ(p2 ),... ) ≡ 1 (mod n) A3.: Jak stwierdzenie jest prawdziwe dla 2011, to jest też prawdziwe dla 2010, więc raczej w liczbie 2011 nie ma nic specjalnego, chcemy po prostu pokazać, że można znaleźć dowolnie wiele kolejnych liczb podzielnych przez sześcian. Jak nie mamy pomysłu można spróbować to inaczej zapisać. Chcemy znaleźć taką liczbę x, że n30 dzieli x, n31 dzieli x + 1, i tak dalej, n3i dzieli x + i. Czyli chcemy znaleźć liczbę x, która spełnia różne podzielności, w jakimś sensie. Tu się powinno już narzucać ChTwoR. Szukamy takiej liczby x, że x ≡ −i (mod n3i ) (dla i = 0, . . . , 2010 i dowolnych ni ). No i rzeczywiście, jeśli wybierzemy względnie pierwsze liczby n0 , . . . , n2010 (a za takie możemy wziąć po prosu kolejne liczby pierwsze), to istnieje dokładnie jedno rozwiązanie x ∈ {0, . . . , n30 n31 · · · n32010 − 1} zestawu kongruencji x ≡ −i (mod n3i ). Q4.: Drzewo Sterna-Brocota zawierające nieskracalne ułamki powstaje w następujący sposób. Zaczynamy od ciągu [ 01 , 10 ] (o 10 myślimy jako ∞). W każdym kroku między każde 0 0 dwie kolejne liczby ab oraz ab0 wsadzamy liczbę a+a b+b0 . Czyli po pierwszym kroku mamy [ 01 , 11 , 10 ], po kolejnych 0 1 1 2 1 [ , , , , ] 1 2 1 1 0 0 1 1 2 1 3 2 3 1 [ , , , , , , , , ] 1 3 2 3 1 2 1 1 0 Można to też widzieć jako następujące drzewo: Pokaż, że: a) po każdym kroku liczby występują rosnąco. b) Wszystkie występujące ułamki są skrócone. c) Jak znaleźć liczbę w tym drzewie, jeśli istnieje? d∗ ) Pokaż, że każdy nieskracalny ułamek jest w drzewie dokładnie raz. A4.: a) Skoro konstrukcja jest indukcyjna, to dowód pewnie też. Jeśli po jakimś kroku 0 0 mamy kolejno ab < ab0 , to wystarczy sprawdzić ab < a+a b+b0 (i tak samo drugą stronę). Ale 0 to jest równoważne ab + ab0 < ab + a0 b, czyli ab0 < a0 b, czyli ab < ab0 . (Formalnie 10 trzeba by rozważyć osobno, ale darujmy sobie). b) Ułamek ab jest skrócony wtw gdy a⊥b. Ale niestety taka teza nie przechodzi indukcyjnie. Trzeba spróbować ją przeformułować i wzmocnić. Teza znaczy to samo co N W D(a, b) = 1, więc może warto powiedzieć, że jest też równoważna stwierdzeniu, że istnieją liczby x, y ∈ N takie, że ax + by = 1. To może spełniają zawsze jakąś konkretną równość? Rzeczywiście kolejne liczby w ciągu wyglądają na powiązane i jak spojrzeć i popróbować to widać, że zawsze dwie kolejne liczby po danym kroku spełniają a0 b−ab0 = 1. I taka teza już łatwo przechodzi indukcyjnie. c) Skoro z a) wiemy, że liczby mniejsze od danej leżą na lewo od niej, większe na prawo, to 0 można zrobić wyszukiwanie binarne. Szukając xy zaczniemy od przedziału ( ab , ab0 ) = ( 01 , 10 ) 0 0 0 i testujemy środek. Jeśli xy < a+a b0 := b + b0 , jeśli > to b+b0 , to zmieniamy a := a + a ; zmieniamy analogicznie a, b, jeśli równe to znaleźliśmy. Zachowujemy tu niezmiennik, że a a a0 x a0 b < y < b0 oraz b , b0 są kolejnymi liczbami w ciągu po kolejnym kroku. Podobnie można szukać przybliżeń dowolnej liczby rzeczywistej: szukamy tym algorytmem i kończymy po małej liczbie kroków. Właśnie po to oryginalnie Brocot wymyślił to drzewo, bo potrzebował przybliżać rzeczywiste stosunki ilorazami liczb zębów w kołach zębatych. d) Generalnie łatwo zauważyć, że ułamki w kolejnych krokach ’rosną’, konkretnie na pewno jedna z liczb a, a0 , b, b0 w każdym kroku algorytmu rośnie i żadna nie maleje. Więc wystarczyłoby znaleźć takie wyrażenie rosnące razem z nimi, które byłoby ograniczone z góry przez coś zależącego tylko od x i y – gdyby taki niezmiennik był spełniony, to liczby nie mogłyby rosnąć dowolnie, więc algorytm musiałby kiedyś skończyć. Możemy spróbować 0 z znanych już niezmienników coś wywnioskować: ab < xy < ab0 oraz a0 b − ab0 = 1 dają nam dwie nierówności i równość, więc mamy dużą szansę znaleźć odpowiednią kombinację liniową. Chcemy tylko wyrażenia rosnące z a, b, a0 , b0 , więc nierówności przedstawmy jako ay < bx, b0 x < a0 y, korzystając z całkowitości 1 + ay ¬ bx, 1 + b0 x ¬ a0 y. Oddzielić zależność od a, b, a0 , b0 od zależności od x, y możemy biorąc następującą kombinację liniową: mnożymy pierwszą nierówność przez a0 , drugą przez a i dodając mamy: a+a0 +a0 ay+ab0 x ¬ a0 bx + aa0 y, bo teraz stosując równość z b) i skracając mamy a + a0 ¬ (a0 b − ab0 )x = x. Podobnie mnożąc przez b0 i b dostaniemy b + b0 ¬ (ba0 − a0 b)y = y. Czyli a + a0 + b + b0 ¬ x + y. Wyrażenie po lewej rośnie w każdym kroku, po prawej się nie zmienia, ale nierówność jest spełniona w każdym kroku, więc kroków jest skończenie wiele, czyli w co najwyżej x + y krokach znajdziemy ułamek xy w drzewie. Na wiki jest naszkicowane jak ścieżka w drzewie odpowiada ułamkowi łańcuchowemu, co daje inny dowód, może bardziej konkretny i naoczny, że znajdziemy liczbę xy gdzieś w drzewie. Tak więc liczby wymierne można reprezentować jako ciąg 0-1 mówiący czy idziemy w lewo czy w prawo w drzewie, co może się przydać w scenariuszach gdzie potrzebujemy porównywać, wyszukiwać i przybliżać liczby skróconymi, możliwie krótkimi ułamkami.