Intro:
Vous avez accidentellement corrompu l'écoulement du temps avec un appareil que vous avez conçu pour le plaisir, qui s'est avéré être une machine à voyager dans le temps. En conséquence, vous avez été poussé vers un avenir lointain. Vous vous êtes rendu compte que l'informatique, la puissance de traitement et les ordinateurs en général ont évolué énormément, infiniment pour être précis . Vous vous prenez donc un ordinateur avec une mémoire et une puissance de traitement infinies. Vous ne savez pas comment il peut avoir une mémoire infinie et une puissance de traitement infinie, mais vous l'acceptez et revenez au présent.
Défi:
Vous avez entendu dire que la personne qui a découvert le plus gros prime actuellement 2^74,207,281 − 1
payé 100 000 $. Vous décidez de créer un programme qui trouve le premier prime, car vous voulez récupérer l'argent que vous avez dépensé pour l'ordinateur. Vous en créez un qui prend l'entrée d'un nombre et trouve le nombre premier suivant, soit par bruteforcing, soit par toute autre méthode.
Clarifications:
Vous avez une machine hypothétique avec une mémoire et une puissance de traitement infinies. Votre programme NE DOIT PAS être limité (par exemple: les int de C # peuvent stocker de -2,147,483,648
à 2,147,483,647
), et bien votre programme doit être capable de stocker et de fonctionner avec n'importe quel nombre de n'importe quelle taille. Vous avez des ressources infinies, donc vous ne devriez pas vous soucier de manquer de mémoire si vous le permettez.
Exemple d'E / S:
Entrée: le plus grand nombre découvert actuellement avec 22 338 618 chiffres.
Sortie: exactement le premier prime
De toute évidence, vous n'avez pas à prouver que cela fonctionne, car cela prendrait une tonne de temps à calculer dans une machine physique. Mais si vous avez déplacé votre programme vers une machine hypothétique avec une puissance de traitement / mémoire infinie, il devrait calculer instantanément.
Trouver le premier nombre premier et vérifier si un nombre est un nombre premier sont deux choses complètement différentes
Réponses:
Mathematica, 9 octets
la source
Python 3 , 45 octets
Essayez-le en ligne!
la source
k
est égal au résultat final,m
contient(k-1)!^2
. Depuis (k-1)! = -1 le mod k ne tient que lorsque k est premier, nous avons (k-1)! (K-1)! = 1 mod k, qui, multiplié par k, sera k lui-même. Vous calculez le carré pour vous débarrasser de la seule exception de (k-1)! = 0 mod k pour le composite k, ce qui se produit pour k = 4. Correct?RecursionError: maximum recursion depth exceeded in comparison
pourf(1000)
RecursionError
.Python 2,
78777674 octets-1 octet grâce à @KritixiLithos
-1 octet grâce à @FlipTack
-2 octets grâce à @ElPedro
la source
n%i<1
est plus court quen%i==0
if
.<1
n+=1
etif
dans les onglets et enregistrer 2 octetsGelée , 2 octets
Essayez-le en ligne!
Cela prend implicitement l'entrée z et, selon le manuel, génère le plus proche premier strictement supérieur à z.
la source
Oasis , 2 octets
Courez avec le
-n
drapeau.Code:
Essayez-le en ligne!
la source
Bash + coreutils, 52 octets
Essayez-le en ligne!
La documentation de bash et factor ne spécifie pas une valeur entière maximale qu'ils peuvent gérer (bien que, dans la pratique, chaque implémentation ait une valeur entière maximale). Vraisemblablement, dans le GNU du futur sur vos machines infiniment grandes, bash et factor auront des entiers de taille illimitée.
la source
Maxima, 10 octets
Une fonction renvoie le plus petit nombre premier plus grand que son argument.
la source
Brachylog , 2 octets
Essayez-le en ligne!
Explication
la source
Python avec sympy, 28 octets
sympy.nextprime
est une fonction qui fait ce qu'elle dit sur l'étain. Fonctionne pour tous les flotteurs.repl.it
Python,
6659 octets-4 octets grâce à Lynn (utilisation
-~
)-3 octets grâce à FlipTack (utilisation
and
etor
, permettant...==1
de passer à une...-1
condition.)repl.it
Une fonction récursive qui compte jusqu'à
n
ce qu'un nombre premier soit trouvé en testant qu'un seul nombre existe jusqu'àn-1
celui qui le divise (c'est-à-dire 1). Fonctionne pour tous les entiers, déclenche une erreur pour les flottants.Fonctionne sur 2.7.8 et 3.5.2, ne fonctionne pas sur 3.3.3 (erreur de syntaxe due au manque d'espace entre
==1
etelse
)la source
(n+1)%(i+1)
est-~n%-~i
, je pense.and
/or
fonctionnent, par exemplef=lambda n:sum(-~n%-~i<1for i in range(n))==1and-~n or f(n+1)
?f=lambda n:sum(-~n%-~i<1for i in range(n))-1and f(n+1)or-~n
Python,
11483 octetsSans builtins, s'il y en a.
-30 en supprimant les espaces et -1 en passant
b%i==0
àb%i<1
la source
1
Perl 6 , 25 octets
Comment ça fonctionne
Perl 6 , 32 octets
Avec des tests de primalité personnalisés inefficaces.
Comment ça fonctionne
La structure extérieure est la même que ci-dessus, mais le prédicat passé à
first
(pour décider si un nombre donné est premier) est maintenant:la source
.is-prime
;)Pyke,
87 octetsEssayez-le ici!
4 octets, sans concurrence
(L'interprète a été mis à jour depuis la publication du défi)
Essayez-le ici!
la source
J, 4 octets
Simple intégré pour le prochain prime.
la source
05AB1E ,
1613 octets (Emigna @ -3 octets)Essayez-le en ligne!
la source
[>Dp#
marcherait pas ?Perl, 30 octets (29 +1 pour
-p
):Usage
Entrez le nombre après avoir appuyé sur retour (entrez 12345 dans l'exemple ci-dessous, sortez 12347):
Comment ça fonctionne
1
's qui a une longueur++$_
, où$_
est initialement la valeur d'entrée1
s n'est pas de longueur première (expliqué ici ).++$_
)while
boucle implicite se ferme et-p
affiche la valeur de$_
"1"
de bord de longueur 1 car il ne sera jamais utilisé pour des valeurs inférieures à1
, selon la spécification.la source
Java 7,
373343334303268 octets-75 octets merci @Poke
Non golfé:
Essayez-le ici.
Quelques exemples d'entrées / sorties:
la source
static
pour le champ et la méthodep
, mais en supprimant la méthodec
etp
le paramètre.QBIC , 34 octets
Basé sur ce testeur de primalité QBIC . Explication:
la source
JavaScript (ES7), 61 octets
Usage
Production
la source
MATL, 3 octets
La fonction
Yq
renvoie le nombre premier suivant de la valeur absolue de l'entrée si l'entrée est négative, donc nous saisissons implicitement l'entrée, la nions (_
) et trouvons le nombre premier suivant en utilisantYq
.Essayez-le en ligne!
la source
Haskell,
424643 octetsle code habituel pour la force brute.
Bien sûr, cela trouve le plus petit nombre premier suivant
n
. Il n'y a pas de plus gros prime.Fonctionne pour n > 0 .
modifier: Suppose
n
est premier. Merci aux conseils de @Laikoni dans les commentaires .la source
head[...]
par[...]!!0
. Cependant, je pense que l'on peut supposer quen
c'est premier, vous pouvez donc utiliser à la[n..]
place de[n+1..]
puis prendre le deuxième élément avec[...]!!1
.SimpleTemplate, 132 octets
L'algorithme est terrible, car je dois faire mon propre code pour vérifier si un nombre est premier ou non.
Cela s'est avéré horrible, mais ça marche.
Reçoit le nombre comme premier argument, produisant le résultat.
Non golfé:
Des conseils sur la façon de supprimer ce dernier
@if
?la source
Lua, 876 octets
Lua, contrairement à certaines autres langues, a une taille entière maximale. Une fois qu'un nombre dépasse 2 32 , les choses cessent de fonctionner correctement et Lua commence à essayer de faire des estimations au lieu de valeurs exactes.
En tant que tel, j'ai dû implémenter une nouvelle méthode de stockage des nombres, en particulier, je les ai stockés en tant que chaînes Base10, car Lua n'a pas de limite de taille sur les chaînes, autre que la taille de la mémoire.
Je pense que cette réponse est beaucoup plus à l'esprit de la question, car elle doit elle-même implémenter des entiers de précision arbitraires, ainsi qu'un premier critère.
Expliqué
Bien que ce qui précède utilise des métatables, au lieu de simplement des fonctions régulières comme la réponse réelle, qui a fonctionné plus petit.
la source
Ruby, 28 + 6 = 34 octets
Utilise le
-rprime
drapeau.Version non récursive pour 31 + 6 = 37 octets:
la source
Python + primefac ,
3432 octetsPas tout à fait aussi court que l'utilisation
sympy
(une autre réponse l'utilise déjà), mais c'est toujours assez court et c'est beaucoup plus rapide.Essayez-le en ligne
La saisie de se
2**2000
termine en quelques secondes.la source
Japt, 6 octets
Exécutez-le en ligne.
la source