Результат 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 может быть то, что вы ищете.