Modulo large prime - TypeError:%支持的操作数类型:' int'和' str'

时间:2014-07-11 02:58:00

标签: python largenumber

我正在尝试将大字符串F分区为m个块,如下所示:

import random
from largeprimes import generateRandom

def generateRandom(length):
    t = random.randint(0, 2**length)
    str = "{0:b}".format(t)
    if (len(str) < length):
        str.zfill(length)
    return str

def divide_file_block (): #return bi: int
    b = []
    for i in range (0, m):
        b_i = F[(i*blocklen) : ((i+1)* blocklen)]
        temp = int(b_i, 2) % q
        b.append(temp)
    return b

F = generateRandom(102400)
m = 100
blocklen = len(F)/m
q = generateLargePrime(1024) # generateLargePrime is from https://langui.sh/2009/03/07/generating-very-large-primes/
print divide_file_block ()

注意:您应将代码从1复制到当前目录,删除那里的最后一个print语句并将其命名为largpeprimes.py。这使得generateLargePrime函数可导入。

当我测试一个小例子时,它打印出正确的结果。但是当我测试b_i和q为1024位时,它打印出错误:

temp = int(b_i, 2) % q

TypeError: unsupported operand type(s) for %: 'int' and 'str'

你能解释一下为什么,并给我一个建议,以显示这个问题。提前谢谢。

1 个答案:

答案 0 :(得分:2)

函数generateLargePrime有时会返回字符串

尝试代码我遇到了同样的问题。

在调试器中测试我得到了原因:q的值为“1100.0尝试后失败”。

这绝对是导致失败的字符串。

我建议修改generateLargePrime代码以抛出异常,而不是通过返回值报告失败。

检测此类问题的一些提示

打印出有问题的值

这是最简单(也可能是最受欢迎)的快速解决方案。

类似

b_i = F[(i*blocklen) : ((i+1)* blocklen)]
print "q", q # here is all the magic
temp = int(b_i, 2) % q

会告诉你价值

assert放入您的代码

b_i = F[(i*blocklen) : ((i+1)* blocklen)]
assert isinstance(q, int)
temp = int(b_i, 2) % q
只要q不是int

类型,

就会抛出异常

在调试器中运行代码

pdb附带Python,我更喜欢IPython附带的ipdb,两者都可以帮到你。

  1. 将失败的代码写成脚本
  2. 尝试通过Python解释器

    运行它

    $ python failingscript.py

  3. 因为它失败了,你只需再试一次,而不是python使用pdbipdb

    $ ipdb failingscript.py

  4. 使用调试器可以控制逐行运行代码。通常我让它由“c”(继续)命令运行,它很快就会在问题点崩溃。然后我使用“l”(列表)来查看我们所处的代码行,最后使用“p”(print)命令来打印出现问题的变量值。这样我用“p q”发现它是一个字符串。

  5. 需要一点时间来学习pdbipdb,但它可以作为涡轮解析器使用,因此它绝对是学习的技能。很棒的教程是PMotW