Результат Python по модулю отличается от wolfram alpha?
когда я запускаю свою программу python 3:
exp = 211
p = 199
q = 337
d = (exp ** (-1)) % ((p - 1)*(q - 1))
результаты в 211^(-1).
но когда я запускаю расчет в wolfram alpha я получаю результат, которого ожидал.
Я сделал некоторые тестовые выходы и переменные exp
, p
и q
в программе все целочисленные значения, которые я использовал в wolfram alpha.
моя цель-получить закрытый ключ из (слабо) зашифрованного целого числа. Если я проверю свой результат wolfram alpha, я могу расшифруйте зашифрованное сообщение правильно.
4 ответов
Wolfram Alpha вычисляет модульный инверсный. То есть, он находит целое число x
такое, что
exp*x == 1 mod (p - 1)*(q - 1)
это не то же самое, что оператор по модулю %
. Здесь Python просто вычисляет остаток, когда 1/exp
делится на (p - 1)*(q - 1)
когда дано выражение в вашем вопросе.
копирование кода Python из ответ, вы можете вычислить желаемое значение с помощью Python тоже:
>>> modinv(exp, (p - 1)*(q - 1))
45403
Wolfram Alpha не имеет четко определенного синтаксиса. Он принимает произвольный текст, который вы предоставляете, и пытается выяснить, что вы имели в виду под этим вводом. В этом случае он решил, что вы, вероятно, ищете модульный обратный, и он дал вам один.
Python имеет четко определенный синтаксис. В Python синтаксический анализатор не принимает **
и %
вместе и угадайте, что эта комбинация заставляет два оператора иметь значение, отличное от их обычного значения. The **
вычисляется обычным способом, а потом %
оператор по модулю. Если вы хотите модульный обратный, вам придется написать его самостоятельно.
Я думаю, что идея здесь в том, что wolfram alpha и python определяют операцию по модулю по-разному в зависимости от того, что вы имеете дело с целыми числами или вещественными числами. В этом случае Wolfram Alpha использует обратный по модулю, потому что он обнаруживает, что первое число равно 0
дополнительная информация об определении на вещественных числах здесь
Python вычисляет немедленно (211^(-1) вычисляется как 0.004739... и не ekpt как 1/211) и модульные Euclidan остаток x и y это conventinally определена как x-floor(x/y)*y
если x,y является рациональным числом. Если вы делаете свой расчет с помощью специальной теоретико-числовой программы, например:GP / Pari
ep = 211;p = 199;q = 337;(ep ^ (-1)) % ((p - 1)*(q - 1))
вы получите результат, который вы ожидали получить, потому что a) он сохраняет дроби как можно дольше дроби и Б) знает о модульной арифметике.
вам нравится Python, вы можете взглянуть на программы и библиотеки, предлагаемые в SciPy. SymPy может быть то, что вы ищете.