AWK - 129 байт
... хорошо ... слишком долго, чтобы выиграть очки за компактность ... но может быть, это может получить некоторую честь за скорость?
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]
на ленте, найденной пустой.
Это похоже на Сито Эратосфена, «вытащившего бутылку Кляйна». Вы всегда действуете в начале ленты. Вместо того, чтобы запускать несколько простых чисел через ленту, вы используете уже найденные простые числа, поскольку курсоры, отскакивающие от ленты, начинают на несколько дистанций своего значения до тех пор, пока не будет найдена свободная позиция.
В то время как внешний цикл генерирует одно простое или не простое решение для цикла, найденные простые числа подсчитываются и сохраняются в 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