Sposób na znajdowanie liczb pierwszych
-
widescreen
Sposób na znajdowanie liczb pierwszych
witam
wybaczcie laikowi to pytanie, ale jak najlatwiej znalezc liczby pierwsze ?
czy konieczne jest dzielenie przez kazda liczbe mniejsza wylaczajac jeden ?
wybaczcie laikowi to pytanie, ale jak najlatwiej znalezc liczby pierwsze ?
czy konieczne jest dzielenie przez kazda liczbe mniejsza wylaczajac jeden ?
-
arigo
- Użytkownik

- Posty: 813
- Rejestracja: 23 paź 2004, o 10:17
- Płeć: Mężczyzna
- Lokalizacja: Lublin
- Pomógł: 28 razy
Sposób na znajdowanie liczb pierwszych
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
jesli jakas liczba bedzie ja dzielic to sprawdzana liczba jest zlozona w przeciwnym wypadku jest pierwsza
- Zlodiej
- Użytkownik

- Posty: 1627
- Rejestracja: 28 cze 2004, o 12:24
- Płeć: Mężczyzna
- Lokalizacja: Kraków
- Podziękował: 2 razy
- Pomógł: 108 razy
Sposób na znajdowanie liczb pierwszych
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ą
- max
- Użytkownik

- Posty: 3242
- Rejestracja: 10 gru 2005, o 17:48
- Płeć: Mężczyzna
- Lokalizacja: Lebendigentanz
- Podziękował: 37 razy
- Pomógł: 778 razy
Sposób na znajdowanie liczb pierwszych
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ę.
Z góry dziękuję i przepraszam za ignorancję.
- ymar
- Użytkownik

- Posty: 390
- Rejestracja: 13 sie 2005, o 14:52
- Płeć: Mężczyzna
- Podziękował: 21 razy
- Pomógł: 24 razy
Sposób na znajdowanie liczb pierwszych
podzielne przez trzy też? i pewnie przez pięć. tak myślę.paulgray pisze:ilość tych liczb możesz zmniejszyć wyrzucajac wszystkie liczby parzyste
-
Fibik
- Użytkownik

- Posty: 980
- Rejestracja: 27 wrz 2005, o 22:56
- Płeć: Mężczyzna
- Lokalizacja: Wrocław
- Podziękował: 12 razy
- Pomógł: 75 razy
Sposób na znajdowanie liczb pierwszych
sito dobrze działa.
doszedłem prawie do tryliona w kilka minut - ale bez sita.
dalej nie mogłem - rejestry za krótkie...
doszedłem prawie do tryliona w kilka minut - ale bez sita.
dalej nie mogłem - rejestry za krótkie...
- max
- Użytkownik

- Posty: 3242
- Rejestracja: 10 gru 2005, o 17:48
- Płeć: Mężczyzna
- Lokalizacja: Lebendigentanz
- Podziękował: 37 razy
- Pomógł: 778 razy
Sposób na znajdowanie liczb pierwszych
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.
Dlatego pytam o wydajniejsze algorytmy.
EDIT: Znalazłem:), nie do końca rozumiem, ale znalazłem =]
- jakby ktoś miał ten sam problem.
-
arigo
- Użytkownik

- Posty: 813
- Rejestracja: 23 paź 2004, o 10:17
- Płeć: Mężczyzna
- Lokalizacja: Lublin
- Pomógł: 28 razy
Sposób na znajdowanie liczb pierwszych
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
- juzef
- Użytkownik

- Posty: 876
- Rejestracja: 29 cze 2005, o 22:42
- Płeć: Mężczyzna
- Lokalizacja: Koszalin
- Pomógł: 66 razy
Sposób na znajdowanie liczb pierwszych
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.
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;
}-
arigo
- Użytkownik

- Posty: 813
- Rejestracja: 23 paź 2004, o 10:17
- Płeć: Mężczyzna
- Lokalizacja: Lublin
- Pomógł: 28 razy
Sposób na znajdowanie liczb pierwszych
ten kod mozna jeszcze porzadnie zoptymalizowac bez zbednego wglebiania sie w kod
- max
- Użytkownik

- Posty: 3242
- Rejestracja: 10 gru 2005, o 17:48
- Płeć: Mężczyzna
- Lokalizacja: Lebendigentanz
- Podziękował: 37 razy
- Pomógł: 778 razy
Sposób na znajdowanie liczb pierwszych
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 :]

