Parfois, lors de l'écriture d'un programme, vous devez utiliser un nombre premier pour une raison ou une autre (par exemple, la cryptographie). Je suppose que parfois, vous devez également utiliser un numéro composite. Parfois, au moins ici sur PPCG, votre programme doit être capable de gérer des changements arbitraires. Et dans des circonstances convenablement conçues pour poser une question intéressante sur le PPCG, peut-être même les chiffres que vous utilisez doivent résister à la corruption
Définitions
Un nombre composé est un entier ≥ 4 qui n'est pas premier, c'est-à-dire qu'il est le produit de deux entiers plus petits supérieurs à 1. Un nombre composite résistant au bitflip est défini comme suit: c'est un entier positif composite pour lequel, si vous l'écrivez en binaire dans le nombre minimum de bits possible, vous pouvez changer un ou deux bits du nombre, et le nombre est toujours composite.
Exemple
Par exemple, considérons le nombre 84. En binaire, c'est 1010100
. Voici tous les nombres qui ne diffèrent pas de plus de 2 bits:
0000100 4 2 × 2 0010000 16 4 × 4 0010100 20 4 × 5 0010101 21 3 × 7 0010110 22 2 × 11 0011100 28 4 × 7 0110100 52 4 × 13 1000000 64 8 × 8 1000100 68 4 × 17 1000101 69 3 × 23 1000110 70 7 × 10 1001100 76 4 × 19 1010000 80 8 × 10 1010001 81 9 × 9 1010010 82 2 × 41 1010100 84 7 × 12 1010101 85 5 × 17 1010110 86 2 × 43 1010111 87 3 × 29 1011000 88 8 × 11 1011100 92 4 × 23 1011101 93 3 × 31 1011110 94 2 × 47 1100100 100 10 × 10 1110000 112 8 × 14 1110100 116 4 × 29 1110101 117 9 × 13 1110110 118 2 × 59 1111100 124 4 × 31
La première colonne est le nombre en binaire; la deuxième colonne est le nombre en décimal. Comme l'indique la troisième colonne, tous ces chiffres sont composites. En tant que tel, 84 est un nombre composite résistant au bitflip.
La tâche
Vous devez écrire l'un des trois programmes ou fonctions suivants, selon celui qui convient le mieux à votre langue:
- Un programme ou une fonction qui prend en entrée un entier non négatif n et génère les n premiers nombres composites résistants au flip bit.
- Un programme ou une fonction qui prend un entier non négatif n en entrée, et sort tous les nombres composites résistants au bitflip inférieurs à n (ou si vous préférez, inférieurs ou égaux à n , c'est-à-dire que vous pouvez choisir si n est inclus dans la sortie si bitflip -résistant).
- Un programme ou une fonction qui ne prend aucune entrée et génère tous les nombres composites résistants au bitflip. (Cela doit utiliser un mécanisme de sortie capable de produire une sortie pendant que le programme est en cours d'exécution, comme l'impression sur stdout, une liste paresseuse ou un générateur; vous ne pouvez pas simplement calculer la liste entière puis l'imprimer.)
Cas de test
Voici les premiers nombres composites résistants au bitflip:
84, 184, 246, 252, 324, 342, 424, 468, 588, 636, 664, 670, 712, 730, 934, 958
Clarifications
- Ce ne sont que les chiffres que vous produisez qui doivent être résistants aux bitflips. Il ne s'agit pas de rendre le programme qui les trouve résistants aux bitflips; utilisez les numéros que vous aimez dans le programme lui-même.
- Les nombres que vous sortez ne doivent pas nécessairement résister à un bitflip dans les "zéros de tête"; imaginez que les nombres seront stockés dans le nombre minimum possible de bits, et seuls ces bits doivent être à l'abri du retournement. Cependant, les 1 bits initiaux des nombres que vous sortez doivent être à l'abri des bitflips.
- Utilisez n'importe quel algorithme que vous aimez qui produit le bon résultat; vous n'êtes pas marqué sur l'efficacité ici.
- Si vous pouvez prouver qu'il existe un nombre fini de nombres composites résistants au bitflip, alors a) les restrictions sur le format de sortie sont levées, et b) le codage en dur de la liste sera autorisé (bien que probablement plus verbeux que le simple calcul). Cette règle est surtout juste pour être complet; Je ne m'attends pas à ce que ce soit pertinent.
Condition de victoire
C'est du code-golf , donc comme d'habitude, plus c'est court, mieux c'est. Toujours comme d'habitude, la longueur du programme sera mesurée en octets.
n
si len
bitflip est résistant? (c.-à-d. le rendre "inférieur ou égal à n"?)Réponses:
Gelée , 20? 22 octets
Essayez-le en ligne!
Donne les n premiers de ces nombres.
Peut-être que le
;0
peut être supprimé (sans lui, nous ne vérifions pas si le nombre lui-même est composite - y a-t-il des nombres premiers avec tous les bit-flips composites?)Notez qu'il ne suffit pas d'effectuer le test
not(any(is prime))
sur l'ensemble de nombres à bits inversés. Il faut aussi tester qui0
n'est pas dans le set.C'est parce que
0
n'est pas premier et non composite (l'1
est aussi, mais voir ci-dessous).La nécessité de vérifier
0
peut être vue par un contre-exemple:131136
( 2 17 +2 6 ) a le jeu de flip-bit suivant:Tous, sauf
0
sont composites, ne0
sont pas encore premiers.1
est également non premier et non composite et pourrait apparaître dans l'ensemble. Cependant, nous pouvons, si nous voulons, laisser cela comme s'il s'agissait d'un composite:toutes les entrées inférieures ou égales
3
(si elles sont prises en compte) contiennent de0
toute façon (en fait toutes sont inférieures à7
).pour atteindre
1
en un bit flip le nombre d'origine doit être de la forme 2 k +2 0 , et si celui-ci est supérieur à3
, c'est-à-dire k> 1 , alors nous pouvons atteindre3
en retournant le k- bit et en réglant le 1- bit ( 2 1 +2 0 = 3 ).pour atteindre
1
en deux flips, le nombre d'origine doit être de la forme 2 k et s'il est supérieur à3
ce que nous pouvons atteindre2
en deux flips à la place, et2
est premier.En l'état actuel du code est à la fois la manipulation
0
et1
ensemble en utilisant l'atome « insignifiante »,Ị
.Comment?
la source
;0
est là -Œċ
obtient toutes les paires non ordonnées avec remplacement des index (J
), donc pour 84, qui a 7 bits, c'est 28 (y compris les goûts de [1,1] pour les bit-flips simples (du "avec pièce de rechange"), pas 29 (plus aucun changement).Brachylog ,
3238 octetsEssayez-le en ligne!
Il s'agit d'une fonction / prédicat
↰₀
qui renvoie un générateur qui génère tous ces nombres. (Le lien TIO imprime uniquement le premier nombre, de sorte que quelque chose soit observable. L'exécuter localement en a produit beaucoup plus, cependant.)Maintenant mis à jour pour gérer correctement les nombres qui se trouvent dans deux bitflips de 0 ou 1 (qui ne sont ni premiers ni composites).
Explication
Prédicat d'aide
↰₂
(renvoie une liste qui est égale à l'entrée, à l'exception peut-être d'un élément)J'adorerais qu'il y ait un moyen plus simple de faire cette récursivité relativement simple, mais je ne suis pas sûr qu'il y en ait encore; il y a quelques fonctionnalités prometteuses dans la spécification, mais elles sont marquées comme non implémentées.
Programme principal
↰₀
la source
JavaScript (ES6), 96 octets
Un programme complet qui demande le nombre d'entiers correspondants et les affiche un par un, en utilisant
alert()
.Sauf si votre navigateur est configuré pour utiliser Tail Call Optimization, cela finira par se casser en raison d'un débordement de récursivité.
Ci-dessous, une version non récursive (102 octets).
supposition
Cet algorithme repose sur l'hypothèse que tous les nombres composites résistants au bitflip sont pairs. Cela conduit à une simplification assez importante: au lieu de retourner toutes les paires de bits possibles, nous retournons uniquement le bit # 0 et un autre (ou aucun autre bit du tout) et vérifions que tous les nombres résultants sont composites.
Cependant, je ne peux pas trouver de preuve évidente qu'un nombre composite impair résistant au bitflip n'existe pas réellement. Il se trouve que ce n'est jamais le cas pour les petits nombres (j'ai vérifié jusqu'à 1000000), et il semble que la probabilité d'en trouver un diminue à mesure que le nombre de bits augmente (mais ce n'est fondamentalement que mon intuition à ce sujet).
la source
Gelée ,
2017 octetsEssayez-le en ligne!
Comment ça marche
la source
Python 2, 113 octets
(La deuxième ligne est une fonction sans nom qui renvoie une liste de tous les nombres composites résistants au bitflip qui sont inférieurs à l'entrée de la fonction.)
La syntaxe
all(u%q for q in range(2,u))
évaluera àTrue
chaque fois qu'ilu
est premier ou inférieur ou égal à2
, et sinon évaluera àFalse
. (Il est videTrue
siu
est inférieur ou égal à2
.)En d'autres termes,
all(u%q for q in range(2,u))
est égal à0
si et seulement siu
est composite.Si l'entrée de la fonction est inférieure à
2
, la fonction renvoie une liste vide (comme vous le souhaitez). Supposez donc que l'entréeN
est au moins2
, et supposez1 <= n < N
. Pour chacunk
de à0
traversn
(inclus), le code vérifiera sin
XOR'd aveck
est composite, et il vérifie également s'ilk
a au plus deux1
dans sa représentation binaire. Sin^k
est composite ou s'il enk
a plus de deux1
, il passe à la valeur suivante dek
. S'il passe à travers toutes les valeurs dek
from0
den
cette manière, il les inclutn
dans la liste.D'un autre côté, s'il y a une valeur
k
avec au plus deux1
comme tel quin^k
n'est pas composite, alors iln
n'est pas inclus dans la liste.la source
Perl 6 ,
8785 octetsRenvoie tous ces nombres inférieurs ou égaux au nombre entré.
Comment ça marche
Pour chaque nombre n de 2 à l'entrée, il procède comme suit:
Génère tous les entiers non négatifs qui ont la même longueur de bit ou plus courte que n .
Filtre les nombres de cette liste qui ont moins de trois bits définis (à l'aide d'une expression régulière).
XOR n avec chacun de ces nombres, donnant toutes les «mutations» valides de n .
Ne permet à n de faire partie de la liste de sortie que si aucune des mutations n'est non composite (vérifiée en prenant chaque mutation x modulo une jonction de nombres entre 2 et x -1).
la source
Mathematica, 115 octets
14 octets enregistrés grâce à @MartinEnderTrès inefficace car il génère tous les nombres jusqu'à 2 ^ ceil (lg (n)).
Le deuxième code utilise U + F4A1 (
Function
fonction)la source
Floroid ,
95109 octetsRenvoie une liste de nombres résistants au bitflip jusqu'à
input - 1
. Gère également les situations énervées (0 et 1).Floroid est une vieille langue que je n'ai utilisée que quelques fois. Je ne l'ai pas touché depuis longtemps, d'où la taille du programme.
Se traduit par le code Python suivant, qui je pense pourrait être réduit avec la récursivité.
Chaque fonction utilisée ici est prédéfinie dans Floroid. Cette page contient toutes les fonctions et leurs définitions.
la source
MATL ,
30282726 octetsEssayez-le en ligne!
Génère tous les nombres composites résistants au bitflip jusqu'à (et y compris) n. Utilise les idées des deux solutions Jelly - considère uniquement 0 comme un non-prime problématique; et génère d'abord une liste de nombres sur une distance 2, puis prend un xor.
Solution alternative, en boucle (30 octets):
Génère tous les nombres composites résistants au bitflip jusqu'à (et y compris) n.
la source
CJam ,
3433 octetsCalcule tous les composites bitflip-résistants strictement inférieurs à n .
Comme Jonathan Allan, je ne sais pas s'il est réellement nécessaire de vérifier 0 bitflips. S'il s'avère qu'aucun nombre premier n'a tous ses bitflips résultants en nombres composites, le
0+
peut être supprimé.Essayez-le en ligne!
Explication
la source
MATL , 29 octets
Merci à Jonathan Allan pour une correction.
Cela prend un nombre n et génère tous les nombres composites résistants au bitflip jusqu'à n .
Comment ça marche
Essayez-le sur MATL Online!
la source