Учитывая два числа n и m, оцените бесконечную башню власти:
n ^ (n + 1) ^ (n + 2) ^ (n + 3) ^ (n + 4) ^ ... mod m
Имейте в виду, что ^ является правоассоциативным. Так что 2 ^ 3 ^ 4 = 2 ^ (3 ^ 4). Теперь, как вы можете присвоить значение бесконечной последовательности правоассоциативных операторов?
Определите f (n, m, i) как энергетическую башню, содержащую первые i члены бесконечной энергетической башни. Тогда существует некоторая постоянная C такая, что для каждого i> C f (n, m, i) = f (n, m, C). Таким образом, вы можете сказать, что бесконечная энергетическая башня сходится к определенной величине. Мы заинтересованы в этой ценности.
Ваша программа должна быть способна вычислить n = 2017, m = 10 ^ 10 менее чем за 10 секунд на приемлемом современном ПК. То есть, вы должны реализовать реальный алгоритм, без грубого обращения.
Вы можете предположить, что n <2 30 и m <2 50 для числовых пределов в вашем языке программирования, но ваш алгоритм теоретически должен работать для любого размера n , m . Однако ваша программа должна быть корректной для входных данных в этих пределах размера, переполнения промежуточных значений не освобождаются, если входные данные находятся в этих пределах.
Примеры:
2, 10^15
566088170340352
4, 3^20
4
32, 524287
16
источник
n
иm
которые не гарантированы совместно премьера.Ответы:
Pyth, 23 байта
Определяет функцию
g
, принимая m и n в этом порядке.Попробуйте онлайн
Как это устроено
Python 2,
10976 байтПопробуйте онлайн!
Почему это работает
Мы используем следующее обобщение теоремы Эйлера .
Лемма. п 2φ ( м ) ≡ п φ ( м ) ( по модулю т ) для всех п (или нет п взаимно прост с т ).
Доказательство: Для всех простых степеней p k, делящих m ,
Следовательно, n 2φ ( m ) ≡ n φ ( m ) (mod m ).
Следствие. Если k ≥ φ ( m ), то n k ≡ n φ ( m ) + ( k mod φ ( m )) (mod m ).
Доказательство: если k ≥ 2φ ( m ), лемма дает n k = n 2φ ( m ) n k - 2φ ( m ) ≡ n φ ( m ) n k - 2φ ( m ) = n k - φ ( m ) ( mod m ) и повторяем до тех пор, пока показатель степени не станет меньше 2φ ( m ).
источник
sympy.totient
.Haskell , 156 байт
(?)
принимает дваInteger
с и возвращаетInteger
, используйте как(10^10)?2017
(обратный порядок по сравнению с OP.)Попробуйте онлайн! (На этот раз я проверю случаи в заголовке, поскольку они используют обозначение возведения в степень).
Любопытно, что самый медленный тестовый пример - это не тот, у которого ограничение скорости (это почти мгновенно), а
524287 ? 32
тот, потому что он524287
имеет гораздо большее простое число, чем появляется в коэффициентах других тестовых случаев.Как это устроено
(x&m)y
этоx^y `mod` m
, или сила мод, используя возведение в степень путем возведения в квадрат.n#p
это функция Эйлераn
, предполагая, чтоn
не имеет меньших простых факторов, чемp
.m
этоn
со всемиp
факторами разделены из.k
такие факторы, то пациент должен сам получить соответствующий коэффициент(p-1)*p^(k-1)
, который рассчитывается какdiv(n*p-n)(p*m)
.1`max`...
обрабатывает случай, когдаn
фактически не делится наp
, что делает другой аргументmax
равным0
.m?n
использует его, когдаy
он достаточно велик,n^y `mod` m
то же самое, чтоn^(t+(y`mod`t)) `mod` m
и когдаt
находится вm
. (Thet+
необходим для тех главных факторовn
иm
имеет в общем, что все получает развернутые.)источник
Mathematica, 55 байт
Примеры:
источник
Пари / ГП , 59 байт
Попробуйте онлайн!
источник