AWK-129字节
... oookay ...为紧凑而赢得积分的时间太长了...但是也许它可以因为速度而获得一些荣誉?
该x
文件中:
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++}}
运行:
$ 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
可读性:
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++
}
}
该程序使用L
“数字带” 计算素数流,保持发现的素数不断跳L
来标记附近已知有除数的数。这些跳跃的素数将继续前进,而“数字带” L
将从一开始就被数字切掉。
切掉L[n]
空的磁带头意味着没有已知的(质数)除数。
L[n]
持有一个值意味着,这个值是质数,并且已知可以除n
。
因此,我们找到了素数除数或新质数。然后,素数将前进到L[n+m*p]
发现空的磁带上的下一个。
就像是Eratosthenes筛子“通过Klein的瓶子拉过”一样。您总是对磁带开始起作用。您无需使用遍历磁带的多个素数,而可以使用已经发现的素数,因为从磁带上跳下来的光标会以其自身值的多个距离开始,直到找到一个自由位置。
虽然外部循环在每个循环中生成一个素数决定或不素数决定,但是找到的素数被计数并存储P
为键,但此(键,值)对的值与程序流无关。
如果它们的键i
刚好在P
(i in P
)中,则我们具有p(p(i))素数。
运行:
$ time awk -f x.awk | wc -l
10000
real 0m3.675s
user 0m3.612s
sys 0m0.052s
请注意,此代码不使用外部预先计算的素数表。
我的旧ThinkPad T60需要花费时间,因此我认为它应该被称为快速。
经测试mawk
,并gawk
在Debian8 / AMD64