AWK - 129 Bytes
... oookay ... zu lang, um Punkte für Kompaktheit zu gewinnen ... aber vielleicht kann es etwas Ehre für die Geschwindigkeit gewinnen?
Die xDatei:
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++}}
Laufen:
$ 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
Lesbar:
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++
}
}
Das Programm berechnet einen Strom von Primzahlen, indem es Lals "Zahlenband" gefundene Primzahlen verwendet, die herumspringen, um Ldie nahegelegenen Zahlen zu kennzeichnen, von denen bereits bekannt ist, dass sie einen Divisor haben. Diese springenden Primzahlen rücken vor, während das "Zahlenband" Lvon Anfang an Nummer für Nummer abgeschnitten wird.
Wenn der Bandkopf L[n]leer ist, ist kein (Haupt-) Teiler bekannt.
L[n]Halten eines Wertes bedeutet, dass dieser Wert eine Primzahl ist und bekanntermaßen dividiert n.
Also haben wir entweder einen Primteiler oder einen neuen Prim gefunden. Dann wird diese Primzahl L[n+m*p]auf dem Band, das als leer befunden wurde, auf die nächste vorgerückt .
Dies ist wie das Sieb des Eratosthenes "durch eine Kleinsche Flasche gezogen". Sie handeln immer am Bandanfang. Anstatt mehrere Primzahlen durch das Band zu schießen, verwenden Sie die bereits gefundenen Primzahlen als Cursor, die um mehrere Abstände ihres eigenen Werts vom Band wegspringen, bis eine freie Position gefunden wird.
Während die äußere Schleife eine Primzahl oder keine Primzahl pro Schleife erzeugt, werden die gefundenen Primzahlen gezählt und Pals Schlüssel gespeichert . Der Wert dieses Paars (Schlüssel, Wert) ist für den Programmablauf nicht relevant.
Wenn ihr Schlüssel izu sein in geschieht Pbereits ( i in P), haben wir eine erstklassige der p (p (i)) zu züchten.
Laufen:
$ time awk -f x.awk | wc -l
10000
real 0m3.675s
user 0m3.612s
sys 0m0.052s
Beachten Sie, dass dieser Code keine externen vorberechneten Primetabellen verwendet.
Die Zeit, die auf meinem guten alten Thinkpad T60 vergangen ist, ist meines Erachtens verdient, schnell genannt zu werden.
Getestet mit mawkund gawkauf Debian8 / AMD64