Python模结果与wolfram alpha不同?

Python模结果与wolfram alpha不同?,python,cryptography,rsa,modulo,wolframalpha,Python,Cryptography,Rsa,Modulo,Wolframalpha,当我运行python 3程序时: exp = 211 p = 199 q = 337 d = (exp ** (-1)) % ((p - 1)*(q - 1)) 结果为211^(-1) 但当我运行时,我得到了我期望的结果 我做了一些测试输出,程序中的变量exp、p和q都是我在wolfram alpha中使用的整数值 我的目标是从(弱)加密的整数中派生私钥。 如果我测试我的wolfram alpha结果,我可以正确解密加密的消息 Wolfram Alpha正在计算。也就是说,它找到整数x,这样

当我运行python 3程序时:

exp = 211
p = 199
q = 337

d = (exp ** (-1)) % ((p - 1)*(q - 1))
结果为211^(-1)

但当我运行时,我得到了我期望的结果

我做了一些测试输出,程序中的变量
exp
p
q
都是我在wolfram alpha中使用的整数值

我的目标是从(弱)加密的整数中派生私钥。
如果我测试我的wolfram alpha结果,我可以正确解密加密的消息

Wolfram Alpha正在计算。也就是说,它找到整数
x
,这样

exp*x == 1 mod (p - 1)*(q - 1)
这与模运算符
%
不同。在这里,当给出问题中的表达式时,
1/exp
除以
(p-1)*(q-1)
时,Python只是简单地计算余数

从中复制Python代码,也可以使用Python计算所需的值:

>>> modinv(exp, (p - 1)*(q - 1))
45403

我认为这里的想法是wolfram alpha和python根据处理整数或实数的事实,以不同的方式定义模运算。 在这种情况下,Wolfram Alpha使用模逆,因为它检测到第一个数字是0
有关实数定义的更多信息

Wolfram Alpha没有定义良好的语法。它接受你提供的任意文本,并试图找出你所说的输入是什么意思。在这个例子中,它决定你可能在寻找一个模逆,它给了你一个


Python具有定义良好的语法。在Python中,解析器不会将
**
%
放在一起,并猜测这两个运算符的组合会使它们的含义不同于通常的含义。
**
是用通常的方法计算的,然后
%
是模运算符。如果您想要模逆,您必须自己编写一个。

Python立即计算(211^(-1)计算为0.004739…而不是ekpt计算为1/211),并且x和y的模欧几里德余数通常定义为
x-floor(x/y)*y
如果x中的任何一个,y是有理数。如果您使用一些专用数论程序进行计算,例如:

你会得到你期望得到的结果,因为a)它尽可能长地保留分数,b)知道模运算


如果你喜欢Python,你可以看看它提供的程序和库。可能正是您想要的。

这似乎合乎逻辑。你认为
0.5%2
会是什么?
0.5
会是答案,但为什么wolfram alpha会提供我想要的答案?这是个好问题。虽然它与python无关,因为这是预期的行为。在Alpha中键入
(1/211)mod((199-1)*(337-1))
可以得到python的答案:大约,
0.00473
ep = 211;p = 199;q = 337;(ep ^ (-1)) % ((p - 1)*(q - 1))