模大素数类型错误:不支持%的操作数类型:“int”和“str”

2024-10-04 09:25:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试将一个大字符串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函数是可导入的。在

当我用一个小例子测试时,它打印出了正确的结果。但当我在1024位的b峎I和q上测试时,它会输出错误:

^{pr2}$

你能解释一下原因并给我一个建议来说明这个问题吗。提前谢谢。在


Tags: fromimportlenreturndefrandomblocklength
1条回答
网友
1楼 · 发布于 2024-10-04 09:25:34

函数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放入代码中

^{pr2}$

将在q不是int类型时立即引发异常

在调试器中运行代码

pdb是Python附带的,我更喜欢IPython附带的ipdb,两者都会对您有所帮助。在

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

    $python失败脚本.py

  3. 当它失败时,您只需再试一次,但是不要使用python,而是使用pdb或{}

    美元ipdb失败脚本.py

  4. 调试器允许您逐行控制代码的运行。通常我让它通过“c”(继续)命令运行,它很快就会在有问题的地方崩溃。然后我使用“l”(list)查看我们在哪一行代码,最后使用“p”(print)命令打印变量的值,这些变量会产生问题。这样我用“pq”发现,它是一个字符串。

学习pdbipdb需要一点时间,但它作为turbo解析器工作,因此它绝对是一项需要学习的技能。很棒的教程在PMotW

相关问题 更多 >