Cosa c'è di mezzo all'orologio?


25

Nella mia stanza, ho questo orologio geek (clicca per ingrandirlo):

inserisci qui la descrizione dell'immagine

Molti di questi non sono difficili da capire, ma quello per le 4 in punto è particolarmente complicato:

due alla potenza del negativo uno modulo sette

Normalmente, una frazione come 1/2 non ha senso nell'aritmetica modulare poiché sono coinvolti solo numeri interi. Il modo corretto, quindi, è di vedere questo come l' inverso di 2, o per dirla in altro modo, due al potere di uno negativoè quel numero Xdove due volte x è uguale a uno. Detto in questo modo, un momento di pensiero lo rivelerà x è uguale a quattroperché due x è uguale a due volte quattro è uguale a otto, che equivale a un modulo sette.

Tuttavia, semplicemente trovare l' inverso moltiplicativo sarebbe troppo facile come una sfida. Quindi aumentiamo la difficoltà di esponenziazione, o in altre parole, di trovare il logaritmo modulare o il logaritmo discreto di 2. In questo caso, 3 è il logaritmo modulare di 2 rispetto a 7. Per quelli di voi con teoria dei numeri / algebra astratta sullo sfondo, questo significa calcolare l'ordine moltiplicativo di 2 modulo n.

La sfida

Dato un intero dispari positivo nmaggiore di 1, genera il numero intero positivo più piccolo xdove inserisci qui la descrizione dell'immagine.

Esempi

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 

3
@ CᴏɴᴏʀO'Bʀɪᴇɴ: è solo binario.
El'endia Starman il

2
Input grafico!
Conor O'Brien,

6
x^-1significa inverso moltiplicativo di x , cioè il numero y tale che xy = 1 . Nel campo dei numeri reali, 2 ^ -1 = 0,5 . Nell'anello di numeri interi modulo 7 , 2 ^ -1 = 4 .
Dennis

4
L'aritmetica modulare è strana.
SuperJedi224,

3
@ SuperJedi224 L'aritmetica modulare è strana, eppure probabilmente lo fai almeno una volta al giorno senza accorgertene. Se usi 12 ore di tempo e qualcuno ti chiede di chiamarle tra due ore, sono le 11:00 e decidi di chiamarle all'una di notte, hai appena fatto l'aritmetica modulare. Trovo pulito che uno dei numeri su questo orologio sia espresso in un modo che a volte viene chiamato "aritmetica dell'orologio".
Todd Wilcox

Risposte:


17

Gelatina , 6 byte

R2*%i1

Provalo online!

Come funziona

R2*%i1  Input: n

R       Range; yield [1, ..., n].
 2*     Compute [2**1, ..., 2**n].
   %    Hook; take all powers modulo n.
    i1  Get the index of the first 1.
        Indices are 1-based, so index k corresponds to the natural number k.

13

Pyth - 9 8 byte

f!t.^2TQ

Test Suite .

fesegue il default di 1 fino a quando non trova alcuni x tale esponenziale modulare con 2 e l'ingresso è uguale a 1.


11

Python, 32 byte

f=lambda n,t=2:t<2or-~f(n,2*t%n)

A partire da 2, raddoppia modulo n fino a quando il risultato è 1, incrementando in modo ricorsivo ogni volta e terminando con un conteggio di 1 per il valore iniziale di 2.


8

Mathematica, 24 byte

2~MultiplicativeOrder~#&

Ho appena usato un built-in per questo.


20
Di Naturalmente Mathematica ha un built-in per questo. : P
El'endia Starman,

7
@ El'endiaStarman Certo , Mathematica ha un inconfondibile per questo. : - {D
wizzwizz4,

7

APL, 8 byte

1⍳⍨⊢|2*⍳

Questo è un treno di funzioni monadico che accetta un numero intero sulla destra e restituisce un numero intero. Per chiamarlo, assegnarlo a una variabile.

Spiegazione (chiamando l'input x):

      2*⍳    ⍝ Compute 2^i for each i from 1 to x
   ⊢|        ⍝ Get each element of the resulting array modulo x
1⍳⍨          ⍝ Find the index of the first 1 in this array

Si noti che il risultato potrebbe non essere corretto per input di grandi dimensioni poiché l'esponenziale viene arrotondato.


1
Anche 8: ⍴∘∪⊢|2*⍳.
lirtosiast,

6

Pyth, 14 byte

VQIq%^2hNQ1hNB

Spiegazione:

VQIq%^2hNQ1hNB

                # Implicit, Q = input
VQ              # For N in range(0, Q)
  Iq      1     # If equals 1
    %^2hNQ      # 2^(N + 1) % Q
           hN   # Print (N + 1)
             B  # Break

Provalo qui


Ricevo 66\n132\n198un input di 201.
El'endia Starman,

@ El'endiaStarman scusa, link errato: p
Adnan,

Oh, ahah, adesso va bene. :)
El'endia Starman,

5

JavaScript (ES6), 28 byte

f=(n,t=2)=>t<2||-~f(n,2*t%n)

Basato sul brillante approccio ricorsivo di @xnor.


Hai un link a cui posso provarlo? Non sembra funzionare nella console su Chrome. ( =>
Sintassi Errore

@ El'endiaStarman Ecco a te. .
Conor O'Brien,

@ CᴏɴᴏʀO'Bʀɪᴇɴ: non riesco a capire come testarlo.
El'endia Starman,

@ El'endiaStarman Questo codice ha definito una funzione che può essere chiamata come f(3). Per qualche stupida ragione, quel sito web non ti permetterà di usare questa funzione se non la dichiari con leto var. Prova questo.
Produzioni ETH il

1
@Pavlo So che i lambda sono accettati, ma questa funzione deve essere denominata in modo che possa chiamarsi. Aggiungerò un link alla suite di test quando torno sul mio computer.
Produzioni ETH il

5

05AB1E , 11 byte

Codice:

DUG2NmX%iNq

Spiegazione:

DUG2NmX%iNq

D            # Duplicates the stack, or input when empty
 U           # Assign X to last item of the stack
  G          # For N in range(1, input)
   2Nm       # Calculates 2 ** N
      X      # Pushes X
       %     # Calculates the modulo of the last two items in the stack
        i    # If equals 1 or true, do { Nq }
         N   # Pushes N on top of the stack
          q  # Terminates the program
             # Implicit, nothing has printed, so we print the last item in the stack

5

Julia, 25 24 byte

n->endof(1∪2.^(1:n)%n)

Questo è semplice: 2.^(1:n)%ntrova i poteri di 2 all'interno dell'insieme, è union, ma serve come uniquee restituisce solo uno di ciascun potere unico (e poiché è un operatore infisso, posso unire 1 per salvare un byte ∪(2.^(1:n)%n)sull'approccio). Quindi endofconta il numero di poteri unici, perché una volta che colpisce 1, ripeterà solo i poteri esistenti, quindi ci saranno tanti valori univoci quanti il ​​potere che produce 1.


5

Scherzi a parte, 14 byte

1,;╗R`╙╜@%`Míu

Dump esadecimale:

312c3bbb5260d3bd4025604da175

Provalo online

Spiegazione:

 ,;╗           Make 2 copies of input, put 1 in reg0
    R          push [0,1,...,n-1]
     `    `M   map the quoted function over the range
      ╙        do 2^n
       ╜@%     modulo the value in reg0
1           íu Find the 1-index of 1 in the list.


2

Japt, 17 byte

1oU f@2pX %U¥1} g

Provalo online!

Questo sarebbe più corto di tre byte se Japt avesse una funzione "trova il primo elemento che corrisponde a questa condizione". Inizia a lavorare su uno

Come funziona

1oU f@2pX %U¥1} g   // Implicit: U = input number
1oU                 // Generate a range of numbers from 1 to U.
                    // "Uo" is one byte shorter, but the result would always be 0.
    f@        }     // Filter: keep only the items X that satisfy this condition:
      2pX %U¥1      //  2 to the power of X, mod U, is equal to 1.
                g   // Get the first item in the resulting list.
                    // Implicit: output last expression


2

Julia, 33 26 byte

n->findfirst(2.^(1:n)%n,1)

Questa è una funzione lambda che accetta un numero intero e restituisce un numero intero. Per chiamarlo, assegnarlo a una variabile.

Costruiamo un array come 2 elevato a ogni potenza intera da 1 a n, quindi troviamo l'indice del primo 1 in questo array.

Risparmiato 7 byte grazie a Glen O!


Non è necessario il comando map, basta usare 2.^(1:n)%n.
Glen O

@GlenO Funziona perfettamente, grazie!
Alex A.


2

MATL , 13 byte

it:Hw^w\1=f1)

Funziona su Octave con l' attuale commit GitHub del compilatore.

Funziona per input fino a 51(a causa delle limitazioni deldouble tipo di dati).

Esempio

>> matl it:Hw^w\1=f1)
> 17
8

Spiegazione

i             % input, "N"
t:            % vector from 1 to N
Hw^           % 2 raised to that vector, element-wise
w\            % modulo N
1=            % true if it equals 1, element-wise
f1)           % index of first "true" value

2

Unicorno , 1307 1062 976 byte

( ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ 🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄 ( 🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈 🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄 2 ) 🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄 🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈 ✨✨✨✨✨✨✨✨✨✨ 2 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈 🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤 ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ ( 🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈 2 ✨✨✨✨✨✨✨ 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈 🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄 🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐🐐 ) ) ( 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈 ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ 🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤🌤 🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄🦄 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈 ( ) )

Sto tentando di rendere l'unicorno un linguaggio golfistico serio ma è un po 'difficile ...

Spero di trovare un modo per conservare l '"unicorno" della lingua facendo molti meno byte


Immagine:

inserisci qui la descrizione dell'immagine

Utilizza una codifica personalizzata .

Questa risposta non è competitiva perché utilizza una versione di Unicorn realizzata in questa lingua


3
Gli arcobaleni e gli unicorni sono forti con questo ...
Mama Fun Roll

Qualcuno esce con UnicornRLE
Sebi il

Sono l'unico ad ((2)2(2))(())uscire dal codice con l'interprete di @ Downgoat?
Rɪᴋᴇʀ

2

𝔼𝕊𝕄𝕚𝕟, 11 caratteri / 22 byte

↻2ⁿḁ%ï>1)⧺ḁ

Try it here (Firefox only).

Utilizza un ciclo while. Questa è una delle poche volte in cui un ciclo while è meglio che mappare su un intervallo.

Spiegazione

          // implicit: ï = input, ḁ = 1
↻2ⁿḁ%ï>1) // while 2 to the power of ḁ mod input is greater than 1
  ⧺ḁ      // increment ḁ
          // implicit output


0

Prolog, 55 byte

Codice:

N*X:-powm(2,X,N)=:=1,write(X);Z is X+1,N*Z.
p(N):-N*1.

Ha spiegato:

N*X:-powm(2,X,N)=:=1, % IF 2^X mod N == 1
     write(X)         % Print X
     ;Z is X+1,       % ELSE increase exponent X
     N*Z.             % Recurse
p(N):-N*1.            % Start testing with 2^1

Esempio:

p(195).
12

Provalo online qui

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.