Berechnen Sie mit zwei Zahlen n und m den unendlichen Machtturm:
n ^ (n + 1) ^ (n + 2) ^ (n + 3) ^ (n + 4) ^ ... mod m
Denken Sie daran, dass ^ rechtsassoziativ ist. Also 2 ^ 3 ^ 4 = 2 ^ (3 ^ 4). Wie kann man nun einer unendlichen Folge von rechtsassoziativen Operatoren einen Wert zuweisen?
Definiere f (n, m, i) als den Kraftturm, der die ersten i Terme des unendlichen Kraftturms enthält. Dann gibt es eine solche Konstante C, dass für jedes i> C f (n, m, i) = f (n, m, C) ist. Man könnte also sagen, dass der unendliche Kraftturm sich einem bestimmten Wert annähert. Dieser Wert interessiert uns.
Ihr Programm muss in der Lage sein, n = 2017, m = 10 ^ 10 in weniger als 10 Sekunden auf einem vernünftigen modernen PC zu berechnen. Das heißt, Sie sollten einen tatsächlichen Algorithmus implementieren, kein Bruteforcing.
Sie können annehmen, dass n <2 30 und m <2 50 für die numerischen Grenzen in Ihrer Programmiersprache sind, aber Ihr Algorithmus muss theoretisch für jede Größe von n , m funktionieren . Ihr Programm muss jedoch für Eingaben innerhalb dieser Größengrenzen korrekt sein. Zwischenwertüberläufe werden nicht entschuldigt, wenn die Eingaben innerhalb dieser Grenzen liegen.
Beispiele:
2, 10^15
566088170340352
4, 3^20
4
32, 524287
16
quelle
n
undm
ist nicht als Co-Prime garantiert.Antworten:
Pyth, 23 Bytes
Definiert eine Funktion
g
, wobei m und n in dieser Reihenfolge verwendet werden.Probieren Sie es online aus
Wie es funktioniert
Python 2,
10976 BytesProbieren Sie es online!
Warum es funktioniert
Wir verwenden die folgende Verallgemeinerung des Satzes von Euler .
Lemma. n 2φ ( m ) ≡ n φ ( m ) (mod m ) für alle n (ob oder ob nicht n ist coprime bis m ).
Beweis: Für alle Primkräfte p k dividiert m ,
Daher n 2φ ( m ) ≡ n φ ( m ) (mod m ).
Logische Folge. Wenn k ≥ φ ( m ) ist, dann ist n k ≤ n φ ( m ) + ( k mod φ ( m )) (mod m ).
Beweis: Wenn k ≥ 2φ ( m ), das Lemma gibt n k = n 2φ ( m ) n k - 2φ ( m ) ≡ n φ ( m ) n k - 2φ ( m ) = n k - φ ( m ) ( mod m ) und wir wiederholen, bis der Exponent kleiner als 2φ ( m ) ist.
quelle
sympy.totient
.Haskell , 156 Bytes
(?)
Nimmt zweiInteger
s und gibt einInteger
, use as zurück(10^10)?2017
(umgekehrte Reihenfolge im Vergleich zu OP.)Probieren Sie es online! (Diesmal habe ich die zu testenden Fälle in den Header eingefügt, da sie die Exponentiationsnotation verwenden.)
Seltsamerweise ist der langsamste Testfall nicht der mit einem Tempolimit (das ist fast augenblicklich), sondern der mit
524287 ? 32
einer524287
viel größeren Primzahl als in den Faktoren der anderen Testfälle.Wie es funktioniert
(x&m)y
istx^y `mod` m
, oder Power Mod, die Potenzierung durch Quadrieren.n#p
ist die Euler-Totientenfunktion vonn
, vorausgesetzt esn
gibt keine kleineren Primfaktoren alsp
.m
istn
mit allenp
Faktoren aufgeteilt.k
solche Faktoren gibt, sollte der Totient selbst einen entsprechenden Faktor erhalten(p-1)*p^(k-1)
, der berechnet wird alsdiv(n*p-n)(p*m)
.1`max`...
behandelt den Fall, won
eigentlich nicht teilbar warp
, was das andere Argumentmax
gleich macht0
.m?n
verwendet, dass, wenny
groß genugn^y `mod` m
ist, dasselbe wien^(t+(y`mod`t)) `mod` m
, wennt
der Totient von istm
. (Diet+
wird für diese Primfaktoren benötigtn
undm
haben Gemeinsamkeiten, die alle maximiert werden.)quelle
Mathematica, 55 Bytes
Beispiele:
quelle
Pari / GP , 59 Bytes
Probieren Sie es online!
quelle