2011-02-24 55 views
3

我完全难倒了。我正在计算RSA中数字54的密码,其值如下:Python模数结果不正确

p = 5; Q = 29; n = 145 d = 9; E = 137

所以加密的数字54是:

54^137 MOD 145

或等价的蟒蛇:

import math 
math.pow(54,137)%145 

我的计算器给我24,我的Python语句也给我54.0。 Python显然是错误的,但我不知道为什么或如何。尝试一下你的Python安装。我的版本是2.5.1,但我也在2.6.5上尝试了相同的错误结果。

回答

14
>>> pow(54,137,145) 
24 

math.pow是浮点数。你不想那样。浮点值的有效精度小于17位。 54 ** 137有237位数字。

+0

谢谢!有趣的信息,我喜欢学习这样的细节。 – Franz 2011-02-24 08:45:38

+0

@Franz:“小细节”?像浮点数只代表精度的几位十进制数?我认为这不仅仅是一点点。有相当数量的SO问题反映了其他人不知道这些信息。或者你也许是指别的东西? – 2011-02-24 10:47:33

7

这是因为使用math模块基本上只是一个不包含任意精度数字的C数学库的Python包装器。这意味着math.pow(54,137)正在计算54^137作为64位浮点数,这意味着它不会足够精确地保存如此大数量的所有数字。试试这个,而不是使用Python的普通内置任意精度整数:

>>> (54 ** 137) % 145 
24L 
+6

对于模数运算,使用三参数'pow(x,y,z)'而不是'x ** y%z''通常是一个非常好的想法 - 它避免了创建潜在巨大的中间值'x ** y'。 – ncoghlan 2011-02-24 03:51:40