我正在使用python 3作为一个小的额外的信用分配来编写一个RSA破解程序。老师给了我们一个相当大的(大到需要32位以上) int和公钥。我的代码适用于素数< 32位。我选择python 3的原因之一是因为我听说它可以处理任意大的整数。在python终端中,我做了一些小事情,比如2**35和阶乘(70),对此进行了测试。这东西运作得很好。
既然我已经编写了代码,我就会遇到溢出错误等问题。为什么对大量数据的操作似乎在终端中工作,但在我的实际代码中却不能工作呢?错误声明它们不能转换为它们的C类型,所以我的第一个猜测是,由于某种原因,python解释器中的内容不是转换成C类型,而编码的内容是。有办法让这件事发挥作用吗?
作为第一次尝试,我尝试计算1到n(大数)之间所有素数的列表。这种方式一直有效,直到我意识到列表索引器只接受int,并在数字大于int时爆炸。此外,如果n> 2**32,则创建长度为n的数组将无法工作。(更别提这会占用的记忆了)
正因为如此,我转而使用一个函数,它可以非常准确地猜测一个数字是否是素数。这些方法被粘贴在下面。
如您所见,我只执行*、/和%操作。所有这些似乎都在解释器中工作,但是当与此代码一起使用时,我会得到“不能转换为c-类型”的错误。
def power_mod(a,b,n):
if b < 0:
return 0
elif b == 0:
return 1
elif b % 2 == 0:
return power_mod(a*a, b/2, n) % n
else:
return (a * power_mod(a,b-1,n)) % n最后3行是不能转换为c-类型的地方.
下面的函数非常肯定地估计了一个数是素数。如前所述,我使用它来避免创建大规模数组。
def rabin_miller(n, tries = 7):
if n == 2:
return True
if n % 2 == 0 or n < 2:
return False
p = primes(tries**2)
if n in p:
return True
s = n - 1
r = 0
while s % 2 == 0:
r = r+1
s = s/2
for i in range(tries):
a = p[i]
if power_mod(a,s,n) == 1:
continue
else:
for j in range(0,r):
if power_mod(a, (2**j)*s, n) == n - 1:
break
else:
return False
continue
return True也许我应该更具体地粘贴错误:行19,在power_mod返回(a * power_mod(a,b-1,n)) %n OverflowError: Python太大,无法转换为C双。
这是我在执行算术时遇到的错误类型。当试图创建难以置信的大列表、集合等时,会发生Int错误。
发布于 2010-11-29 10:11:36
您的问题(我认为)是使用/运算符将其转换为浮点。将其更改为//,您应该保持在int域中。
发布于 2010-11-29 08:41:53
许多C例程仍然有C int限制。使用Python例程代替您的工作。
https://stackoverflow.com/questions/4302033
复制相似问题