首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >11+数字ints不工作

11+数字ints不工作
EN

Stack Overflow用户
提问于 2010-11-29 08:37:05
回答 2查看 305关注 0票数 6

我正在使用python 3作为一个小的额外的信用分配来编写一个RSA破解程序。老师给了我们一个相当大的(大到需要32位以上) int和公钥。我的代码适用于素数< 32位。我选择python 3的原因之一是因为我听说它可以处理任意大的整数。在python终端中,我做了一些小事情,比如2**35和阶乘(70),对此进行了测试。这东西运作得很好。

既然我已经编写了代码,我就会遇到溢出错误等问题。为什么对大量数据的操作似乎在终端中工作,但在我的实际代码中却不能工作呢?错误声明它们不能转换为它们的C类型,所以我的第一个猜测是,由于某种原因,python解释器中的内容不是转换成C类型,而编码的内容是。有办法让这件事发挥作用吗?

作为第一次尝试,我尝试计算1到n(大数)之间所有素数的列表。这种方式一直有效,直到我意识到列表索引器只接受int,并在数字大于int时爆炸。此外,如果n> 2**32,则创建长度为n的数组将无法工作。(更别提这会占用的记忆了)

正因为如此,我转而使用一个函数,它可以非常准确地猜测一个数字是否是素数。这些方法被粘贴在下面。

如您所见,我只执行*、/和%操作。所有这些似乎都在解释器中工作,但是当与此代码一起使用时,我会得到“不能转换为c-类型”的错误。

代码语言:javascript
复制
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-类型的地方.

下面的函数非常肯定地估计了一个数是素数。如前所述,我使用它来避免创建大规模数组。

代码语言:javascript
复制
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错误。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-29 10:11:36

您的问题(我认为)是使用/运算符将其转换为浮点。将其更改为//,您应该保持在int域中。

票数 9
EN

Stack Overflow用户

发布于 2010-11-29 08:41:53

许多C例程仍然有C int限制。使用Python例程代替您的工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4302033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档