Przeskocz do treści

Delta mi!

Jak szybko działa sito?

Jakub Radoszewski

o artykule ...

  • Publikacja w Delcie: kwiecień 2012
  • Publikacja elektroniczna: 01-04-2012
  • Wersja do druku [application/pdf]: (322 KB)

Jedną z najlepiej znanych metod wyznaczania liczb pierwszych jest sito Eratostenesa. Opiera się ona na spostrzeżeniu, w zasadzie oczywistym, że jak wyrzucimy wszystkie liczby złożone, to zostaną same liczby pierwsze...

obrazek

Jeśli chcemy wyznaczyć wszystkie liczby pierwsze nieprzekraczające math wypisujemy na kartce liczby naturalne od 1 do math wykreślamy 1, bo nie jest pierwsza, zostawiamy 2 i wykreślamy wszystkie jej wielokrotności, potem zostawiamy 3 i wykreślamy wszystkie jej wielokrotności (niektóre, np. 6, już zostały wykreślone) i tak dalej. W kolejnym kroku pozostawiamy pierwszą niewykreśloną liczbę i wykreślamy jej wielokrotności. Liczby, które nie zostaną wykreślone, to wszystkie liczby pierwsze nie większe od math

W tym artykule zastanowimy się nad tym, jak szybkie jest sito Eratostenesa. Najczęstszą operacją wykonywaną w tym algorytmie jest wykreślanie.

Za pomocą każdej liczby pierwszej wykreślimy, rzecz jasna, co najwyżej math liczb złożonych, wobec czego wykonamy łącznie co najwyżej math  operacji.

Zauważmy, że możemy zakończyć wykreślanie, gdy rozpatrzymy liczby pierwsze od 2 do math Faktycznie: każda liczba złożona z zakresu od 4 do math musi mieć jakiś dzielnik pierwszy nie większy niż math W ten sposób otrzymujemy wariant algorytmu sita działający w czasie math

Okazuje się, że możemy uzyskać jeszcze lepsze oszacowanie złożoności czasowej. W tym celu w ogóle nie musimy zmieniać zasady działania algorytmu – wystarczy bardziej precyzyjnie oszacować liczbę wykreśleń. Oznaczmy przez math kolejne liczby pierwsze nieprzekraczające math Wówczas łączna liczba wykreśleń to co najwyżej

display-math(*)

Tę sumę możemy oszacować z góry przez

display-math

obrazek

Czytelnik Wytrawny dostrzeże w powyższej sumie math-tą liczbę harmoniczną math  i od razu stwierdzi, że przecież math  Można to także sprawdzić, jeśli narysuje się math prostokątów o szerokości 1 i wysokościach kolejno math  math  math itd., a także wykresy funkcji math i math (rysunek ). Wówczas suma pól prostokątów – równa co do wartości liczbie math  – jest nie mniejsza niż pole pod wykresem funkcji math dla math a zatem:

display-math

Podobnie, math  możemy oszacować z góry przez math plus pole pod wykresem math dla math czyli:

display-math

W ten sposób wykazaliśmy, że złożoność sita Eratostenesa to math  Co ciekawe, można otrzymać jeszcze lepsze oszacowanie, jeśli tylko dokładniej przyjrzeć się sumie math i wykorzystać pewien znany fakt z teorii liczb.

Oznaczmy przez math liczbę liczb pierwszych nieprzekraczających liczby math Kluczowy fakt to: math asymptotycznie zachowuje się tak, jak math Nie będziemy tego faktu dowodzić. Korzystając z niego, wnioskujemy, że math-ta liczba pierwsza, math średnio jest rzędu math To pozwala nam zapisać sumę math w postaci równoważnej asymptotycznie sumy:

display-math

Podobnie jak poprzednio, math-tą część tej sumy możemy asymptotycznie przybliżać całką:

display-math

a tę z kolei oszacować z góry przez całkę z prostszym ograniczeniem górnym:

display-math

Ostatnią z powyższych całek wyznaczamy przez podstawienie math  math:

display-math

W ten sposób otrzymaliśmy asymptotyczne oszacowanie sumy math przez funkcję math co pozwala stwierdzić, że złożoność sita Eratostenesa to math

Czytelnik nielubiący manipulować takimi całkami może otrzymać podobnie dobre oszacowania, jeśli tylko spojrzy na algorytm sita z nieco innej strony. Otóż każda liczba złożona między math a math zostanie wykreślona tyle razy, ile ma różnych czynników pierwszych w rozkładzie. Dla liczby całkowitej dodatniej math oznaczmy przez math  liczbę różnych dzielników pierwszych liczby math

Łatwo wykazać, że zawsze math  Faktycznie, jeśli math przy czym wszystkie liczby math są pierwsze, to math skąd math więc tym bardziej math  W ten sposób łatwo uzasadniliśmy, że łączna liczba wykreśleń jest rzędu math  Niestety, tą metodą trudniej jest dojść do lepszego z wcześniejszych oszacowań, tj. math

Metodę sita możemy jeszcze trochę usprawnić. Zauważmy, że za pomocą danej liczby pierwszej math nie większej od math wystarczy wykreślać liczby złożone począwszy od math gdyż wszystkie wcześniejsze wielokrotności math musiały zostać wykreślone wcześniej. Taka poprawka nie zmienia jednak złożoności czasowej algorytmu.

Na koniec warto wspomnieć, że w algorytmie sita Eratostenesa cały zakres liczb od math do math możemy podzielić na kawałki długości math i wykreślać liczby złożone tylko w takich kawałkach. To pozwala nam zredukować rozmiar tablicy używanej do wykreślania do wartości rzędu math  co ma niebagatelne znaczenie tak teoretyczne, jak i praktyczne. Więcej na ten temat można znaleźć w artykule Tomasza Idziaszka ,,Kolejność ma znaczenie"Delty 9/2011.