Saatin yarısı nedir?


25

Odamda, bu geeky saat var (tam boy için tıklayın):

görüntü tanımını buraya girin

Bunların çoğunu anlamak zor değil, ancak 4-o-saatli olanı özellikle zor:

İki negatif bir modulo yedi gücüne

Normalde, 1/2 gibi bir fraksiyon modüler aritmetikte anlamsızdır, çünkü sadece tamsayılar söz konusudur. Doğru bir şekilde, daha sonra, bu görmek için ters 2 ya da başka bir şekilde koymak, negatif olanın gücüne ikisayı olduğu xyerde iki kere x bire eşittir. Bu şekilde koymak, bir anın düşüncesi bunu ortaya çıkaracaktır x dörde eşittirçünkü iki x eşittir iki çarpı dört eşittir sekiz, ki bu bir modulo yedi.

Bununla birlikte, basitçe çarpımsal tersi bulmak zor bir görevdir. Öyleyse, üstelik ya da başka bir deyişle, 2'nin modüler logaritmasını ya da ayrık logaritmasını bulmanın zorluğunu artıralım. Bu durumda, 3, 7'ye göre 2'nin modüler logaritmasıdır. arka plan, bu 2 modulo n'nin çarpım sırasını hesaplamak anlamına gelir.

Meydan okuma

Pozitif Verilen garip tamsayı nçıkışı en küçük pozitif tam sayı, 1'den büyük xnerede görüntü tanımını buraya girin.

Örnekler

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ʀɪᴇɴ: Bu sadece ikili.
El'endia Starman,

2
Grafiksel girdi!
Conor O'Brien,

6
x^-1x'in çarpımsal tersi anlamına gelir , yani y sayısı , xy = 1 olur . Gerçek sayılar alanında, 2 ^ -1 = 0.5 . Tamsayı halkasında modulo 7 , 2 ^ -1 = 4 .
Dennis,

4
Modüler aritmetik gariptir.
SuperJedi224

3
SuperJedi224 Modüler aritmetik @ olduğunu garip ve henüz muhtemelen farkında olmadan günde bir kez en az bunu. 12 saat kullanıyorsanız ve birileri sizden iki saat içinde aramanızı istiyorsa, saat 11:00 ve onları saat 1: 00'de aramaya karar verirseniz, sadece modüler aritmetik yaptınız. Bu saatteki sayılardan birinin bazen "saat aritmetiği" denilen bir şekilde ifade edildiğini düzenli buluyorum.
Todd Wilcox

Yanıtlar:


17

Jöle , 6 bayt

R2*%i1

Çevrimiçi deneyin!

Nasıl çalışır

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 bayt

f!t.^2TQ

Test Takımı .

fvarsayılandan 1 olana kadar bazı x'leri bulur, öyle ki 2 ile modüler üstelleşme ve giriş 1 ile eşittir.


11

Python, 32 bayt

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

2 ile başlayarak, sonuç 1 olana kadar modulo'yu iki katına çıkarın, her seferinde art arda yükselir ve 2'nin başlangıç ​​değeri için 1 sayısıyla biter.


8

Mathematica, 24 bayt

2~MultiplicativeOrder~#&

Sadece bunun için bir yerleşik kullandım.


20
Tabii ki Mathematica'nın bunun için bir yeri var. : P
El'endia Starman

7
Of El'endiaStarman @ tabii Mathematica bir ungolfable yerleşik bunun için vardır. : - {D
wizzwizz4

7

APL, 8 bayt

1⍳⍨⊢|2*⍳

Bu, sağdaki bir tamsayıyı kabul eden ve bir tamsayı döndüren tek yönlü bir fonksiyon trenidir. Aramak için değişkene atayın.

Açıklama (girişi arayarak 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

Üstelin yuvarlanmasından dolayı sonucun büyük girdiler için yanlış olabileceğini unutmayın.


1
Ayrıca 8: ⍴∘∪⊢|2*⍳.
lirtosiast

6

Pyth, 14 bayt

VQIq%^2hNQ1hNB

Açıklama:

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

Burada dene


66\n132\n198Bir giriş için alıyorum 201.
El'endia Starman

@ El'endiaStarman üzgünüm, yanlış bağlantı: p
Adnan

Oh, haha, şimdi güzel. :)
El'endia Starman

5

JavaScript (ES6), 28 bayt

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

@ Xnor'ın mükemmel özyinelemeli yaklaşımına dayanır.


Bunu test edebileceğim bir bağlantın var mı? Konsolda Chrome'da çalışmıyor gibi görünüyor. ( =>Sanırım SyntaxError sanırım.)
El'endia Starman

@ El'endiaStarman Buyrun. .
Conor O'Brien,

@ CᴏɴᴏʀO'Bʀɪᴇɴ: Nasıl test edeceğimi bilemiyorum.
El'endia Starman,

@ El'endiaStarman Bu kod, çağrılabilecek bir fonksiyon tanımlamıştır f(3). Aptalca bir nedenden dolayı, bu web sitesi, letveya ile bildirmediğiniz sürece bu işlevi kullanmanıza izin vermez var. Bunu dene.
ETHProductions

1
@Pavlo Lambdasların kabul edildiğini biliyorum, fakat bu fonksiyonun ismini vermesi gerekiyor, böylece kendini arayabilir. Bilgisayarıma geri döndüğümde bir test paketi bağlantısı ekleyeceğim.
ETHProductions

5

05AB1E , 11 bayt

Kod:

DUG2NmX%iNq

Açıklama:

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 bayt

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

- Bu basit 2.^(1:n)%nkümesi içindeki 2'nin katlarını bulur olduğu union, ancak görevi gören uniqueher benzersiz gücün tek ve biricik döner (ve bir infix operatörü, çünkü ben 1'den birlik üzerinden bir bayt kaydetmek için olabilir ∪(2.^(1:n)%n)yaklaşımı). Öyleyse endof, benzersiz güçlerin sayısını sayar, çünkü 1'e ulaştığında, sadece mevcut güçleri tekrar eder, bu nedenle 1'i üreten güç kadar benzersiz değerler olacaktır.


5

Cidden, 14 bayt

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

Hex Dump:

312c3bbb5260d3bd4025604da175

Çevrimiçi Deneyin

Açıklama:

 ,;╗           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 bayt

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

Çevrimiçi deneyin!

Japt "bu koşula uyan ilk öğeyi bul" işlevine sahip olsaydı bu üç bayt daha kısa olurdu. Biri üzerinde çalışmaya başlar

Nasıl çalışır

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 bayt

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

Bu bir tamsayıyı kabul eden ve bir tamsayı döndüren bir lambda işlevidir. Aramak için değişkene atayın.

Her tamsayı gücüne 1'den 1'e yükseltilmiş bir dizi oluşturduk n, sonra bu dizideki ilk 1'in dizinini bulduk.

Glen O sayesinde 7 byte kurtarıldı!


Harita komutuna gerek yok, sadece kullanın 2.^(1:n)%n.
Glen O

@GlenO Bu mükemmel çalışıyor, teşekkürler!
Alex A.


2

MATL , 13 bayt

it:Hw^w\1=f1)

Derleyicinin mevcut GitHub taahhüdü ile Octave üzerinde çalışır .

Giriş için çalışır 51( doubleveri tipinin sınırlamaları nedeniyle ).

Örnek

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

açıklama

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

Unicorn , 1307 1062 976 bayt

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

Unicorn'u ciddi bir golf dili yapmaya çalışıyorum ama bu biraz zor ...

Umarım çok daha az bayt yaparken dilin "tekboynuzluğunu" korumanın bir yolunu bulurum


Resim:

görüntü tanımını buraya girin

Bir özel kullanır kodlama .

Bu cevap rakip değil çünkü bu dilden sonra yapılmış bir Unicorn sürümünü kullanıyor.


3
Gökkuşağı ve tek boynuzlu atlar bununla güçlü ...
Mama Fun Roll

Biri UnicornRLE ile geldi
Sebi

((2)2(2))(())@ Downgoat'ın tercümanı ile koddan çıkan tek kişi ben miyim ?
Rɪᴋᴇʀ

2

11, 11 karakter / 22 bayt

↻2ⁿḁ%ï>1)⧺ḁ

Try it here (Firefox only).

Bir süre döngüsü kullanır. Bu, birkaç zamandan biri iken, döngü bir aralıkta eşlemekten daha iyidir.

açıklama

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

1

CJam, 15 bayt

2qi,:)f#_,f%1#)

Peter Taylor bir bayt kaydetti. Temiz!


Yerine 1fe|yapabildin :)ve sonra )yaptıktan sonra #.
Peter Taylor

2qi,:)f#_,f%1#)
Peter Taylor

Ohh, elbette. Teşekkür ederim.
Lynn

0

Prolog, 55 bayt

Kod:

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

Açıklaması:

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

Örnek:

p(195).
12

Burada çevrimiçi deneyin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.