2011-02-24 53 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