Un nombre est un nombre premier de Mersenne s'il est à la fois premier et qu'il peut être écrit sous la forme 2 n -1 , où n est un entier positif.
Votre tâche consiste à déterminer, en fonction de tout nombre entier positif, s'il s'agit ou non d'un nombre premier de Mersenne. Vous pouvez soumettre soit une fonction qui retourne une valeur vérité / fausseté, soit un programme complet qui exécute des entrées / sorties.
Règles:
- Comme il s'agit de code-golf , vous devriez viser le plus petit nombre d'octets possible. Les Builtins sont autorisés.
- Des failles de golf standard s’appliquent - vous ne pouvez pas lire les nombres premiers Mersenne à partir de fichiers externes, ni les coder en dur dans votre programme.
- Votre programme devrait fonctionner pour des valeurs comprises dans la taille entière standard de votre langue.
Cas de test
Pour référence, une liste des Primes de Mersenne (connues) peut être trouvée ici . Certains cas de test pratiques sont:
2 -> False
1 -> False
20 -> False
51 -> False
63 -> False
3 -> True
31 -> True
8191 -> True
Joyeux Noël tout le monde! Passez de bonnes vacances, peu importe ce que vous célébrez :)
2^n-1
n
est toujours primordial, mais sachant que cela ne change rien, la définition est toujours correcte.Réponses:
Gelée , 5 octets
Essayez-le en ligne!
Comment ça marche
la source
05AB1E , 5 octets
Un nombre positif sous la forme 2 n - 1 en binaire est composé uniquement de 1 .
Code:
Explication:
Utilise le codage CP-1252 . Essayez-le en ligne! ou Vérifiez tous les cas de test .
la source
Python , 45 octets
Essayez-le en ligne!
Comment ça marche
Les trois termes de la comparaison chaînée
faire ce qui suit:
-~n&n
calcule le bit AND ET de n + 1 et n . Puisque n est constitué uniquement de 1 bits s’il s’agit d’un nombre de Mersenne, l’ET au niveau du bit ET retournera 0 si (et seulement si) c’est le cas.all(n%i for i in range(2,n))
renvoie True si et seulement si n mod i est non nul pour toutes les valeurs de i dans [2,…, n - 1] , c'est-à-dire si et seulement si n n'a pas de diviseurs positifs à l'exception de 1 et n .En d’autres termes, all renvoie True si et seulement si n est un nombre composé, c’est-à-dire que n est 1 ou un nombre premier.
n
est explicite.La comparaison chaînée renvoie True si et seulement si les comparaisons individuelles font la même chose.
Étant donné que tous les retours soit vrai / 1 ou Faux / 0 ,
-~n&n<all(n%i for i in range(2,n))
ne peut retourner vrai si les-~n&n
rendements 0 ( par exemple, si n est un nombre Mersenne) et tous les retours Vrai ( par exemple, si n soit 1 ou prime).La comparaison
all(n%i for i in range(2,n))<n
est valable chaque fois que n> 1 , mais puisque tout retourne True si n = 1 , elle ne l’est pas dans ce cas.la source
Brachylog , 7 octets
Essayez-le en ligne!
Un programme Brachylog est fondamentalement une suite de contraintes qui forment une chaîne: la première contrainte se situe entre l’entrée et un inconnu anonyme (appelons-le A pour les besoins de cette discussion), la seconde contrainte se situe entre cet inconnu anonyme et un deuxième anonyme. inconnu (que nous appellerons B ), et ainsi de suite. En tant que tel, le programme se décompose ainsi:
Le seul moyen de satisfaire simultanément toutes ces contraintes est si B est une puissance de 2, c'est-à-dire que l'entrée est une puissance de 2 moins 1 et que l'entrée est également première. (Brachylog utilise un résolveur de contraintes en interne, de sorte que le programme ne soit pas aussi inefficace que l'ordre d'évaluation; il sera conscient
C
de sa forme[2, Y]
avant d'essayer de l'exprimerB
sous la forme d'une exponentiation de deux nombres.)Fait intéressant,
#p+~^
presque fonctionne, parce que Mersenne comme les nombres premiers ne peut utiliser 2 comme base dans les cas non dégénéré ( preuve ), mais a) elle échoue pour les nombres premiers non-Mersenne B -1 car ils peuvent être exprimés en B ¹, et b ) L’interprète Brachylog existant semble être confondu (entrer dans une boucle infinie, ou du moins de longue durée) par un programme aussi peu contraint. Il est donc peu probable que 7 octets soient battus dans Brachylog.la source
Mathematica 26 octets
Voir cette preuve
Fonctionne tant qu'il n'y a pas de nombres impairs parfaits, et qu'aucun ne soit connu pour exister.
la source
n(n+1)/2
produit des nombres (pairs) parfaits dès qu'iln
s'agit d'un nombre premier de Mersenne (Euclid). Il semble qu'on ignore si un nombre parfait impair peut avoir la formen(n+1)/2
, c'est-à-dire être un nombre triangulaire. Tous les nombres même parfaits sont triangulaires lorsqu'iln
s'agit d'un nombre premier de Mersenne (Euler).Mathematica,
29 à26 octetsEdit: 3 octets sauvés grâce à Martin Ender
PrimeQ@#&&IntegerQ@Log2[#+1]&
Je pense que cela serait plus rapide puisque les 42 premiers exposants sont codés en dur:
la source
PrimeQ@#&&1>BitAnd[#,#+1]&
Perl 6 , 29 octets
L'essayer
Étendu:
Puisque Perl 6 a des tailles de fichier arbitrairement grandes, il ne couvre pas le début
.base(2)
avec0
s.la source
Python,
8382797673 octetsPython 2, 71 octets
Cette fonction implémente le test de primalité Lucas – Lehmer . Ainsi, bien que ce ne soit pas aussi court que certaines autres offres Python, il est beaucoup plus rapide à gérer des entrées énormes.
Voici un code de test qui s'exécute sur Python 2 ou Python 3.
sortie
FWIW, voici une version légèrement plus efficace de
f
ce test, qui ne re-teste pasm
à chaque boucle:la source
R,
4140 octetsCurieusement, le langage intégré dans R
mersenne
prendn
comme argument, pas2^n-1
.Cela prend
x
STDIN, vérifie s'il utilise correctement lematlab
paquet et vérifie si le 2-log dex+1
est un nombre entier en prenant le mod 1 et en vérifiant que le résultat n'est pas nul.De plus, si vous utilisez la commande
mersenne
intégrée, celle-ci finit par être légèrement plus courte, mais donne l'impression de tricher:Enregistré 1 octet grâce à @Billywob
la source
matlab::isprime
de sauver un octet. Aussi, vous devez utiliser<-
pour l'affectation en fonction.log2(x+1)
placelog(x+1,2)
.Pyke, 10 octets
Essayez-le ici!
la source
En fait , 9 octets
Essayez-le en ligne!
Explication:
Comme chaque nombre de la forme 2 n -1 a tous les 1 dans sa représentation binaire, un nombre premier de Mersenne peut être identifié comme un nombre premier ayant cette qualité.
la source
Gelée, 5 octets
Autre approche de la réponse Jelly à 5 octets existante de @Dennis:
Essayez-le en ligne!
Comment ça marche:
Etant donné qu'un Mersenne Prime correspond à un moins qu'une puissance de 2, sa représentation binaire correspond à 1. La sortie correspondante est 1 pour les nombres premiers de Mersenne et 0 dans tous les autres cas.
la source
Ceylan, 66 octets
Formaté (et commenté):
Avec la triche (coder en dur les résultats dans la plage de Integer de Ceylan), nous pouvons obtenir un octet plus court (65):
(Il semble que le surligneur de syntaxe comprenne mal les chiffres hexadécimaux de Ceylan en début de commentaire.)
Si une fonction anonyme est correcte, celle-ci a 49 octets:
la source
Wolfram Language (Mathematica) , 23 octets
Essayez-le en ligne!
1 est traité correctement car
PrimeQ[BitAnd[1,1+2]*1] == PrimeQ@1 == False
. Sinon, pourBitAnd[#,#+2]#
être premier, nous avons besoin de ce qui#
est premier etBitAnd[#,#+2] == 1
, ce qui arrive quand#
est un nombre de Mersenne.la source
Regex ECMAScript,
42 à31 octets^(?!(xx+)\1+$)(x(x*)(?=\3$))+x$
Essayez-le en ligne!
Edit: jusqu'à 31 octets grâce à Neil.
La base "est une puissance de 2 moins 1" test est
^(x(x*)(?=\2$))*$
. Cela fonctionne en boucle avec l'opération "soustraire 1, puis diviser de manière égale par 2" jusqu'à ce que l'opération ne soit plus possible, puis en affirmant que le résultat est nul. Cela peut être modifié pour ne faire correspondre que les nombres ≥1 en remplaçant le dernier*
par un+
, forçant la boucle à itérer au moins une fois. Insertion d'unx
avant le dernier$
le modifie pour qu'il ne corresponde qu'aux nombres ≥3 en affirmant que le résultat final après avoir bouclé au moins une fois est 1.Le test connexe "est une puissance de 2" est
^((x+)(?=\2$))*x$
. Il y a également un raccourci pour les pouvoirs correspondant de 2 moins 2, découverts par Grimy :^((x+)(?=\2$)x)*$
. Ces trois regex sont de la même longueur.Version alternative 31 octets, par Grimy :
^(?!(xx+)\1+$|((xx)+)(\2x)*$)xx
Essayez-le en ligne!
la source
x(x+)(?=\3$)
légèrement plus efficace?Regex (ECMAScript), 29 octets
Essayez-le en ligne!
Inspiré par Grimy in chat
La regex affirme que l'entrée est supérieure à 3 et qu'elle n'est ni de la forme,
(xx+)\1+
ni((xx)+)(\1x)+
.Le premier correspond aux nombres composés.
La seconde correspond à un nombre égal à 1 de moins qu’un multiple d’un nombre impair supérieur à 2.
Le premier ne correspondra pas aux nombres premiers, ou2n- 1 , ou des nombres inférieurs de 1 à un nombre impair.
0
ou1
.La seconde ne correspondra pas aux numéros du formulaire
Étant donné que 2 est le seul nombre premier inférieur de 1 à un nombre impair, le signe d'anticipation négatif, ainsi que l'affirmation que l'entrée est supérieure à 3, correspondra uniquement aux nombres premiers de mersenne.
la source
Ruby, 47 octets
la source
Julia, 26 octets
la source
Python, 65 octets
Sorties via le code de sortie. Erreur de récursion pour False. Aucune erreur pour True.
Comment ça marche
Comme
2^n-1
en binaire est fait entièrement à partir de 1, le prochain2^n-1
nombre peut être généré parnumber|number+1
.Cette fonction utilise ceci en
2^n-1
vérifiant récursivement chaque nombre pour vérifier s'il s'agit d'un nombre premier et de son eqaul à l'entrée. Si le nombre n'est pas un nombre premier de mersenne, python émettra une erreur car la profondeur de récursivité maximale aurait été dépassée.la source
<0
~>0>
.Pushy , 7 octets
Essayez-le en ligne!
Cela tire parti du fait que les nombres de mersenne n’en ont qu’un dans leur représentation binaire:
Le produit de pile ne le sera que
1
si le nombre n'a pas de zéros dans sa représentation binaire et que sa primalité estTrue
.la source
Pyth , 8 octets
Vérifiez tous les cas de test.
Pyth , 8 octets
Vérifiez tous les cas de test.
Comment?
Code Breakdown # 1
Comment ça marche?
Un numéro de la forme 2 n - 1 contient toujours 1 uniquement lorsqu'il est écrit en binaire. Par conséquent, nous testons si tous ses chiffres binaires sont 1 et s'il est premier.
Code Breakdown # 2
Comment ça marche?
Ceci teste si l' entrée + 1 est une puissance de deux (c'est-à-dire s'il s'agit d'un nombre de Mersenne), puis effectue le test de primalité. En Python,
bool
est une sous-classe deint
, de sorte que la vérité est traitée en tant que 1 et la fausseté est traitée en tant que 0 . Pour éviter de vérifier explicitement que l'un est 0 et l'autre 1 , nous comparons leurs valeurs en utilisant<
(puisque nous n'avons qu'un seul cas de ce type).la source
Java 8,
535249 octetsCorrection de bug et lecture de 4 octets grâce à @Nevay .
Explication:
Essayez ici.
la source
true
pour chaque nombre premier> 2, pas seulement pour les nombres premiers de Mersenne, 56 octets:n->{for(int i=2;i<n;n&=-n%i++>>-1);return(n&n+1)<1&n>2;}
n->{int i=1;for(;++i<n&n%i>0;);return(n&n+1|i^n)<1;}
n->{int i=1;for(;n%++i>0;);return(n&n+1|i^n)==0;}
Python 3, 68 octets
Essayez-le ici
Python 2, 63 octets
Essayez-le ici
Merci pour la suggestion Jonathan
Ouvert à toute suggestion pour réduire le nombre de tiers.
la source
1 and
~>1and
.Japt, 6 octets
Run it or Run all test cases
la source
©
with bitwise&
for consistent output, if you want.Python, 93 Bytes
This code would work in both Python 2 and Python 3 so I have not specified a version.
la source
Racket 76 bytes
Ungolfed:
Testing:
Output:
la source
PHP, 53 bytes
takes command line argument; prints
1
for Mersenne prime, empty string else. Run with-r
.breakdown
la source
C, 94 bytes
Returns 1 if the number is a Mersenne Prime, 0 otherwise.
la source
~x+g(2,n)
instead ofx^g(2,n)-1
Scala, 59 Bytes
This function requires the input to be a
BigInt
. You can easily convert a string "162259276829213363391578010288127" (2**107-1 is a Mersenne prime) intoBigInt
by doingBigInt("162259276829213363391578010288127")
. It might go wrong as the name ofisProbablePrime()
method suggests. But the probability is not more than0.5^(t.bigLength)*9
.Standalone script version is 72 bytes long.
Assume we save it as "t.scala", then then program can be run as
la source
Probable
fromisProbablePrime
if Scala has anisPrime
function.Perl 5, 53 bytes
52 bytes of code + 1 for
-p
Try it online!
la source
-p
is classified as another programming language, and hence doesn't count in your bytecount.