Strona 1 z 2

Sposób na znajdowanie liczb pierwszych

: 18 lis 2004, o 17:53
autor: widescreen
witam

wybaczcie laikowi to pytanie, ale jak najlatwiej znalezc liczby pierwsze ?
czy konieczne jest dzielenie przez kazda liczbe mniejsza wylaczajac jeden ?

Sposób na znajdowanie liczb pierwszych

: 18 lis 2004, o 18:12
autor: arigo
dla 100% sprawdzenia czy dana liczba jest pierwsza czy nie wystarczy dzielic ja przez kolejne liczby pierwsze poczynajac od 2 do pierwiastka kwadratowego ze sprawdzanej liczby.
jesli jakas liczba bedzie ja dzielic to sprawdzana liczba jest zlozona w przeciwnym wypadku jest pierwsza

Sposób na znajdowanie liczb pierwszych

: 19 lis 2004, o 20:30
autor: paulgray
ilość tych liczb możesz zmniejszyć wyrzucajac wszystkie liczby parzyste

Sposób na znajdowanie liczb pierwszych

: 19 lis 2004, o 20:41
autor: olazola
można zastosować sito Eratostenesa

Sposób na znajdowanie liczb pierwszych

: 19 lis 2004, o 20:47
autor: Zlodiej
cos podobnego było w drugim poście tzn dzielić przez kolejne liczby pierwsze tzn ... kazda ktora sie dzieli poza tą liczbą jest liczbą złożoną

Sposób na znajdowanie liczb pierwszych

: 10 gru 2005, o 18:39
autor: max
A co z jakimiś wydajniejszymi algorytmami sprawdzającymi czy liczba jest pierwsza? Proponowane sito Eratostenesa i tzw. "algorytm naiwny" gubią się już przy liczbach rzędu tysięcy. Sieć wspomina coś o algorytmie Lucasa-Lehmera, ale na czym on polega to się nie doszukałem. Czy ktoś zna jakiś _wydajny_ algorytm sprawdzający "pierwszość" liczby?
Z góry dziękuję i przepraszam za ignorancję.

Sposób na znajdowanie liczb pierwszych

: 10 gru 2005, o 21:32
autor: ymar
paulgray pisze:ilość tych liczb możesz zmniejszyć wyrzucajac wszystkie liczby parzyste
podzielne przez trzy też? i pewnie przez pięć. tak myślę.

Sposób na znajdowanie liczb pierwszych

: 10 gru 2005, o 22:13
autor: Fibik
sito dobrze działa.
doszedłem prawie do tryliona w kilka minut - ale bez sita.
dalej nie mogłem - rejestry za krótkie...

Sposób na znajdowanie liczb pierwszych

: 10 gru 2005, o 23:03
autor: max
Heh, szybkość to pojęcie względne - żeby tak uściślić, to mam napisać program który w 2 s. znajdzie najwyżej 15000 w kolejności liczbę pierwszą(163841) - tego sitem zrobić nie potrafię...
Dlatego pytam o wydajniejsze algorytmy.

EDIT: Znalazłem:), nie do końca rozumiem, ale znalazłem =]
- jakby ktoś miał ten sam problem.

Sposób na znajdowanie liczb pierwszych

: 11 gru 2005, o 13:25
autor: arigo
kiedys napykalem prosty kodzik w C o osiagach co w niewiele ponad 1 sec przeszukuje wszystkie liczby pierwsze od 1 do 1mln i zapisuje na dysk. dziala on metoda ta ktora opisywalem na poczatku lecz po paru optymalizacjach

Kod: Zaznacz cały

arigo@packard /tmp $ time ./pierw3 > pierw

real    0m1.197s
user    0m1.161s
sys     0m0.003s

arigo@packard /tmp $ tail -n 3 pierw
999961
999979
999983

arigo@packard /tmp $ cat /proc/cpuinfo 
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 9
model name      : Intel(R) Celeron(R) M processor         1300MHz
stepping        : 5
cpu MHz         : 1300.432
cache size      : 512 KB
fdiv_bug        : no
hlt_bug         : no
f00f_bug        : no
coma_bug        : no
fpu             : yes
fpu_exception   : yes
cpuid level     : 2
wp              : yes
flags           : fpu vme de pse tsc msr mce cx8 sep mtrr pge mca cmov pat clflu                                                                sh dts acpi mmx fxsr sse sse2 tm pbe
bogomips        : 2580.48

Sposób na znajdowanie liczb pierwszych

: 11 gru 2005, o 13:52
autor: juzef
max, strona którą znalazłeś jest trochę nieaktualna, gdyż znany jest deterministyczny algorytm rozstrzygający czy liczba jest pierwsza działający w czasie wielomianowym.

Co do znalezienia 15000 liczby w kolejności chyba najszybsze będzie sito Eratostenesa.

Kod: Zaznacz cały

#include <stdio.h>
#include <math.h>
#define MAX 200000
#define TRUE 1

char pierwsze[MAX+1];
int i,k;

int main(){
for (i = 1; i <=  MAX ;i++) pierwsze[i] = TRUE;    
for (i = 2; i <= sqrt(MAX) ; i++) if (pierwsze[i]) 
    {
    for (k= i*2 ; k<=MAX ; k+=i) pierwsze[k] = 0;
    };
k=0;
for (i=2;i<=MAX;i++) 
    {
    if (pierwsze[i]) {
    k++;
    if (k==15000) {printf("%d
",i);return 0;}
    }
    }
return 0;
}

Sposób na znajdowanie liczb pierwszych

: 12 gru 2005, o 17:06
autor: arigo
ten kod mozna jeszcze porzadnie zoptymalizowac bez zbednego wglebiania sie w kod

Sposób na znajdowanie liczb pierwszych

: 12 gru 2005, o 19:26
autor: max
Jak dla mnie kod jest ok...
Btw. - ciekawość - ludzka rzecz : jak wygląda ten nowy algorytm?

Sposób na znajdowanie liczb pierwszych

: 15 gru 2005, o 18:10
autor: Undre
... umbers.htm

to był mój pierwszy wynik w Googlach ... a jest ich wieeeeele więcej

Sposób na znajdowanie liczb pierwszych

: 16 gru 2005, o 19:08
autor: max
Ok. Dzięki wszystkim za pomoc - jednak sito jest rzeczywiście wydajne pod względem czasowym, tylko pamięciowo ten algorytm leży... ale mój problem jeszcze spokojnie rozwiązuje :]