[c++] Liczby pierwsze

0

Witam!
Piszę program, w którym muszę wyznaczyć liczby pierwsze z zakresu od x do y. Nie sprawiłoby mi to żadnej trudności, tylko że standardowe sito Eratostenesa potrzebuje tablicy booli, w której zaznacza się czy dana liczba jest pierwsza czy nie. Niestety, mój przedział to wartości od 1 do 10^18 - tak dużej tablicy nie sposób zrobić.

Czy może mi ktoś zatem podsunąć pomysł, jak stwierdzić, które liczby w zadnym przedziale są pierwsze? Branie każdej liczby i sprawdzanie, czy nie jest pierwsza jest zbyt wolne.

zacier

0

może sito Atkina?? ale nie dałbym sobie ręki uciąć..

0

Ale np. takie sito Atkina też wymaga tej tablicy, dałem mu do znalezienia liczby pierwsze od 1 do 1 000 000 000 to się wywala ;s

0

Klasycznie rzecz biorąc, to mógłbyś... Na przykład, obliczyć sobie liczby pierwsze Eratostenesem do sqrt(max), potem od sqrt(max) liczyć ręcznie, sprawdzając czy każda z kolei nieparzysta liczba i (poza podzielnymi przez 5) aż do max jest podzielna przez liczby pierwsze mniejsze lub równe sqrt(i).

Ale... O ile ta pierwsza część potrwa dość krótko, to ta druga będzie się nieźle ciągnęła. ;)
U mnie Eratostenes dla 100 000 000 (samo zrobienie sita, bez żadnego io) trwa ok. 1.27s, ale powyższa metoda jest już dużo, dużo wolniejsza, ok 100x używając w sicie wektora bool, a w drugiej fazie wektora unsigned long long (w pewnym momencie używa się wiec całkiem sporo pamięci...) - mała modyfikacja i robi się 3x wolniejsze od poprzedniej (używając tylko wektora bool) - ale przynajmniej ciągle to samo zużycie pamięci. ;)

Tak czy owak sprawdzenie do 10^18 bez zapisu potrwa... Długo.
Całość Eratostenesem:

$ ./bigprimes.exe 1000000000 -erato-pure
Took: 15.718s

i około 130mb zajętej pamięci. Pamięciowo się więc wyrobisz, ale czas... Fiu fiu. Z zapisem do pliku to już w ogóle. ;)

[quote]Branie każdej liczby i sprawdzanie, czy nie jest pierwsza jest zbyt wolne.[/quote]Przy małych przedziałach sporych liczbach to ta metoda może nie być zła, ale... może szybciej będzie jednak sprawdzać czy nie są pierwszymi. Pewnie zależy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1