Wrocław, 28.11.2017 Wstęp do informatyki i programowania: liczby pierwsze Wydział Matematyki Politechniki Wrocławskiej Andrzej Giniewicz
Dzisiaj na zajęciach... Zajmiemy się liczbami pierwszymi... liczby pierwsze, liczba liczb pierwszych, rozkład na czynniki pierwsze, liczby towarzyskie. 1/25
Liczby pierwsze Liczby pierwsze 2/25
Liczba pierwsza Wszyscy wiedzą, ale dla pewności... Liczby pierwsze 3/25
Liczba pierwsza Wszyscy wiedzą, ale dla pewności... Liczba pierwsza, to liczba naturalna, która ma dwa i tylko dwa dzielniki. Liczby pierwsze 3/25
Jak szukać? Załóżmy, że n nie jest liczbą pierwszą (jest liczbą złożoną). Wtedy możemy ją zapisać jako iloczyn n = a b. Załóżmy nie wprost, że a i b są jednocześnie większe od n. Stąd n = a b > n n = n, czyli mamy sprzeczność z założeniem. Oznacza to, że a n lub b n. Liczby pierwsze 4/25
Jak szukać? Załóżmy, że n nie jest liczbą pierwszą (jest liczbą złożoną). Wtedy możemy ją zapisać jako iloczyn n = a b. Załóżmy nie wprost, że a i b są jednocześnie większe od n. Stąd n = a b > n n = n, czyli mamy sprzeczność z założeniem. Oznacza to, że a n lub b n. W szczególności, oznacza to, że liczba złożona n ma dzielnik pierwszy mniejszy lub równy n. Liczby pierwsze 4/25
Sprawdzanie Wystarczy sprawdzić liczby po kolei. def czy_pierwsza ( n ) : i f n < 2: return False k = 2 while k k <= n : i f n%k == 0: return False k += 1 return True Liczby pierwsze 5/25
A co gdy potrzebujemy wielu? Co, gdy potrzebujemy wielu liczb pierwszych, na przykład mniejszych od zadanego n? Liczby pierwsze 6/25
A co gdy potrzebujemy wielu? Co, gdy potrzebujemy wielu liczb pierwszych, na przykład mniejszych od zadanego n? Sprawdzajmy po kolei! Liczby pierwsze 6/25
A co gdy potrzebujemy wielu? Co, gdy potrzebujemy wielu liczb pierwszych, na przykład mniejszych od zadanego n? Sprawdzajmy po kolei! Ile czasu nam to zajmie? Oszacujmy, ile sprawdzeń podzielności wykonujemy... Liczby pierwsze 6/25
A co gdy potrzebujemy wielu? Co, gdy potrzebujemy wielu liczb pierwszych, na przykład mniejszych od zadanego n? Sprawdzajmy po kolei! Ile czasu nam to zajmie? Oszacujmy, ile sprawdzeń podzielności wykonujemy... Do sprawdzenia liczby n, wykonujemy około n sprawdzeń. A ponieważ sprawdzamy wszystkie liczby mniejsze od n, to sprawdzeń jest n k=1 ( 2 k n + 1 2 0.225. 3 2)3 Liczby pierwsze 6/25
Szybciej? Weźmy dowolną liczbę p, wobec tego na pewno 2p, 3p, 4p,... są liczbami złożonymi. Co gdybyśmy zaczęli wykreślać? 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 Liczby pierwsze 7/25
Szybciej? Weźmy dowolną liczbę p, wobec tego na pewno 2p, 3p, 4p,... są liczbami złożonymi. Co gdybyśmy zaczęli wykreślać? 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 Najpierw 0 i 1 X, X, 2, 3, 4, 5, 6, 7, 8, 9, 10. Liczby pierwsze 7/25
Wykreślamy Weźmy pierwszą niewykreśloną (2) i wykreślmy wielokrotności. X, X, 2, 3, X, 5, X, 7, X, 9, X Liczby pierwsze 8/25
Wykreślamy Weźmy pierwszą niewykreśloną (2) i wykreślmy wielokrotności. X, X, 2, 3, X, 5, X, 7, X, 9, X Teraz 3. X, X, 2, 3, X, 5, X, 7, X, X, X Liczby pierwsze 8/25
Wykreślamy Weźmy pierwszą niewykreśloną (2) i wykreślmy wielokrotności. X, X, 2, 3, X, 5, X, 7, X, 9, X Teraz 3. X, X, 2, 3, X, 5, X, 7, X, X, X I już, zostały liczby pierwsze. Liczby pierwsze 8/25
Wykreślamy Weźmy pierwszą niewykreśloną (2) i wykreślmy wielokrotności. X, X, 2, 3, X, 5, X, 7, X, 9, X Teraz 3. X, X, 2, 3, X, 5, X, 7, X, X, X I już, zostały liczby pierwsze. Ten pomysł nazywa się sitem Eratostenesa. Liczby pierwsze 8/25
Sito Eratostenesa def pierwsze ( n ) : kandydaci = l i s t ( range ( n + 1 ) ) kandydaci [ 0 ] = None kandydaci [ 1 ] = None for x i n kandydaci : i f x i s None : continue i f x x > n : break for y i n range (2 x, n+1, x ) : kandydaci [ y ] = None return [ x for x i n kandydaci i f x i s not None ] http://tinyurl.com/z8z8t7f Liczby pierwsze 9/25
Co dalej Sito pozwala znaleźć liczby pierwsze mniejsze lub równe n, a co, gdy potrzebujemy znaleźć pierwszych N liczb pierwszych? Liczby pierwsze 10/25
Co dalej Sito pozwala znaleźć liczby pierwsze mniejsze lub równe n, a co, gdy potrzebujemy znaleźć pierwszych N liczb pierwszych? Przyda się ograniczenie. Można pokazać, że p n n-ta liczba pierwsza, dla n 6 spełnia nierówność p n < n log(n) + n log(log(n)). Liczby pierwsze 10/25
Co dalej Sito pozwala znaleźć liczby pierwsze mniejsze lub równe n, a co, gdy potrzebujemy znaleźć pierwszych N liczb pierwszych? Przyda się ograniczenie. Można pokazać, że p n n-ta liczba pierwsza, dla n 6 spełnia nierówność p n < n log(n) + n log(log(n)). Ponieważ p 6 = 17, to możemy przyjąć, że p n < max{17, n log(n) + n log(log(n)) }. Liczby pierwsze 10/25
Pierwsze pierwsze from math import log, c e i l def pierwszen ( N ) : N0 = max(17, c e i l (N log (N)+N log ( log (N ) ) ) ) p = pierwsze (N0) return p [ : N] Liczby pierwsze 11/25
Liczba liczb pierwszych Liczba liczb pierwszych 12/25
Liczba liczb pierwszych Liczba liczb pierwszych mniejszych lub równych n jest interesująca z wielu punktów widzenia (na przykład analizy zagadnień z kryptografii). Oznaczamy ją π(n). Liczba liczb pierwszych 13/25
Liczba liczb pierwszych Liczba liczb pierwszych mniejszych lub równych n jest interesująca z wielu punktów widzenia (na przykład analizy zagadnień z kryptografii). Oznaczamy ją π(n). Niestety, nie da się jej wyliczyć analitycznie, choć możemy zrobić len ( pierwsze ( n ) ) Liczba liczb pierwszych 13/25
Liczba liczb pierwszych Liczba liczb pierwszych mniejszych lub równych n jest interesująca z wielu punktów widzenia (na przykład analizy zagadnień z kryptografii). Oznaczamy ją π(n). Niestety, nie da się jej wyliczyć analitycznie, choć możemy zrobić len ( pierwsze ( n ) ) Niestety jeśli chcemy wyliczyć wiele wartości π(n), wyznaczalibyśmy sito wiele razy niepotrzebnie. Liczba liczb pierwszych 13/25
Pomysł Liczba liczb pierwszych zaczyna się od 0 i zwiększa o 1 za każdym razem, gdy natrafimy na liczbę pierwszą. Wobec tego, wygenerujmy liczby pierwsze mniejsze lub równe N i na podstawie tego wyznaczmy wartość funkcji pi(n) dla n = 0,..., N Liczba liczb pierwszych 14/25
Liczba liczb pierwszych def p i (N ) : p = pierwsze (N) wyniki = [ ] y = 0 n = len ( p ) for x i n range (N+ 1 ) : i f y < n and p [ y ] <= x : y += 1 wyniki. append ( y ) return wyniki http://tinyurl.com/zj9coz3 Liczba liczb pierwszych 15/25
Co z tym π? Co ciekawe, dla odpowiednio dużych n, π(n) n log(n), w sensie lim n π(n) n log(n) = 1. Liczba liczb pierwszych 16/25
Rozkład na czynniki pierwsze Rozkład na czynniki pierwsze 17/25
Rozkład na czynniki Rozkład liczby naturalnej n na czynniki pierwsze, to zapisanie jej w postaci n = p a 1 1... pa k k, gdzie p k to liczby pierwsze, natomiast a k to liczby naturalne. Rozkład na czynniki pierwsze 18/25
Rozkład na czynniki Rozkład liczby naturalnej n na czynniki pierwsze, to zapisanie jej w postaci n = p a 1 1... pa k k, gdzie p k to liczby pierwsze, natomiast a k to liczby naturalne. Jak możemy reprezentować rozkład na czynniki? Za pomocą słownika: { p1 : a1, p2 : a2,... } Przykładowo { 2 : 3, 3: 1, 5: 1} To 2 3 3 1 5 1 = 120. Rozkład na czynniki pierwsze 18/25
Jak? Dla liczby n: 1. szukamy liczb pierwszych mniejszych lub równych n, Rozkład na czynniki pierwsze 19/25
Jak? Dla liczby n: 1. szukamy liczb pierwszych mniejszych lub równych n, 2. tak długo, jak liczba jest podzielna przez 2, dzielimy liczbę przez 2 i zwiększamy liczbę dwójek o 1, Rozkład na czynniki pierwsze 19/25
Jak? Dla liczby n: 1. szukamy liczb pierwszych mniejszych lub równych n, 2. tak długo, jak liczba jest podzielna przez 2, dzielimy liczbę przez 2 i zwiększamy liczbę dwójek o 1, 3. powtarzamy dla kolejnych liczb pierwszych, Rozkład na czynniki pierwsze 19/25
Jak? Dla liczby n: 1. szukamy liczb pierwszych mniejszych lub równych n, 2. tak długo, jak liczba jest podzielna przez 2, dzielimy liczbę przez 2 i zwiększamy liczbę dwójek o 1, 3. powtarzamy dla kolejnych liczb pierwszych, 4. na końcu albo zostanie jedynka albo liczba pierwsza. Jeśli została liczba pierwsza, dodajemy ją do listy dzielników. Rozkład na czynniki pierwsze 19/25
Co z tym możemy zrobić? Na przykład odpowiedzieć ile liczba ma dzielników... def i l e _ d z i e l n i k ów( s ł ownik ) : wynik = 1 for x i n s ł ownik. values ( ) : wynik = x+1 return wynik Rozkład na czynniki pierwsze 20/25
... albo znaleźć dzielniki. def l i s t a _ d z i e l n i k ów( s ł ownik ) : def l i s t a ( pary ) : i f not pary : return [ 1 ] ( n, k ) = pary [ 0 ] bez_1 = l i s t a ( pary [ 1 : ] ) wynik = [ ] mnoż nik = n for i i n range ( k ) : wynik += [ x mnoż nik for x i n bez_1 ] mnoż nik = n return bez_1 + wynik return sorted ( l i s t a ( l i s t ( s ł ownik. items ( ) ) ) ) http://tinyurl.com/hpp6c4e Rozkład na czynniki pierwsze 21/25
Liczby towarzyskie Liczby towarzyskie 22/25
Liczby... towarzyskie? Liczby F 1,..., F n są towarzyskie rzędu n, jeżeli: suma dzielników włąściwych liczby F i jest równa liczbie F i+1 dla i = 1,..., n 1, suma dzielników właściwych liczby F n jest równa liczbie F 1, dla żadnego k, 0 < k < n, liczby F 1,..., F k nie są towarzyskie rzędu k. Liczby towarzyskie 23/25
Liczby... towarzyskie? Liczby F 1,..., F n są towarzyskie rzędu n, jeżeli: suma dzielników włąściwych liczby F i jest równa liczbie F i+1 dla i = 1,..., n 1, suma dzielników właściwych liczby F n jest równa liczbie F 1, dla żadnego k, 0 < k < n, liczby F 1,..., F k nie są towarzyskie rzędu k. Liczby towarzyskie rzędu 2 nazywamy zaprzyjaźnionymi, natomiast liczby towarzyskie rzędu 1, doskonałymi. Liczby towarzyskie 23/25
Liczby... towarzyskie? Liczby F 1,..., F n są towarzyskie rzędu n, jeżeli: suma dzielników włąściwych liczby F i jest równa liczbie F i+1 dla i = 1,..., n 1, suma dzielników właściwych liczby F n jest równa liczbie F 1, dla żadnego k, 0 < k < n, liczby F 1,..., F k nie są towarzyskie rzędu k. Liczby towarzyskie rzędu 2 nazywamy zaprzyjaźnionymi, natomiast liczby towarzyskie rzędu 1, doskonałymi. Przykładowo, liczba 6 jest doskonała, ponieważ jej dzielniki właściwe to 1, 2 oraz 3 oraz 1 + 2 + 3 = 6. Liczby towarzyskie 23/25
W następnym odcinku W końcu zajmiemy się sortowaniem. Liczby towarzyskie 24/25
Pytania? Pytania? 25/25