GolfScript, 22/20 (20/19) octets
n(6?,:|2>{(.p|%-.}do:n
Au prix de la vitesse, le code peut être raccourci de deux octets:
n(6?,:|2>.{|%2>-}/n*
Si le format de sortie spécifié dans la question modifiée n'est pas pris en compte (ce que font beaucoup de réponses existantes), deux octets peuvent être enregistrés dans la version rapide et un dans la version lente:
n(6?,:|2>{(.p|%-.}do
n(6?,:|2>.{|%2>-}/`
Cela imprimera un LF supplémentaire après les nombres premiers pour la version rapide et les nombres premiers comme un tableau pour la version lente.
Comment ça fonctionne
Les deux versions sont des implémentations du tamis d'Eratosthène .
La version rapide fait ce qui suit:
Définir A = [ 2 3 4 … 999,999 ]
et | = [ 0 1 2 … 999,999 ]
.
Définir N = A[0]
et imprimer N
.
Recueillir tous les N-ième élément de |
dans C
. Ce sont les multiples de N
.
Ensemble A = A - C
.
Si A
non vide, retournez à 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 version lente fonctionne de la même manière, mais au lieu de supprimer successivement les multiples du minimum de «A» (toujours premier), elle supprime les multiples de tous les entiers positifs inférieurs à 1 000 000.
Compétitivité
En l'absence de fonctions mathématiques intégrées permettant de factoriser ou de vérifier la primalité, toutes les solutions GolfScript seront très volumineuses ou très inefficaces.
Bien que loin d'être efficace, je pense avoir atteint un rapport vitesse / taille décent. Au moment de sa présentation, cette approche semble être la plus courte parmi celles qui n’utilisent aucun des éléments incorporés susmentionnés. Je dis semble parce que je ne sais pas du tout comment certaines des réponses fonctionnent ...
J'ai comparé les quatre solutions GolfScript présentées: w0lf (division d'essai), mon autre réponse (théorème de Wilson) et les deux de cette réponse. Ce sont les résultats:
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)