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]
на стрічці, яка виявиться порожньою.
Це схоже на сито Ератосфена, "витягнувши пляшку Клейна". Ви завжди дієте на стрічковому старті. Замість стрільби декількох праймів через стрічку, ви використовуєте прайми, які вже знайдені, як курсори, що відскакують від стрічки, починаються на декількох відстанях власного значення, поки не знайдеться вільна позиція.
У той час як зовнішній цикл генерує одне просте чи не перше рішення за цикл, знайдені прайми підраховуються та зберігаються в 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