Znajdowanie N kolejnych liczb pierwszych - \(O(n \sqrt{n})\)

Można iść po kolei od 1 do N i dla każdej liczby sprawdzać czy jest ona liczbą pierwszą, ale było by to bardzo czaso chłonne. Zajeło by to \(n \sqrt{n}\) operacji, czyli już dla \(N = {10}^{9}\) mielibyśmy już problem - obliczanie zajeło by około jedną dobę.

Krok po kroku do celu

Początkowo mamy listę 200 kolejnych liczb całkowitych od 2 do 200:

2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200

  • Zauważmy, że liczby parzyste większe niż 2 nie mogą być liczbami pierwszymi - są podzielne przez 2, dlatego wykreślmy je z listy:

    2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200

  • Zauważmy, że liczby podzielne przez 3 większe niż 3 też nie mogą być liczbami pierwszymi, dlatego wykreślmy je z listy:

    2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200

  • To samo moglibyśmy zrobić dla 4, ale przecierz wszystkie liczby podzielne przez 4 i większe od 4 są już wykreślone - są przecierz podzielne też przez 2!

  • Powtarzamy proces dla 5:

    2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200

  • Analogicznie do 4, 2 też jest dzielnikiem 6, więc wszystkie interesujące nas liczby są już wykrślone.

  • Powtarzamy proces dla 7:

    2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200

  • 8 pomijamy - 2 | 8.

  • 9 pomijamy - 3 | 9.

  • 10 pomijamy - 2 | 10 i 5 | 10.

  • Analogicznie wykonujemy te operacje dla liczb: 11 i 13:

    2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200

  • 15 nie musimy już sprawdzać, bo jest mniejszy \(\sqrt{n}\) - uzyskane wielokrotności będą miały postać \(p \cdot k \le n\) (\(p\) = w tym przypadku 15), gdzie \(p \gt \sqrt{n}\), czyli \(k \lt p\), zatem wszystkie wielokrotności wszystkich dzielników pierwszych \(k\) zostały już usunięte, dzięki czemu możemy zakończyć usuwanie.

Zostały nam same liczby pierwsze!

Rozważenia końcowe

Zauważmy, że wykreślaliśmy wielokrotności tylko dla liczb pierwszych mniejszych od \(\sqrt{n}\), czyli nie wykreślonych, a przecierz skoro wykreśliliśmy już wielokrotności dla liczb mniejszych od tej liczby i będziemy już tylko wykreślać wielokrotności liczb większych lub równych od rozpatrywanej liczby to nie będziemy już zmieniać jej statusu.

Złożoność czasowa

Robimy wykreślenia dla wszystkich liczb pierwszych \(\le \sqrt{n}\). Wtakim razie liczba operacji wynosi około: $$ n + \pi (\sqrt{n}) + \sum_{i=1}^{\pi (\sqrt{n})}{\frac{n}{p_i}} \le n + \pi (\sqrt{n}) + \sum_{i=1}^{\pi (\sqrt{n})}{\frac{n}{i}} = n + \pi (\sqrt{n}) + n \sum_{i=1}^{\pi (\sqrt{n})}{\frac{1}{i}} $$

\(\pi (x)\) to funkcja określająca liczbę liczb pierwszych od 1 do x.

\(p_i\) oznacza tutaj i-tą liczbę pierwszą.

Ale przecierz z ustaleń Galileusza wynika, że: $$ \pi (x) \approx \frac{x}{2 \log_{10}{x}} \approx \frac{x}{\log_{2}{x}} $$

Czyli: $$ \pi (\sqrt{n}) \approx \frac{\sqrt{n}}{\log_{2}{\sqrt{n}}} $$

Też: $$ \sum_{i=1}^{x}{\frac{1}{i}} \approx \ln{x} + 0,5 \approx \log_{2}{x} $$

Czyli: $$ \sum_{i=1}^{\pi (\sqrt{n})}{\frac{1}{i}} \approx \log_{2}{\pi (\sqrt{n})} \approx \log_{2}{(\frac{\sqrt{n}}{\log_{2}{\sqrt{n}}})}$$

Stąd: $$ \text{liczba operacji} \approx n + \frac{\sqrt{n}}{\log_{2}{\sqrt{n}}} + n \log_{2}{(\frac{\sqrt{n}}{\log_{2}{\sqrt{n}}})} \approx n \log_{2}{(\frac{\sqrt{n}}{\log_{2}{\sqrt{n}}})} $$

Dobrym przybliżeniem (istotnym - maksymalny błąd to błąd kwadratowy) \(\frac{\sqrt{n}}{\log_{2}{\sqrt{n}}}\) jest \(\log_{2}{n}\), więc $$ \text{liczba operacji} \approx n \log_{2}{(\log_{2}{n})} $$

Z tego wynika, że złożoność sita Eratostenesa to \(O(n\log{(\log{n})})\).

Ta złożoność pozwala nam w ciągu doby wyznaczyć wszystkie liczby pierwsze od \(1\) do \(10^{13}\), czyli aż \(10000\) razy więcej niż przy użycia algorytmu brutalnego!

Kod w Python

Kod w C++

Liczby pierwsze od 1 do N - kalkurator

Wpisz N:

Liczby pierwsze od 1 do N:

Ile jest liczb pierwszych od 1 do n? - kalkurator

Wpisz N:

Liczba liczb pierwszych od 1 do N (\( \pi (N) \)):

N-ta liczba pierwsza - kalkurator

Wpisz N:

N-ta liczba pierwsza: