AWK - 129 bajtów
... okay ... zbyt długo, aby zdobyć punkty za zwartość ... ale może może zyskać trochę honoru za szybkość?
xPliku:
BEGIN{n=2;i=0;while(n<1366662){if(n in L){p=L[n];del L[n]}else{P[p=n]=++i;if(i in P)print n}j=n+p;while(j in L)j=j+p;L[j]=p;n++}}
Bieganie:
$ awk -f x | nl | tail
9991 1365913
9992 1365983
9993 1366019
9994 1366187
9995 1366327
9996 1366433
9997 1366483
9998 1366531
9999 1366609
10000 1366661
Czytelny:
BEGIN {
n=2
i=0
while( n<1366662 ) {
if( n in L ) {
p=L[n]
del L[n]
} else {
P[p=n]=++i
if( i in P ) print n
}
j=n+p
while( j in L ) j=j+p
L[j]=p
n++
}
}
Program oblicza strumień liczb pierwszych, używając Ljako „taśmy liczb” przytrzymującej znalezione liczby pierwsze skaczące dookoła, Laby oznaczyć pobliskie liczby, o których już wiadomo, że mają dzielnik. Te skaczące liczby pierwsze będą się przesuwać, podczas gdy „taśma liczb” Lbędzie od początku odcinana numer po numerze.
Odcięcie L[n]pustej głowicy oznacza, że nie ma znanego (podstawowego) dzielnika.
L[n]trzymanie wartości oznacza, że ta wartość jest liczbą pierwszą i wiadomo, że dzieli n.
Więc albo znaleźliśmy główny dzielnik, albo nowy pierwszy. Wtedy pierwsza liczba zostanie przesunięta do następnej L[n+m*p]na taśmie, która jest pusta.
To jest jak sito Eratostenesa „wyciągnięte przez butelkę Kleina”. Zawsze działasz na początku taśmy. Zamiast strzelać wielokrotnością liczb pierwszych przez taśmę, używamy liczb pierwszych już znajdujących się, ponieważ kursory odskakują od taśmy zaczynając od wielu odległości o własnej wartości, aż do znalezienia wolnej pozycji.
Podczas gdy zewnętrzna pętla generuje jedną pierwszą lub nie pierwszą decymcję na pętlę, znalezione liczby pierwsze są liczone i zapisywane Pjako klucz, wartość tej pary (klucz, wartość) nie ma znaczenia dla przebiegu programu.
Jeśli izdarzy się, że ich klucz jest Pjuż w ( i in P), mamy liczbę pierwszą rasy p (p (i)).
Bieganie:
$ time awk -f x.awk | wc -l
10000
real 0m3.675s
user 0m3.612s
sys 0m0.052s
Weź pod uwagę, że ten kod nie korzysta z zewnętrznych wstępnie obliczonych tabel głównych.
Czas poświęcony mojemu staremu dobremu Thinkpadowi T60, więc myślę, że zasługuje na to, aby nazwać go szybko.
Testowane mawki gawkna Debian8 / AMD64