AWK - 129 bytes
... ok ... tempo demais para ganhar pontos por compacidade ... mas talvez consiga ganhar alguma honra pela velocidade?
O x
arquivo:
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++}}
Corrida:
$ 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
Legível:
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++
}
}
O programa calcula um fluxo de números primos usando L
como "fita de números" segurando números primos pulando L
para sinalizar os números próximos já conhecidos por terem um divisor. Esses primos de salto avançam enquanto a "fita de números" L
é cortada número por número desde o início.
Ao cortar a cabeça da fita L[n]
vazia, não há um divisor (principal) conhecido.
L[n]
manter um valor significa que esse valor é primo e conhecido por dividir n
.
Então, encontramos um divisor primo ou um novo primo. O ths prime será avançado para o próximo L[n+m*p]
na fita que estiver vazia.
É como a peneira de Eratóstenes "puxada pela garrafa de Klein". Você sempre age no início da fita. Em vez de disparar múltiplos primos pela fita, use os primos já encontrados como cursores que saltam para longe da fita iniciando por várias distâncias de seu próprio valor até encontrar uma posição livre.
Enquanto o loop externo gera uma decisão de prime ou não de prime por loop, os primos encontrados são contados e armazenados P
como chave, o valor desse par (chave, valor) não é relevante para o fluxo do programa.
Se a chave deles já estiver i
em P
( i in P
), temos um primo da raça p (p (i)).
Corrida:
$ time awk -f x.awk | wc -l
10000
real 0m3.675s
user 0m3.612s
sys 0m0.052s
Leve em consideração que esse código não usa tabelas primárias pré-calculadas externas.
Tempo gasto no meu bom e velho Thinkpad T60, então acho que ele merece ser chamado rapidamente.
Testado com mawk
e gawk
no Debian8 / AMD64