Dados dois números n e m, avalie a torre de poder infinita:
n ^ (n + 1) ^ (n + 2) ^ (n + 3) ^ (n + 4) ^ ... mod m
Lembre-se de que ^ é associativo correto. Então 2 ^ 3 ^ 4 = 2 ^ (3 ^ 4). Agora, como você pode atribuir um valor a uma sequência infinita de operadores associativos à direita?
Defina f (n, m, i) como a torre de força que contém os primeiros termos i da torre de força infinita. Então existe uma constante C tal que, para todo i> C, f (n, m, i) = f (n, m, C). Então, você poderia dizer que a torre de energia infinita converge para um determinado valor. Estamos interessados nesse valor.
Seu programa deve poder calcular n = 2017, m = 10 ^ 10 em menos de 10 segundos em um PC moderno razoável. Ou seja, você deve implementar um algoritmo real, sem força bruta.
Você pode assumir que n <2 30 e m <2 50 para os limites numéricos em sua linguagem de programação, mas seu algoritmo deve teoricamente funcionar para qualquer tamanho n , m . No entanto, seu programa deve estar correto para entradas dentro desses limites de tamanho, excedentes de valores intermediários não serão desculpados se as entradas estiverem dentro desses limites.
Exemplos:
2, 10^15
566088170340352
4, 3^20
4
32, 524287
16
fonte
n
e nãom
é garantido que sejam co-prime.Respostas:
Pitão, 23 bytes
Define uma função
g
, tomando m e n nessa ordem.Experimente online
Como funciona
Python 2,
10976 bytesExperimente online!
Por que funciona
Usamos a seguinte generalização do teorema de Euler .
Lema. n 2φ ( m ) ≡ n φ ( m ) (mod m ) para todos os n (independentemente de n ser coprime para m ).
Prova: Para todas as potências primárias p k dividindo m ,
Portanto, n 2φ ( m ) ≡ n φ ( m ) (mod m ).
Corolário. Se k ≥ φ ( m ), então n k ≡ n φ ( m ) + ( k mod φ ( m) )) (mod m ).
Prova: Se k ≥ 2φ ( m ), o lema fornece n k = n 2φ ( m ) n k - 2φ ( m ) ≡ n φ ( m ) n k - 2φ ( m ) = n k - φ ( m ) ( mod m ) e repetimos até que o expoente seja menor que 2φ ( m ).
fonte
sympy.totient
.Haskell , 156 bytes
(?)
leva dois seInteger
retorna umInteger
, use como(10^10)?2017
(ordem inversa em comparação com OP.)Experimente online! (Coloquei os casos para testar no cabeçalho dessa vez, pois eles usam notação de exponenciação.)
Curiosamente, o caso de teste mais lento não é aquele com limite de velocidade (quase instantâneo), mas o
524287 ? 32
primeiro, porque524287
é um primo muito maior do que aparece nos fatores dos outros casos de teste.Como funciona
(x&m)y
éx^y `mod` m
, ou mod de poder, usando exponenciação ao quadrado.n#p
é a função totiente de Euler den
, assumindon
que não há fatores primos menores quep
.m
están
com todos osp
fatores divididos.k
tais fatores, o próprio paciente deve obter um fator correspondente(p-1)*p^(k-1)
, calculado comodiv(n*p-n)(p*m)
.1`max`...
lida com o caso em quen
não era realmente divisível porp
, o que torna o outro argumentomax
igual a0
.m?n
usa que quandoy
é grande o suficiente,n^y `mod` m
é o mesmo quen^(t+(y`mod`t)) `mod` m
, quandot
é o totiente dem
. (Ot+
necessário para esses fatores primosn
m
Isso e tem em comum, que são maximizados.)fonte
Mathematica, 55 bytes
Exemplos:
fonte
Pari / GP , 59 bytes
Experimente online!
fonte