GolfScript (23 caracteres)
{:^((1${\.**2^?%}+*}:f;
O resultado sentinela para um inverso inexistente é 0
.
Esta é uma aplicação simples do teorema de Euler . , entãox - 1 ≡ x 2 n - 1 - 1xφ ( 2n)≡ 1( mod2n)x- 1≡ x2n - 1- 1( mod2n)
Infelizmente, é um exponencial grande demais para calcular diretamente, portanto, precisamos usar um loop e fazer uma redução modular dentro do loop. A etapa iterativa é e temos uma opção de caso base: ou comx2k- 1= ( x2k - 1- 1)2× xk=1
{1\:^(@{\.**2^?%}+*}:f;
ou k=2
com
{:^((1${\.**2^?%}+*}:f;
Estou trabalhando em outra abordagem, mas o sentinela é mais difícil.
A principal observação é que podemos construir a inversa pouco a pouco: se então , e se é ímpar, temos . (Se você não estiver convencido, verifique os dois casos separadamente). Portanto, podemos começar em qualquer caso base adequado e aplicar a transformação um número adequado de vezes.x y ∈ { 1 , 1 + 2 k - 1 }x y≡ 1( mod2k - 1)x y∈ { 1 , 1 + 2k - 1}( mod2k)xx ( y+ x y- 1 ) ≡ 1( mod2k)y′= ( x + 1 ) y- 1
Como obtemos, por indução0 x ≡ 1( mod20 0)
x ( 1 - ( x + 1 ))nx) ≡1( mod2n)
onde o inverso é a soma de uma sequência geométrica. Eu mostrei a derivação para evitar o efeito coelho do chapéu: dada essa expressão, é fácil ver isso (dado que o valor entre parênteses é um número inteiro, que segue sua derivação como a soma de um número inteiro sequência) o produto à esquerda deve estar na classe de equivalência correta se for par.x + 1
Isso fornece a função de 19 caracteres
{1$)1$?@/~)2@?%}:f;
que fornece respostas corretas para entradas que têm um inverso. No entanto, não é tão simples quando é par. Uma opção potencialmente interessante que encontrei é adicionar em vez de .xx&1
1
{1$.1&+1$?@/~)2@?%}:f;
Isso parece dar valores sentinela de ou , mas ainda não provei isso.0 02n - 1
Dando um passo adiante, podemos garantir um sentinela de para números pares alterando a expressão em :0 01 - ( x + 1 )n1 - 1n
{1$.1&*)1$?@/~)2@?%}:f;
Isso está relacionado à aplicação direta do teorema de Euler para o comprimento do código, mas terá um desempenho pior para grande . Se levarmos os argumentos ao contrário , podemos salvar um personagem e chegar a 22 caracteres :nn x f
{..1&*)2$?\/~)2@?%}:f;