Écrivez un programme ou une fonction qui génère / renvoie les 10000 premiers nombres premiers indexés.
Si nous appelons le n e premier p(n)
, cette liste est
3, 5, 11, 17, 31, 41, 59 ... 1366661
car
p(p(1)) = p(2) = 3
p(p(2)) = p(3) = 5
p(p(3)) = p(5) = 11
p(p(4)) = p(7) = 17
...
p(p(10000)) = p(104729) = 1366661
Les failles standard sont interdites et les méthodes de sortie standard sont autorisées. Vous pouvez répondre avec un programme complet, une fonction nommée ou une fonction anonyme.
Réponses:
MATLAB / Octave, 25 octets
Cela ne devient pas beaucoup plus simple que cela.
la source
Python, 72 octets
Cela se termine par une "erreur d'index de liste hors plage" après l'impression des 10 000 numéros, ce qui est autorisé par défaut .
Utilise la méthode du théorème de Wilson pour générer une liste
l
des nombres premiers jusqu'au 10000e nombre premier. Ensuite, imprime les nombres premiers avec les positions dans la liste, décalés de 1 pour l'indexation zéro, jusqu'à ce que nous manquions de limites après le 10000e nombre premier-e premier.De manière pratique, la limite supérieure de
1366661
peut être estimée comme82e5/6
ce qui est1366666.6666666667
, en enregistrant un caractère.J'aimerais une méthode à boucle unique, en imprimant des nombres premiers indexés au fur et à mesure que nous les ajoutons, mais cela semble plus long.
la source
J, 11 octets
Sort les nombres premiers au format
Explication
la source
Mathematica,
262523 octetsFonction pure renvoyant la liste.
la source
Listable
si simplePrime@Prime@Range@1*^4&
que ça@
opérateur a une priorité plus élevée que^
lors de l'écritureRange@10^4
? C'est du Mathematica classique qui gâche votre partie de golf. Bon truc!Haskell, 65 octets
Les sorties:
[3,5,11,17,31,41,59,67,83,109,127.....<five hours later>...,1366661]
Pas très vite. Comment ça marche:
p
est la liste infinie de nombres premiers (vérifiant naïvement tous lesmod x y
s pour y dans[2..x-1]
). Prenez les premiers10000
éléments de la liste que vous obtenez lorsque0:p!!
(obtenir le nième élément dep
) est mappép
. Je dois ajuster la liste des nombres premiers d'où je prends les éléments en ajoutant un nombre (->0:
), car la fonction d'index (!!
) est basée sur zéro.la source
PARI / GP, 25 octets
la source
AWK - 129 octets
... ouais ... trop longtemps pour gagner des points pour la compacité ... mais peut-être peut-il gagner un peu d'honneur pour la vitesse?
Le
x
dossier:Fonctionnement:
Lisible:
Le programme calcule un flux de nombres premiers en utilisant une
L
«bande de nombres» contenant des nombres premiers sautantL
pour signaler les nombres voisins déjà connus pour avoir un diviseur. Ces nombres premiers sautants avancent tandis que la «bande de nombres»L
est coupée numéro par numéro depuis son début.Le fait de couper la tête de bande
L[n]
étant vide signifie qu'il n'y a pas de diviseur (principal) connu.L[n]
détenir une valeur signifie que cette valeur est un nombre premier et connu pour se divisern
.Donc, soit nous avons trouvé un diviseur premier, soit un nouveau premier. Ensuite, ce nombre sera avancé au suivant
L[n+m*p]
sur la bande trouvée vide.C'est comme le tamis d'Eratosthène "tiré à travers une bouteille de Klein". Vous agissez toujours sur le début de la bande. Au lieu de tirer des multiples de nombres premiers à travers la bande, vous utilisez les nombres premiers déjà trouvés comme curseurs sautant loin du début de la bande par plusieurs distances de leur propre valeur jusqu'à ce qu'une position libre soit trouvée.
Alors que la boucle externe génère une décomposition principale ou non principale par boucle, les nombres premiers trouvés sont comptés et stockés sous
P
forme de clé, la valeur de cette paire (clé, valeur) n'est pas pertinente pour le flux du programme.Si leur clé
i
se trouveP
déjà dans (i in P
), nous avons un premier de la race p (p (i)).Fonctionnement:
Tenez compte du fait que ce code n'utilise pas de tables principales précalculées externes.
Du temps pris sur mon bon vieux Thinkpad T60, donc je pense qu'il mérite d'être appelé rapidement.
Testé avec
mawk
etgawk
sur Debian8 / AMD64la source
CJam, 19 ans
Vous pouvez l' essayer en ligne , mais vous aurez besoin d'un peu de patience: p
Pour mémoire, le dernier numéro est 1366661.
la source
Perl, 55 octets
Utilise le module de @DanaJ
Math::Prime::Util
pour perl (chargé avec le pragmantheory
). Obtenez-le avec:la source
05AB1E, 7 octets (non concurrent)
Code:
Essayez-le en ligne! , notez que j'ai changé le
4
en a2
. Si vous avez beaucoup de temps, vous pouvez changer le2
dos4
, mais cela prendra beaucoup de temps. J'ai besoin de fixer l'algorithme pour cela.Explication:
la source