Un numéro Proth , nommé d'après François Proth, est un numéro qui peut être exprimé par
N = k * 2^n + 1
Où k
est un entier positif impair et n
est un entier positif tel que 2^n > k
. Utilisons un exemple plus concret. Prenez 3. 3 est un numéro de Proth, car il peut être écrit comme
(1 * 2^1) + 1
et 2^1 > 1
est satisfait. 5 Est également un numéro de Proth, car il peut être écrit comme
(1 * 2^2) + 1
et 2^2 > 1
est satisfait. Cependant, 7 n’est pas un numéro Proth car le seul moyen de l’écrire sous la forme N = k * 2^n + 1
est
(3 * 2^1) + 1
et 2^1 > 3
n'est pas satisfait.
Votre défi est assez simple: vous devez écrire un programme ou une fonction qui, à partir d’un entier positif, détermine s’il s’agit d’un nombre Proth ou non. Vous pouvez prendre des entrées dans n’importe quel format raisonnable, et devez indiquer une valeur de vérité s’il s’agit d’un nombre de Proth et une valeur de faux si ce n’est pas le cas. Si votre langue possède des fonctions de "détection de numéro de proth", vous pouvez les utiliser.
Test IO
Voici les 46 premiers numéros de Proth allant jusqu'à 1000. ( A080075 )
3, 5, 9, 13, 17, 25, 33, 41, 49, 57, 65, 81, 97, 113, 129, 145, 161, 177, 193, 209, 225, 241, 257, 289, 321, 353, 385, 417, 449, 481, 513, 545, 577, 609, 641, 673, 705, 737, 769, 801, 833, 865, 897, 929, 961, 993
Toute autre entrée valide doit donner une valeur de fausseté.
Comme d'habitude, c'est du code-golf, donc les échappatoires standard s'appliquent, et la réponse la plus courte en octets gagne!
Note de la théorie des faits amusante:
Le plus grand nombre connu qui ne soit pas un prix Mersenne est 19249 * 2^13018586 + 1
ce qui se trouve être aussi un numéro Proth!
la source
Python, 22 octets
Ceci est un port de ma réponse de gelée . Testez-le sur Ideone .
Comment ça marche
Soit j un entier strictement positif. J + 1 bascule tous les bits de fin de jeu de j et le bit non défini adjacent. Par exemple, 10011 2 + 1 = 10100 2 .
Puisque ~ j = - (j + 1) = -j - 1 , -j = ~ j + 1 , alors -n applique ce qui précède au bit NOT de j (qui bascule tous les bits), basculant ainsi tous les bits avant le dernier 1 .
En prenant j & -j - le bit AND de j et -j - tous les bits avant et après le dernier bit défini sont annulés (car inégal en j et -j ), donnant ainsi la plus grande puissance de 2 qui divise j de manière égale.
Pour l’entrée N , nous voulons appliquer ce qui précède à N-1 pour trouver 2 n , la plus grande puissance de 2 qui divise N-1 . Si m = N - 1 , -m = - (N - 1) = 1 - N , donc (N - 1) et (1 - N) donne 2 n .
Tout ce qui reste à tester est si 2 n > k . Si k> 0 , cela est vrai si et seulement si (2 n ) 2 > k2 n , ce qui est vrai même si et seulement si (2 n ) 2 ≥ K2 n + 1 = N .
Enfin, si (2 n ) 2 = N = k2 n + 1 , 2 n doit être impair ( 1 ) pour que les parités des deux côtés puissent correspondre, ce qui implique que k = 0 et N = 1 . Dans ce cas (N - 1) et (1 - n) = 0 et 0 = 0 et ((N - 1) et (1 - N)) 2 = 0 <= N 1 .
Par conséquent, ((N - 1) & (1 - N)) 2 > N est vrai si et seulement si N est un numéro de Proth.
En ignorant les inexactitudes en virgule flottante, cela équivaut au code
N-1&1-N>N**.5
de la mise en œuvre.la source
Python 2, 23 octets
la source
Mathematica,
5048454038353129 octetsMathematica est généralement nul en ce qui concerne le golf, mais il existe parfois une fonction intégrée qui rend les choses vraiment belles.
Un examen:
Edit: En fait, si je vole l 'idée de Dennis au niveau des bits ET de Dennis , je peux la réduire à
232220 octets.Mathematica,
232220 octets (merci A Simmons )la source
g=
, une fonction pure va bien!Select[Range@1000,f]
.05AB1E ,
14 à10 octetsMerci à Emigna pour avoir économisé 4 octets!
Code:
Utilise le codage CP-1252 . Essayez-le en ligne! .
Explication:
Pour l'explication, utilisons le nombre 241 . Nous décrivons d’abord le nombre par un avec
<
. Cela se traduit par 240 . Maintenant, nous calculons les facteurs premiers (avec les doublons) en utilisantÒ
. Les facteurs premiers sont:Nous les avons divisés en deux parties. En utilisant
2Q·0K
, nous obtenons la liste de deux:Avec
®2K
, nous obtenons la liste des nombres restants:Enfin, prenez le produit des deux.
[2, 2, 2, 2]
résultats en 16 . Le produit des[3, 5]
résultats en 15 .Ce cas de test est la vérité depuis 16 > 15 .
la source
<©Ó¬oD®s/›
ou<DÓ0èoDŠ/›
pour 10.Brain-Flak ,
460350270266264188176 octetsEssayez-le en ligne!
Explication
Le programme passe par des puissances de deux et quatre jusqu'à trouver une puissance de deux supérieure à N-1. Lorsqu'il le trouve, il vérifie la divisibilité de N-1 par la puissance de deux à l'aide de modulo et affiche le résultat.
Ce programme n'est pas propre à la pile. Si vous ajoutez 4 octets supplémentaires, vous pouvez le rendre propre:
la source
MATL , 9 octets
La sortie de vérité est
1
. Falsy est0
ou une sortie vide. (Les seules entrées qui produisent une sortie vide sont1
et2
; le reste produit l'un0
ou l' autre ou1
).Essayez-le en ligne!
Explication
Soit x la source. Soit y la plus grande puissance de 2 qui divise x -1, et z = ( x -1) / y . Notez que z est automatiquement impair. Alors x est un nombre de Proth si et seulement si y > z , ou de manière équivalente si y 2 > x −1.
la source
Brachylog , 28 octets
Essayez-le en ligne!
Vérifiez tous les tests à la fois. (Légèrement modifié.)
Explication
Brachylog, étant un dérivé de Prolog, est très doué pour prouver des choses.
Ici, nous prouvons ces choses:
la source
Haskell,
5546 octetsEdit: Merci à nimi, maintenant 46 octets
la source
sum[1| ... ]
. Ici , nous pouvons aller plus loin et passer le test d'égalité devant la|
et vérifiez avecor
si l' un d'eux est vrai:f x=or[k*2^n+1==x|k<-...,n<-...,2^n>k]
.ECMAScript Regex,
484341 octetsLes regex de Neil et H.PWiz (tous deux également au goût ECMAScript) sont beaux en eux-mêmes. Il y a une autre façon de le faire, qui , par une jolie coïncidence nette était de 1 octet plus de Neil, et maintenant avec le golf suggéré H.PWiz (merci!), Est de 1 octet
plusmoins de H.PWiz de.Attention: malgré la petite taille de cette regex, elle contient un spoiler majeur . Je recommande fortement d'apprendre à résoudre des problèmes mathématiques unaires dans les expressions rationnelles ECMAScript en analysant indépendamment les connaissances mathématiques initiales. Ce voyage a été fascinant pour moi et je ne veux pas le gâter pour ceux qui voudraient éventuellement l'essayer eux-mêmes, en particulier ceux qui s'intéressent à la théorie des nombres. Voir ce message précédent pour une liste de problèmes recommandés consécutivement étiquetés spoiler pour résoudre un par un
Alors , ne lisez pas plus loin si vous ne voulez pas que la magie avancée des regex unaires soit gâtée . Si vous voulez vraiment essayer de découvrir cette magie vous-même, je vous recommande vivement de commencer par résoudre certains problèmes de la regex ECMAScript, comme indiqué dans l'article ci-dessus.
Donc, cette expression rationnelle fonctionne très simplement: elle commence par en soustraire une. Ensuite, il trouve le plus grand facteur impair, k . Ensuite, nous divisons par k (en utilisant l’algorithme de division brièvement expliqué dans un paragraphe étiqueté spoiler de mon nombre factoriel regex post ). Nous faisons sournoisement une affirmation simultanée que le quotient résultant est supérieur à k . Si la division correspond, nous avons un numéro Proth; sinon, nous ne le faisons pas.
J'ai pu supprimer 2 octets de cette expression rationnelle (43 → 41) en utilisant une astuce trouvée par Grimy qui peut encore raccourcir la division dans le cas où le quotient aurait la garantie d'être supérieur ou égal au diviseur.
Essayez-le en ligne!
la source
Julia, 16 octets
Crédits à @Dennis pour la réponse et des conseils de golf!
la source
&
a la même priorité que*
.-~-x
au lieu de(1-x)
. En outre, il y a au√x
lieu dex^.5
, mais cela ne sauvegarde aucun octet.R,
5250 octetsLe programme commence par diviser
N-1
(appelé iciP
etx
) par le2
plus longtemps possible afin de trouver la2^n
partie de l'équation, en partantk=(N-1)/2^n
, puis calcule si ou nonk
est inférieur à2^n
, en utilisant le fait que2^n>x/2^n <=> (2^n)²>x <=> 2^2n>x
la source
P=
début et changer la fin en2^n>x
et sauvegarder comme 5 ou 6 octetsRegex (ECMAScript),
4038 octets-2 octets grâce à Deadcode
Essayez-le en ligne!
Version commentée:
la source
^x(?=((xx)+?)(\1\1)*$)(?!(\1x\2*)\4*$)
( Essayer en ligne )J, 10 octets
Sur la base de @Dennis bitwise solution .
Prend une entrée
n
et retourne 1 s'il s'agit du numéro de Proth sinon 0.Usage
Explication
la source
AND
. cool!Retina 0.8.2 , 47 octets
Convertir en unaire.
Convertir en binaire.
Exécutez à plusieurs reprises la formule de génération Proth en sens inverse.
Faites correspondre le cas de base de la formule de génération Proth.
Edit: Je pense qu'il est en fait possible de faire correspondre un numéro de Proth directement à un nombre unaire avec une seule expression rationnelle. Cela me prend actuellement 47 octets, 7 octets de plus que mon code Retina actuel pour vérifier si un nombre unaire est un numéro Proth:
la source
ECMAScript Regex, 42 octets
Essayez-le en ligne! (Utilisation de la rétine)
Je soustrais essentiellement 1, divise par le plus grand nombre impair possible
k
, puis vérifie qu'ilk+1
reste au moins .Il se trouve que mon expression régulière est très similaire à celle que Neil donne à la fin de sa réponse . J'utilise
x(xx)*
au lieu de(x*)\2x
. Et j'utilise une méthode plus courte pour vérifierk < 2^n
la source
(\3\3)*)$
à(\3\3)*$)
$=
et$.=
. Cela peut être amélioré encore mieux .Brain-Flak , 128 octets
Essayez-le en ligne!
J'ai utilisé un algorithme très différent de celui de l' ancienne solution Brain-Flak .
Fondamentalement, je divise par 2 (arrondi au-dessus) jusqu'à ce que je frappe un nombre pair. Ensuite, je compare simplement le résultat de la dernière division avec les deux à la puissance du nombre de fois que j’ai divisé.
Explication:
la source
Maple, 100 octets (espaces compris)
Bien espacés pour la lisibilité:
Même idée que plusieurs autres; divisez X par 2 jusqu'à ce que X ne soit plus divisible par 2, puis vérifiez le critère 2 ^ n> x.
la source
Java 1.7,
4943 octetsUn autre 6 octets de la poussière grâce à @charlie.
Essayez le! (ideone)
Deux façons, également longues. Comme pour la plupart des réponses ici, les crédits vont à @Dennis bien sûr pour l'expression.Prenant la racine du côté droit de l'expression:
Application de la puissance de deux à gauche de l'expression:
Peut effacer un seul octet si une valeur numérique positive est autorisée à représenter la "vérité" et une valeur négative "falsy":
Malheureusement, à cause de la «conversion restreinte des primitives», on ne peut pas simplement écrire cela en Java et obtenir des résultats corrects:
Et toute tentative d'élargissement de 'p' conduira à une erreur de compilation car les opérateurs au niveau des bits ne sont pas supportés sur ie float ou les doubles :(la source
boolean f(int p){return Math.sqrt(p--)<(p&-p);}
boolean g(int p){return p--<(p&-p)*(p&-p);}
Math.*
appels; n'arrivais pas à comprendre comment! Merci!Hy , 37 octets
Essayez-le en ligne!
Réponse du port de @Dennis.
la source
C (gcc) , 29 à
30octetsEssayez-le en ligne!
la source
Japt ,
12109 octetsEssayez-le en ligne!
La réponse de gelée du port de Dennis à nouveau. - 1 grâce à @Shaggy.
la source
-1
peut êtreÉ
.Cjam, 11 octets
Comme beaucoup d'entre nous, tirons profit de l'excellente solution de Dennis:
Essayez-le en ligne
la source
C (137 octets)
Je ne suis venu lire les réponses qu'après l'avoir essayé.
Considérant
N=k*2^n+1
avec le conditionnel dek<2^n
(k=1,3,5..
etn=1,2,3..
Avec
n=1
nous avons unk
disponible pour tester. Au fur et à mesure que nous augmentons,n
nousk's
en testons un peu plus :n = 1; k = 1
n = 2; k = 1 k = 3
n = 3; k = 1 k = 3 k = 5 k = 7
...
Itère ces possibilités que nous pouvons être sûrs que N est pas un numéro Prouth si un donné
n
lak=1
nombre obtenu est supérieur à N et aucune autre itération était un match.Donc, fondamentalement, mon code "force brute" pour trouver N.
Après avoir lu les autres réponses et réalisé que vous pouvez factoriser N-1 avec 2 pour trouver
n
et ensuite rendre la condition dek<2^n
, alors je pense que mon code pourrait être plus petit et plus efficace en utilisant cette méthode.Ça valait le coup d'essayer!
Testé tous les nombres donnés et quelques nombres "non-Prouth". La fonction retourne 1 si le numéro est un numéro Prouth et 0 si ce n'est pas le cas.
la source
Javascript ES7, 16 octets
Réponse de Port of my Julia, qui est une réponse de @ Dennis's Jelly.
Merci @Charlie pour 2 octets sauvés!
la source
n=x=>x-1&1-x>x**.5; n(3)
me donne0
(en fait, il me donne 0 quelle que soit l'entrée)n=x=>x-1&1-x>Math.pow(x,0.5); n(3)
(x-1&1-x)
comme si la priorité de l'opérateur ne l'était pas:(x-1)&((1-x)>x**.5)
x=>x--**.5<(x&-x)
oux=>x**.5<(--x&-x)
C # (.NET Core) , 17 octets
Essayez-le en ligne!
Réponse C du port de MegaTom .
J'ai essayé une solution basée sur LINQ, mais c'était trop bon.
la source
encre , 60 octets
Essayez-le en ligne!
D' après la réponse de @DSkoog dans Maple - ce n'était pas le premier du genre à être posté, mais c'était le premier du genre que j'ai vu.
Ungolfed
la source
Code machine x86, 15 octets
Ces octets définissent une fonction qui prend l'argument d'entrée (un entier non signé) dans le
EDI
registre, conformément à la convention d'appel standard de System V pour les systèmes x86, et renvoie le résultat dans leEAX
registre, comme tous les autres. les conventions d'appel x86.En mnémonique assembleur:
Essayez-le en ligne!
C'est une solution assez simple, et conceptuellement similaire à la version C de MegaTom . En fait, vous pouvez écrire ceci en C comme suit:
mais le code machine ci-dessus est meilleur que ce que vous obtiendrez d'un compilateur C, même s'il est réglé pour une taille optimale.
Le seul "tricheur" ici renvoie -1 comme valeur de "vérité" et 0 comme valeur de "faux". Cette astuce permet d'utiliser l'
SBB
instruction à 2 octets par opposition à l'instruction à 3 octetsSETB
.la source