这是对Hill Cipher的尝试,到目前为止一直很好,直到第二和第三三元组相乘。我真的不明白我的错误在哪里。 基本上我要做的是列表乘法。
使用此代码我创建了一个列表
key=[k[x:x+3] for x in xrange(0, len(k), 3)]
message=[m[x:x+1] for x in xrange(0, len(m), 1)]
key=[[16, 4, 11], [8, 6, 18], [15, 19, 15]]
message=[[0], [12], [8], [6], [15], [2], [15], [13], [3], [21], [2], [20], [15], [18], [8]]
我的目标是将key list
中的每个子列表或列乘以message list
更新: 我已按照建议制作了一个嵌套循环,并且我已将消息列表分成块但仍然无法使其工作。
嵌套循环
result = [[0,],
[0,],
[0],]
#Divide the matrizm into chunks
n = 3
chunks = (matrizm[x:x+n] for x in range(0,len(matrizm), n))
#Matrix multiplication
for triagram in chunks:
# iterate through rows of X
for i in range(len(matrizk)):
# iterate through columns of Y
for j in range(len(triagram[1])):
# iterate through rows of Y
for k in range(len(matrizk)):
result[i][j] += matrizk[i][k] * triagram[k][j]
使用我当前的代码,我可以将前3个三角形乘以,这样就可以得到错误的结果。
我的问题是,有了这两个列表,我怎样才能将前3个三角形然后再增加3个,依此类推,直到matrizk列表结束
matrizk = [[16, 4, 11], [8, 6, 18], [15, 19, 15]]
matrizk = [[0], [12], [8], [6], [15], [2], [15], [13], [3], [21], [2], [20], [15], [18], [3]]
答案 0 :(得分:0)
答案假设Python 2.7x
数据:
key=[[16, 4, 11], [8, 6, 18], [15, 19, 15]]
message=[[0], [12], [8], [6], [15], [2], [15], [13], [3], [21], [2], [20], [15], [18], [8]]
似乎使事情复杂化的一件事是message
是一个列表列表,为了使事情变得更容易,它需要在某些时候被夷为平地。
我将使用itertools
recipe来获取消息的块,因为我将使用生成器来展平消息。还有其他方法可以将答案中的列表展平:How do you split a list into evenly sized chunks in Python?
import itertools
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
args = [iter(iterable)] * n
return itertools.izip_longest(fillvalue=fillvalue, *args)
# flatten the message [[1],[2]] -> [1,2]
message = (item for thing in message for item in thing)
zip
是另一个有用的功能,它类似于换位:
>>> zip([1,2],[3,4])
[(1, 3), (2, 4)]
>>>
现在我们将使用键和每个3项,消息块进行矩阵乘法。
for group in grouper(message, n):
# matrix multiplication
for row in key:
sum_prod = 0
for a, b in zip(group, row):
sum_prod += a*b
#print(group, row, sum_prod, sum_prod % 26)
result.append(sum_prod)
#result.append(sum_prod % 26)