Etant donné un semi-premier N , trouver le plus petit entier positif m tel que la représentation binaire de l'un des deux facteurs de N puisse être trouvée dans la représentation binaire de N * m .
Exemple
Prenons le semi-premier N = 9799 .
Nous essayons différentes valeurs de m , à partir de 1:
m | N * m | N * m in binary
---+--------+------------------
1 | 9799 | 10011001000111
2 | 19598 | 100110010001110
3 | 29397 | 111001011010101
4 | 39196 | 1001100100011100
5 | 48995 | 1011111101100011
6 | 58794 | 1110010110101010
7 | 68593 | 10000101111110001
8 | 78392 | 10011001000111000
9 | 88191 | 10101100001111111
10 | 97990 | 10111111011000110
11 | 107789 | 11010010100001101
Nous nous arrêtons ici parce que contient la représentation binaire du dernier produit 101001
qui est la représentation binaire de 41 , l'un des deux facteurs de 9799 (l'autre étant 239 ).
La réponse serait donc 11 .
Règles et notes
- Essayer des valeurs paires de m est inutile. Ils ont été montrés dans l'exemple ci-dessus par souci d'exhaustivité.
- Votre programme doit prendre en charge tout N pour lequel N * m est dans les capacités de calcul de votre langue.
- Vous êtes autorisé à factoriser N avance plutôt que d' essayer chaque sous - chaîne possible de la représentation binaire de N * m pour voir si elle se révèle être un facteur de N .
- Comme l'a prouvé MitchellSpector , m existe toujours.
- Il s'agit de code-golf, donc la réponse la plus courte en octets l'emporte. Les failles standard sont interdites.
Cas de test
La première colonne est l'entrée. La deuxième colonne est la sortie attendue.
N | m | N * m | N * m in binary | Factor
-----------+------+---------------+----------------------------------------------+-------
9 | 3 | 27 | [11]011 | 3
15 | 1 | 15 | [11]11 | 3
49 | 5 | 245 | [111]10101 | 7
91 | 1 | 91 | 10[1101]1 | 13
961 | 17 | 16337 | [11111]111010001 | 31
1829 | 5 | 9145 | 1000[111011]1001 | 59
9799 | 11 | 107789 | 1[101001]0100001101 | 41
19951 | 41 | 817991 | 1[1000111]101101000111 | 71
120797 | 27 | 3261519 | 11000[1110001]0001001111 | 113
1720861 | 121 | 208224181 | 11000110100[100111111101]10101 | 2557
444309323 | 743 | 330121826989 | 100110011011100110010[1101010010101011]01 | 54443
840000701 | 4515 | 3792603165015 | 11011100110000[1000110000111011]000101010111 | 35899
1468255967 | 55 | 80754078185 | 1001011001101010100010[1110001111]01001 | 911
Réponses:
Pyth, 13 octets
Manifestation
Explication:
la source
05AB1E ,
181615 octets-2 octets grâce à Riley!
-1 octet grâce à Emigna!
Explication:
Essayez-le en ligne!
la source
¹Ñ¦¨båO
devrait fonctionner au lieu de vérifier chaque sous-chaîne.¼
et¾
parN
.JavaScript (ES6),
969580 octetsUne fonction qui renvoie une fonction récursive qui utilise une fonction récursive qui utilise une fonction récursive. Je commence vraiment à me demander si l'
.toString(2)
itinéraire serait plus court ...Attribuer un exemple variable
f=n=>...
et appel avec une paire supplémentaire de parens,f(9)()
. Si ce n'est pas autorisé (la méta publication est à + 6 / -2), vous pouvez utiliser cette version de 83 octets avec invocation standard:Les deux versions fonctionnent pour tous sauf les trois derniers cas de test. Vous pouvez également essayer ces cas de test en passant
x>>1
à(x-x%2)/2
.la source
Utilitaires Bash + Unix,
8584 octetsEssayez-le en ligne!
Je soulignerai également que m existe toujours pour tout semi-premier n. Voici pourquoi:
Écrivez n = pq, où p et q sont premiers et p <= q.
Soit b le nombre de chiffres dans la représentation binaire de n-1. Alors, pour tout k compris entre 0 et n-1 inclus, p * (2 ^ b) + k en binaire consiste en la représentation binaire de p suivie de b bits supplémentaires représentant k.
Ainsi, les nombres p * (2 ^ b) + k pour 0 <= k <= n-1, lorsqu'ils sont écrits en binaire, commencent tous par la représentation binaire de p. Mais ce sont n nombres consécutifs, donc l'un d'eux doit être un multiple de n.
Il s'ensuit que nous avons un mn multiple de n dont la représentation binaire commence par la représentation binaire de p.
Sur cette base, on peut trouver une limite supérieure pour m de 2 sqrt (n). (On peut probablement obtenir une limite supérieure beaucoup plus serrée que cela.)
la source
Haskell, 161 octets
Vérification simple. Factorisez d'abord, puis recherchez linéairement en commençant à 1 et prenez le minimum de la valeur pour les deux facteurs.
Prend quelques secondes pour le dernier testcase (
1468255967
), lesghci
rapports(15.34 secs, 18,610,214,160 bytes)
sur mon ordinateur portable.la source
Mathematica, 83 octets
la source
Brachylog (2), 14 octets
Essayez-le en ligne!
Il y a plus d'une façon d'écrire ceci en 14 octets dans Brachylog, donc je suis allé pour le plus efficace. Comme il est courant pour les soumissions Brachylog, il s'agit d'une soumission de fonction; son entrée est le semi-premier, sa sortie est le multiplicateur.
Explication
L'ordre d'évaluation de Prolog et Brachylog est défini par la première contrainte qui ne peut pas être immédiatement déduite de l'entrée. Dans ce programme, c'est une contrainte sur le résultat d'une multiplication, donc l'interpréteur visera à garder les opérandes de la multiplication aussi proches que possible de 0. Nous connaissons l'un des opérandes, et l'autre est la sortie, nous trouvons donc la plus petite sortie possible, ce qui est exactement ce que nous voulons.
la source
PowerShell , 136 octets
Essayez-le en ligne!
Très long en raison du fonctionnement de la conversion en binaire dans PowerShell. : - /
Prend entrée
$n
, des boucles à travers2
à$n-1
et tire les facteurs!($n%$_)
. Envoie ceux-ci dans une boucle|%{...}
etconvert
s chacun d'eux dans une2
chaîne binaire (de base ). Stocke ces chaînes binaires dans$a
.Ensuite, nous entrons dans une
for(){...}
boucle infinie . Chaque itération, nous incrémentons++$m
, multiplions celle par$n
etconvert
celle d'une chaîne binaire, stockée dans$b
. Ensuite,if
cette chaîne est regex-like
toutes les chaînes$a
, nous sortons$m
etexit
.la source
Perl 6 , 66 octets
Basé sur des expressions rationnelles.
Super lent, car il force brutalement les facteurs de n à nouveau brutalement à chaque position de correspondance d'expression régulière de chaque nombre qui est essayé.
Le calcul des facteurs une seule fois améliore les performances mais en fait 72 octets:
la source