GolfScript (23 caracteres)
{:^((1${\.**2^?%}+*}:f;
El resultado centinela para un inverso inexistente es 0
.
Esta es una aplicación simple del teorema de Euler . , entonces x - 1 ≡ x 2 n - 1 - 1xφ(2n)≡1(mod2n)x−1≡x2n−1−1(mod2n)
Desafortunadamente, es un exponencial demasiado grande para calcular directamente, por lo que tenemos que usar un bucle y hacer una reducción modular dentro del bucle. El paso iterativo es y tenemos una opción de caso base: ya sea conx2k−1=(x2k−1−1)2×xk=1
{1\:^(@{\.**2^?%}+*}:f;
o k=2
con
{:^((1${\.**2^?%}+*}:f;
Estoy trabajando en otro enfoque, pero el centinela es más difícil.
La observación clave es que podemos construir el inverso hacia arriba poco a poco: si xy≡1(mod2k−1)xy∈{1,1+2k−1}(mod2k)xx(y+xy−1)≡1(mod2k)y′=(x+1)y−1
0x≡1(mod20)
x(1−(x+1)nx)≡1(mod2n)
x+1 es par.
Eso le da la función de 19 caracteres
{1$)1$?@/~)2@?%}:f;
xx&1
1
{1$.1&+1$?@/~)2@?%}:f;
02n−1 , pero aún no lo he probado.
01−(x+1)n1−1n
{1$.1&*)1$?@/~)2@?%}:f;
nn x f
{..1&*)2$?\/~)2@?%}:f;