Учитывая два положительных числа x
и n
с x<2^n
, напишите кратчайшую возможную функцию для вычисления x^-1 mod 2^n
. Другими словами, найти y
такое, что x*y=1 mod 2^n
.
Ваша функция должна быть выполнена в разумные сроки, по крайней мере n=64
, поэтому исчерпывающий поиск не будет работать.
Если обратного не существует, вы должны как-то указать это вызывающей стороне (сгенерировать исключение, вернуть значение часового и т. Д.).
Если вам интересно, с чего начать, попробуйте расширенный евклидов алгоритм .
Ответы:
Python
9589c
это ваша функция. Возвращает 0, если обратного нет (т. Е. Когда x четно).источник
Python, 29 байт
Это возвращает 0 для четного х . Он использует теорему Эйлера с наблюдением, что 2 ^ n - 1 делится на 2 ^ ( n - 1) - 1 через встроенное быстрое модульное возведение в степень Python. Это достаточно быстро для n до 7000 или около того, где это занимает более секунды.
источник
Mathematica - 22
f[x,n]
возвращаетсяy
сx*y=1 mod 2^n
, в противном случаеx is not invertible modulo 2^n
источник
GolfScript (23 символа)
Часовой результат для несуществующего обратного равен
0
.Это простое применение теоремы Эйлера . , поэтому x - 1 ≡ x 2 n - 1 - 1xφ(2n)≡1(mod2n) x−1≡x2n−1−1(mod2n)
К сожалению, это слишком большая экспонента, чтобы вычислять напрямую, поэтому мы должны использовать цикл и выполнять модульное сокращение внутри цикла. Итерационный шаг и у нас есть выбор базового случая: либо сx2k−1=(x2k−1−1)2×x
k=1
или
k=2
сЯ работаю над другим подходом, но стражу сложнее.
Ключевое наблюдение заключается в том, что мы можем построить обратный шаг за шагом: еслиxy≡1(mod2k−1) xy∈{1,1+2k−1}(mod2k) x x(y+xy−1)≡1(mod2k) y′=(x+1)y−1
Это дает функцию 19 символов
x&1
1
n x f
источник
Рубин - 88 символов
Используйте функцию
f
.Просто рекурсивная функция со связанной вики-страницы возвращает 0 при ошибке.
источник
(e=->a,b{...})[x,2**n][0]
. Можно также сохранить персонажа, протестировавa%b<1
вместоa%b==0
.Haskell, 42 байта
Используя алгоритм, основанный на лемме Хензеля, который удваивает количество цифр в каждой итерации, он работает менее чем за секунду при n до примерно 30 миллионов !
источник
Pyth , 9 байт
Попробуй это здесь!
Принимает ввод в обратном порядке. Или, 9 байт тоже:
.^EtK^2QK
.объяснение
источник
GAP, 39 байт
f(x,n)
возвращает инверсию поx
модулю2^n
и выдает сообщение об ошибкеесли обратного не существует.
источник