Python TypeError:尝试使用素数列表时,int对象不可编辑
因此,我一直在编写一个函数,使用随机生成的素数生成一个键作为元组,当我尝试运行代码时,它会生成错误Python TypeError:尝试使用素数列表时,int对象不可编辑,python,Python,因此,我一直在编写一个函数,使用随机生成的素数生成一个键作为元组,当我尝试运行代码时,它会生成错误 PS C:\Users\cinna\workspace\project4>py rsa.py S 回溯(最近一次呼叫最后一次): 文件“C:\Users\cinna\workspace\project4\rsa.py”,第104行,在 _main() 文件“C:\Users\cinna\workspace\project4\rsa.py”,第91行,在_main中 n、 e,d=键根(25100)
PS C:\Users\cinna\workspace\project4>py rsa.py S
回溯(最近一次呼叫最后一次):
文件“C:\Users\cinna\workspace\project4\rsa.py”,第104行,在
_main()
文件“C:\Users\cinna\workspace\project4\rsa.py”,第91行,在_main中
n、 e,d=键根(25100)
文件“C:\Users\cinna\workspace\project4\rsa.py”,第10行,在keygen中
素数=_素数(低,高)
文件“C:\Users\cinna\workspace\project4\rsa.py”,第69行,在\u primes中
素数+=p
TypeError:“int”对象不可编辑
编辑:这是我的keygen()、_primes()和main()代码。谢谢你的耐心,还在学习礼仪
def keygen(lo, hi):
primes = _primes(lo, hi)
for i in range(lo, hi):
if _primes(i):
ptemp = stdrandom.uniformInt(0, len(primes))
qtemp = stdrandom.uniformInt(0, len(primes))
p = primes[ptemp]
q = primes[qtemp]
n = p * q
m = (p - 1) * (q - 1)
while True:
e = stdrandom.uniformInt(2, m)
if e % m == 0 and m % e != 0:
break
d = 0
for a in range(1, m):
if (e * a) % m == 1:
d = a
break
return n, e, d
def _primes(lo, hi):
primes = []
for p in range(lo, hi + 1):
j = 2
f = 1
while(j * j <= p):
if(p % j == 0):
f = 0
break
j = j + 1
if(f == 1):
primes += p
return primes
def _main():
x = ord(sys.argv[1])
n, e, d = keygen(25, 100)
encrypted = encrypt(x, n, e)
stdio.writef('encrypt(%c) = %d\n', x, encrypted)
decrypted = decrypt(encrypted, n, d)
stdio.writef('decrypt(%d) = %c\n', encrypted, decrypted)
width = bitLength(x)
stdio.writef('bitLength(%d) = %d\n', x, width)
xBinary = dec2bin(x, width)
stdio.writef('dec2bin(%d) = %s\n', x, xBinary)
stdio.writef('bin2dec(%s) = %d\n', xBinary, bin2dec(xBinary))
if __name__ == '__main__':
_main()
def keygen(低、高):
素数=_素数(低,高)
对于范围内的i(lo,hi):
如果_素数(i):
ptemp=stdrandom.均匀(0,len(素数))
qtemp=stdrandom.uniformant(0,len(素数))
p=素数[ptemp]
q=素数[qtemp]
n=p*q
m=(p-1)*(q-1)
尽管如此:
e=标准均相(2,m)
如果e%m==0且m%e!=0:
打破
d=0
对于范围(1,m)内的a:
如果(e*a)%m==1:
d=a
打破
返回n,e,d
def_素数(低、高):
素数=[]
对于范围内的p(低、高+1):
j=2
f=1
而(j*j问题是这个表达式:
primes+=p
您可以使用该运算符,但其工作原理如下:
[1,2,3,4] = [1,2,3,4] + x
现在x必须是一个列表,这样这个表达式才能工作。它只是将列表连接在一起。您试图将
int
附加到列表
,这是非法的。您可以将列表
附加到列表
。尝试执行primes+=[p]
或primes.append(p)
发布代码的屏幕截图是不被接受的,因为这使得任何人都很难在他们的机器上运行代码进行测试。你能把你的代码修改成一个最小的工作示例并编辑你的帖子吗?例如,我看不到\u primes
功能,因此无法有效地调试。primes
是一个列表和p
是一个整数…你是说primes.append(p)
?@Tomerikoo我被建议不要使用'primes.append(p)“因为这比我们正在研究的要早,但如果这有助于解决这个问题,我会尝试。你说这是什么意思?这是向列表中添加元素的最基本方法……如果你正在使用列表,而没有了解append
,这对我来说似乎是一个糟糕的过程。”。。。
[1,2,3,4] = [1,2,3,4] + x