AWK - 129 bayt
... oookay ... kompaktlık için puan kazanmak için çok uzun ... ama belki de hız için biraz şeref kazanabilir?
x
dosya:
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++}}
Koşu:
$ 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
Okunabilir:
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 , zaten bir bölen olduğu bilinen yakındaki sayıları işaretlemek için L
etrafında atlama bulundu primler tutarak "sayılar teyp" olarak kullanarak bir prim akışı hesaplar L
. "Atlama sayıları" L
başlangıcından itibaren sayı olarak kesilirken bu atlama primleri ilerleyecektir .
Bant kafasını L[n]
boş bırakarak, bilinen (asal) bölen olmadığı anlamına gelir.
L[n]
bir değeri tutmak, bu değerin asal olduğu ve bölündüğü bilinmektedir n
.
Yani ya bir baş bölen ya da yeni bir başbakan bulduk. Daha sonra bu prime L[n+m*p]
boş bulunan kasette bir sonrakine ilerleyecektir .
Bu, Eratosthenes'in Eleği "Klein'in şişesinden çekilmiş" gibidir. Her zaman kaset başlangıcında hareket edersiniz. Banttan çok sayıda prim atmak yerine, zaten bulunan imleçlerin, banttan uzağa sıçrayan imleçler, boş bir konum bulunana kadar kendi değerlerinin birden çok mesafesinden başlayarak kullanırsınız.
Dış döngü, döngü başına bir ana veya bir birincil karar oluştururken, bulunan primerler P
anahtar olarak sayılır ve saklanır , ancak bu (anahtar, değer) çiftinin değeri program akışı ile ilgili değildir.
Onların anahtar ise i
de olur P
(zaten i in P
), biz p (p (i)) cins bir asal var.
Koşu:
$ time awk -f x.awk | wc -l
10000
real 0m3.675s
user 0m3.612s
sys 0m0.052s
Bu kodun harici önceden hesaplanmış ana tabloları kullanmadığını dikkate alın.
Eski iyi Thinkpad T60'ımda geçen zaman, bu yüzden hızlı çağrılmayı hak ettiğini düşünüyorum.
Debian8 / AMD64 ile mawk
ve gawk
üzerinde test edilmiştir