GolfScript, 22/20 (20/19) bytes
n(6?,:|2>{(.p|%-.}do:n
A costa de la velocidad, el código puede hacerse dos bytes más corto:
n(6?,:|2>.{|%2>-}/n*
Si no se tiene en cuenta el formato de salida especificado en la pregunta editada (que es lo que hacen muchas de las respuestas existentes), se pueden guardar dos bytes en la versión rápida y uno en la lenta:
n(6?,:|2>{(.p|%-.}do
n(6?,:|2>.{|%2>-}/`
Esto imprimirá un LF adicional después de los números primos para la versión rápida, e imprimirá los números primos como una matriz para la versión lenta.
Cómo funciona
Ambas versiones son implementaciones del tamiz de Eratóstenes .
La versión rápida hace lo siguiente:
Establecer A = [ 2 3 4 … 999,999 ]
y | = [ 0 1 2 … 999,999 ]
.
Establecer N = A[0]
e imprimir N
.
Recoge todos los elementos N-ésimo de |
adentro C
. Estos son los múltiplos de N
.
Conjunto A = A - C
.
Si A
no está vacío, regrese a 2.
n(6? # Push "\n".pop() ** 6 = 1,000,000.
,:| # Push | = [ 0 1 2 … 999,999 ].
,2> # Push A = [ 2 3 4 … 999,999 ].
{ #
( # Unshift the first element (“N”) of “A”.
.p # Print “N”.
|% # Collect every N-th element from “A” into a new array, starting with the first.
- # Take the set difference of “A” and the array from above.
. # Duplicate the set difference.
}do # If the set difference is non-empty, repeat.
:n # Store the empty string in “n”, so no final LF will get printed.
La versión lenta funciona de manera similar, pero en lugar de eliminar sucesivamente múltiplos del mínimo de "A" (que siempre es primo), elimina los múltiplos de todos los enteros positivos por debajo de 1,000,000.
Competitividad
En ausencia de funciones matemáticas integradas para factorizar o verificar la primalidad, todas las soluciones de GolfScript serán muy grandes o muy ineficientes.
Si bien aún estoy lejos de ser eficiente, creo que he logrado una relación de velocidad a tamaño decente. En el momento de su presentación, este enfoque parece ser el más corto de los que no utilizan ninguno de los elementos incorporados anteriormente mencionados. Digo parece porque no tengo idea de cómo funcionan algunas de las respuestas ...
He comparado las cuatro soluciones de GolfScript presentadas: w0lf (división de prueba), mi otra respuesta (teorema de Wilson) y las dos de esta respuesta. Estos fueron los resultados:
Bound | Trial division | Sieve (slow) | Wilson's theorem | Sieve (fast)
----------+--------------------+--------------------+------------------+----------------
1,000 | 2.47 s | 0.06 s | 0.03 s | 0.03 s
10,000 | 246.06 s (4.1 m) | 1.49 s | 0.38 s | 0.14 s
20,000 | 1006.83 s (16.8 m) | 5.22 s | 1.41 s | 0.38 s
100,000 | ~ 7 h (estimated) | 104.65 (1.7 m) | 35.20 s | 5.82 s
1,000,000 | ~ 29 d (estimated) | 111136.97s (3.1 h) | 3695.92 s (1 h) | 418.24 s (7 m)