Biorąc pod uwagę dwie liczby ni am, oceń nieskończoną wieżę mocy:
n ^ (n + 1) ^ (n + 2) ^ (n + 3) ^ (n + 4) ^ ... mod m
Pamiętaj, że ^ ma właściwe skojarzenie. Więc 2 ^ 3 ^ 4 = 2 ^ (3 ^ 4). W jaki sposób możesz przypisać wartość nieskończonej sekwencji operatorów asocjacyjnych?
Zdefiniuj f (n, m, i) jako wieżę mocy zawierającą pierwsze terminy i nieskończonej wieży mocy. Następnie istnieje pewna stała C taka, że dla każdego i> C, f (n, m, i) = f (n, m, C). Można więc powiedzieć, że nieskończona wieża mocy zbiega się na pewnej wartości. Interesuje nas ta wartość.
Twój program musi być w stanie obliczyć n = 2017, m = 10 ^ 10 w mniej niż 10 sekund na rozsądnym nowoczesnym komputerze. Oznacza to, że powinieneś wdrożyć rzeczywisty algorytm, bez brutalnego forsowania.
Możesz założyć, że n <2 30 i m <2 50 dla ograniczeń liczbowych w twoim języku programowania, ale twój algorytm musi teoretycznie działać dla dowolnego rozmiaru n , m . Jednak twój program musi być poprawny dla danych wejściowych w tych granicach wielkości, przepełnienia wartości pośrednich nie są usprawiedliwione, jeśli dane wejściowe mieszczą się w tych granicach.
Przykłady:
2, 10^15
566088170340352
4, 3^20
4
32, 524287
16
źródło
n
im
są nie gwarancją CO-prime.Odpowiedzi:
Pyth, 23 bajty
Określa funkcję
g
, z m i n , w tej kolejności.Wypróbuj online
Jak to działa
Python 2,
10976 bajtówWypróbuj online!
Dlaczego to działa?
Używamy następującego uogólnienia twierdzenia Eulera .
Lemat. n 2φ ( m ) ≡ n φ ( m ) (mod m ) dla wszystkich n (niezależnie od tego, czy n jest coprime na m ).
Dowód: dla wszystkich głównych mocy p k dzielących m ,
Dlatego n 2φ ( m ) ≡ n φ ( m ) (mod m ).
Następstwo. Jeśli k ≥ φ ( m ), to n k ≡ n φ ( m ) + ( k mod φ ( m )) (mod m ).
Dowód: jeśli k ≥ 2φ ( m ), lemat daje n k = n 2φ ( m ) n k - 2φ ( m ) ≡ n φ ( m ) n k - 2φ ( m ) = n k - φ ( m ) ( mod m ) i powtarzamy, aż wykładnik będzie mniejszy niż 2φ ( m ).
źródło
sympy.totient
.Haskell , 156 bajtów
(?)
zajmuje dwaInteger
s i zwraca anInteger
, użyj jako(10^10)?2017
(odwrócona kolejność w porównaniu do OP.)Wypróbuj online! (Tym razem testuję przypadki w nagłówku, ponieważ używają notacji potęgowania).
Co ciekawe, najwolniejszym przypadkiem testowym nie jest ten z ograniczeniem prędkości (to prawie natychmiast), ale ten
524287 ? 32
, ponieważ524287
jest znacznie większą liczbą pierwszą niż wynika to z czynników innych przypadków testowych.Jak to działa
(x&m)y
jestx^y `mod` m
lub modem mocy, wykorzystując potęgowanie przez podniesienie do kwadratu.n#p
jest funkcją całkowitą Euleran
, przy założeniu, żen
nie ma mniejszych czynników pierwszych niżp
.m
jest podzielony nan
wszystkiep
czynniki.k
takie czynniki, suma powinna sama otrzymać odpowiedni współczynnik(p-1)*p^(k-1)
, który jest obliczany jakodiv(n*p-n)(p*m)
.1`max`...
obsługuje przypadek, w którymn
tak naprawdę nie był podzielny, przezp
co drugi argument jestmax
równy0
.m?n
wykorzystuje to, że gdyy
jest wystarczająco duża,n^y `mod` m
jest taka sama jakn^(t+(y`mod`t)) `mod` m
, gdyt
jest sumąm
. (Jestt+
to konieczne dla tych czynników głównychn
im
mają one wspólne, które wszystkie zostają zmaksymalizowane).źródło
Mathematica, 55 bajtów
Przykłady:
źródło
Pari / GP , 59 bajtów
Wypróbuj online!
źródło