Bei zwei positiven Zahlen x
und n
mitx<2^n
Schreiben Sie bei die kürzestmögliche zu berechnende Funktion x^-1 mod 2^n
. Mit anderen Worten, finde y
so etwas x*y=1 mod 2^n
.
Ihre Funktion muss mindestens in einer angemessenen Zeit abgeschlossen sein n=64
, damit eine umfassende Suche nicht funktioniert.
Wenn die Umkehrung nicht existiert, müssen Sie dies dem Aufrufer irgendwie anzeigen (eine Ausnahme auslösen, einen Sentinel-Wert zurückgeben usw.).
Wenn Sie sich fragen, wo Sie anfangen sollen, probieren Sie den erweiterten euklidischen Algorithmus .
Antworten:
Python
9589c
ist deine Funktion. Gibt 0 zurück, wenn es keine Inverse gibt (dh wenn x gerade ist).quelle
Python, 29 Bytes
Dies gibt 0 für gerade x zurück . Es verwendet den Satz von Euler mit der Beobachtung, dass 2 ^ n - 1 durch 2 ^ ( n - 1) - 1 durch die in Python eingebaute schnelle modulare Exponentiation teilbar ist. Dies ist schnell genug für n bis zu 7000 oder so, wo es mehr als eine Sekunde dauert.
quelle
Mathematica - 22
f[x,n]
kehrty
mitx*y=1 mod 2^n
, sonstx is not invertible modulo 2^n
quelle
GolfScript (23 Zeichen)
Das Sentinel-Ergebnis für eine nicht vorhandene Inverse ist
0
.Dies ist eine einfache Anwendung des Satzes von Euler . , also x - 1 ≤ x 2 n - 1 - 1xφ ( 2n)≡ 1( mod2n) x−1≡x2n−1−1(mod2n)
Leider ist das eine zu große Exponentialgröße, um sie direkt berechnen zu können. Daher müssen wir eine Schleife verwenden und innerhalb der Schleife eine modulare Reduktion durchführen. Der iterative Schritt ist und wir haben die Wahl des Basisfalls: entweder mitx2k−1=(x2k−1−1)2×x
k=1
oder
k=2
mitIch arbeite an einem anderen Ansatz, aber der Sentinel ist schwieriger.
Die Schlüsselbeobachtung ist, dass wir die Inverse Stück für Stück aufbauen können: wennxy≡1(mod2k−1) xy∈{1,1+2k−1}(mod2k) x x(y+xy−1)≡1(mod2k) y′= ( x+1)y-1
Das gibt die 19-Zeichen-Funktion
x&1
1
n x f
quelle
Ruby - 88 Zeichen
Nutzen Sie die Funktion
f
.Einfach die rekursive Funktion von der verknüpften Wiki-Seite gibt bei einem Fehler 0 zurück.
quelle
(e=->a,b{...})[x,2**n][0]
. Kann auch ein Zeichen durch Testena%b<1
statt speicherna%b==0
.Haskell, 42 Bytes
Mit einem Algorithmus, der auf dem Lemma von Hensel basiert und die Anzahl der Stellen in jeder Iteration verdoppelt, läuft dies in weniger als einer Sekunde für n bis zu 30 Millionen !
quelle
Pyth , 9 Bytes
Probieren Sie es hier aus!
Nimmt die Eingabe in umgekehrter Reihenfolge vor. Oder 9 Bytes zu:
.^EtK^2QK
.Erläuterung
quelle
GAP, 39 Bytes
f(x,n)
Gibt die Umkehrung vonx
Modulo zurück2^n
und gibt eine Fehlermeldung auswenn keine Inverse existiert.
quelle