Dans ma chambre, j'ai cette horloge geek (cliquez pour agrandir):
La plupart d'entre eux ne sont pas difficiles à comprendre, mais celui pour 4 heures est particulièrement délicat:
Normalement, une fraction comme 1/2 n'a pas de sens en arithmétique modulaire car seuls les entiers sont impliqués. La bonne façon, alors, est de voir cela comme l' inverse de 2, ou pour le dire autrement, c'est le nombre où . En d'autres termes, une pensée d'un moment révélera cela parce que .
Cependant, trouver simplement l' inverse multiplicatif serait beaucoup trop facile comme défi. Donc, augmentons la difficulté de l'exponentiation, ou en d'autres termes, trouver le logarithme modulaire ou logarithme discret de 2. Dans ce cas, 3 est le logarithme modulaire de 2 par rapport à 7. Pour ceux d'entre vous qui ont la théorie des nombres / l'algèbre abstraite fond, cela signifie calculer l'ordre multiplicatif de 2 modulo n.
Le défi
Étant donné un entier impair positif n
supérieur à 1, affichez le plus petit entier positif x
où .
Exemples
n x
3 2
5 4
7 3
9 6
11 10
13 12
15 4
17 8
19 18
21 6
23 11
25 20
27 18
29 28
31 5
33 10
35 12
37 36
39 12
41 20
43 14
45 12
47 23
49 21
51 8
53 52
55 20
57 18
59 58
61 60
63 6
65 12
67 66
69 22
71 35
73 9
75 20
77 30
79 39
81 54
83 82
85 8
87 28
89 11
91 12
93 10
95 36
97 48
99 30
101 100
103 51
105 12
107 106
109 36
111 36
113 28
115 44
117 12
119 24
121 110
123 20
125 100
127 7
129 14
131 130
133 18
135 36
137 68
139 138
141 46
143 60
145 28
147 42
149 148
151 15
153 24
155 20
157 52
159 52
161 33
163 162
165 20
167 83
169 156
171 18
173 172
175 60
177 58
179 178
181 180
183 60
185 36
187 40
189 18
191 95
193 96
195 12
197 196
199 99
201 66
la source
x^-1
signifie l'inverse multiplicatif de x , c'est-à-dire le nombre y tel que xy = 1 . Dans le domaine des nombres réels, 2 ^ -1 = 0,5 . Dans l'anneau des entiers modulo 7 , 2 ^ -1 = 4 .Réponses:
Gelée , 6 octets
Essayez-le en ligne!
Comment ça marche
la source
Pyth -
98 octetsSuite de tests .
f
iltre par défaut de 1 jusqu'à ce qu'il trouve un certain x tel que l'exponentiation modulaire avec 2 et l'entrée est égale à 1.la source
Python, 32 octets
Commençant par 2, double modulo n jusqu'à ce que le résultat soit 1, incrémentant récursivement à chaque fois, et se terminant par un compte de 1 pour la valeur initiale de 2.
la source
Mathematica, 24 octets
Je viens d'utiliser un intégré pour cela.
la source
APL, 8 octets
Il s'agit d'un train de fonctions monadique qui accepte un entier à droite et renvoie un entier. Pour l'appeler, affectez-le à une variable.
Explication (appel de l'entrée
x
):Notez que le résultat peut être incorrect pour les grandes entrées car l'exponentielle est arrondie.
la source
⍴∘∪⊢|2*⍳
.Pyth, 14 octets
Explication:
Essayez-le ici
la source
66\n132\n198
pour une entrée de201
.JavaScript (ES6), 28 octets
Basé sur la brillante approche récursive de @ xnor.
la source
=>
, je pense.)f(3)
. Pour une raison stupide, ce site Web ne vous permettra pas d'utiliser cette fonction sauf si vous la déclarez aveclet
ouvar
. Essaye ça.05AB1E , 11 octets
Code:
Explication:
la source
Julia,
2524 octetsC'est simple -
2.^(1:n)%n
trouve les puissances de 2 dans l'ensemble,∪
estunion
, mais ne sertunique
et ne renvoie qu'une seule de chaque puissance unique (et parce que c'est un opérateur d'infixe, je peux l'union avec 1 pour économiser un octet sur l'∪(2.^(1:n)%n)
approche). ensuiteendof
Compte le nombre de pouvoirs uniques, car une fois qu'il atteint 1, il ne fera que répéter les pouvoirs existants, il y aura donc autant de valeurs uniques que la puissance qui produit 1.la source
Sérieusement, 14 octets
Vidage hexadécimal:
Essayez-le en ligne
Explication:
la source
Haskell, 30 octets
L'argument d'aide
t
est doublé modulo àn
chaque étape jusqu'à ce qu'il soit égal à 1.la source
Japt, 17 octets
Essayez-le en ligne!
Ce serait trois octets plus court si Japt avait une fonction "trouver le premier élément qui correspond à cette condition". Commence à travailler sur un
Comment ça marche
la source
PARI / GP, 20 octets
la source
Julia,
3326 octetsIl s'agit d'une fonction lambda qui accepte un entier et renvoie un entier. Pour l'appeler, affectez-le à une variable.
Nous construisons un tableau comme 2 élevé à chaque puissance entière de 1 à
n
, puis nous trouvons l'indice du premier 1 dans ce tableau.7 octets enregistrés grâce à Glen O!
la source
2.^(1:n)%n
.Perl 5, 29 octets
Pointe de chapeau.
la source
MATL , 13 octets
Fonctionne sur Octave avec la validation GitHub actuelle du compilateur.
Fonctionne pour la saisie jusqu'à
51
(en raison des limitations dudouble
type de données).Exemple
Explication
la source
Licorne ,
1307 1062976 octetsJ'essaie de faire de la licorne un langage de golf sérieux mais c'est un peu difficile ...
J'espère que je trouverai un moyen de conserver la "licorne" de la langue tout en faisant beaucoup moins d'octets
Image:
Utilise une coutume encodage .
Cette réponse n'est pas concurrente car elle utilise une version de Unicorn faite après cette langue
la source
((2)2(2))(())
sortir du code avec l'interprète de @ Downgoat?𝔼𝕊𝕄𝕚𝕟, 11 caractères / 22 octets
Try it here (Firefox only).
Utilise une boucle while. C'est l'une des rares fois qu'une boucle while est meilleure que le mappage sur une plage.
Explication
la source
CJam, 15 octets
Peter Taylor a enregistré un octet. Soigné!
la source
1fe|
vous ne pouviez:)
et)
après avoir fait le#
.2qi,:)f#_,f%1#)
Prolog, 55 octets
Code:
Expliqué:
Exemple:
Essayez-le en ligne ici
la source