AWK - 129 bytes
... bueno ... demasiado tiempo para ganar puntos por compacidad ... pero ¿tal vez pueda ganar algo de honor por la velocidad?
El x
archivo:
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++}}
Corriendo:
$ 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
Legible:
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++
}
}
El programa calcula una secuencia de números primos utilizando L
como "cinta de números" que contiene números primos encontrados saltando L
para marcar los números cercanos que ya se sabe que tienen un divisor. Estos números primos saltantes avanzarán mientras la "cinta de números" L
se corta número por número desde su comienzo.
Si se corta el cabezal de la cinta al L[n]
estar vacío, no hay divisor (primario) conocido.
L[n]
mantener un valor significa que este valor es primo y se sabe que divide n
.
Entonces, hemos encontrado un divisor primo o un nuevo primo. Luego, este primer avance se avanzará al siguiente L[n+m*p]
en la cinta que se encuentre vacía.
Esto es como el Tamiz de Eratóstenes "tirado a través de una botella de Klein". Siempre actúas en el inicio de la cinta. En lugar de disparar múltiplos de primos a través de la cinta, usted usa los primos que ya se encuentran como cursores que saltan del inicio de la cinta por múltiples distancias de su propio valor hasta que se encuentra una posición libre.
Si bien el ciclo externo genera una decisión principal o no primaria por ciclo, los números primos encontrados se cuentan y almacenan P
como clave, el valor de este par (clave, valor) no es relevante para el flujo del programa.
Si su clave ya i
está en P
( i in P
), tenemos un primo de la raza p (p (i)).
Corriendo:
$ time awk -f x.awk | wc -l
10000
real 0m3.675s
user 0m3.612s
sys 0m0.052s
Tenga en cuenta que este código no utiliza tablas primas precalculadas externas.
Tiempo empleado en mi viejo Thinkpad T60, así que creo que merece ser llamado rápido.
Probado con mawk
y gawk
en Debian8 / AMD64