GolfScript (23 символа)
{:^((1${\.**2^?%}+*}:f;
Часовой результат для несуществующего обратного равен 0
.
Это простое применение теоремы Эйлера . , поэтому x - 1 ≡ x 2 n - 1 - 1xφ(2n)≡1(mod2n)x−1≡x2n−1−1(mod2n)
К сожалению, это слишком большая экспонента, чтобы вычислять напрямую, поэтому мы должны использовать цикл и выполнять модульное сокращение внутри цикла. Итерационный шаг и у нас есть выбор базового случая: либо сx2k−1=(x2k−1−1)2×xk=1
{1\:^(@{\.**2^?%}+*}:f;
или k=2
с
{:^((1${\.**2^?%}+*}:f;
Я работаю над другим подходом, но стражу сложнее.
Ключевое наблюдение заключается в том, что мы можем построить обратный шаг за шагом: если 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
Это дает функцию 19 символов
{1$)1$?@/~)2@?%}:f;
xx&1
1
{1$.1&+1$?@/~)2@?%}:f;
02n−1
01−(x+1)n1−1n
{1$.1&*)1$?@/~)2@?%}:f;
nn x f
{..1&*)2$?\/~)2@?%}:f;