不正确的矩阵求逆结果

时间:2018-08-19 13:23:57

标签: python numpy security

对于一个主题,我正在使用numpy实现wikipedia中的Hill Cipher示例。到目前为止,我的代码如下:

import numpy as np

msg = np.array([0, 2, 19]) # CAT
key = np.matrix([
    [6, 24, 1],
    [13, 16, 10],
    [20, 17, 15]
])

ciphertext = np.mod(np.dot(key, msg), 26) # [5, 8, 13] # POH

# And here things go wrong
invKey = key.I
invKey2 = np.linalg.inv(key) # same as key.I

直到第10行(“密文”)正常工作。 np.mod(np.dot(key,msg),26)返回[15,14,7],如文章中所指定。但是,当我尝试对矩阵求逆时,我得到的结果与我预期的完全不同。文章建议键矩阵逆应返回此值:

[[8, 21, 21],
 [5, 8, 12],
 [10, 21, 8]]

但是返回的是:

[[ 0.15873016 -0.77777778  0.50793651]
 [ 0.01133787  0.15873016 -0.10657596]
 [-0.2244898   0.85714286 -0.48979592]]

现在,我可以从该站点上的各种问题中了解到numpy.linalg.inv()存在浮点精度问题。但是这些结果与预期的是如此不同,以至于必须要继续进行下去吗?我是numpy的新手。请帮助我了解这里发生的情况以及如何缓解该问题,因此密钥矩阵将按照本文的说明进行反转。谢谢您的宝贵时间。

1 个答案:

答案 0 :(得分:0)

要回答我自己的问题,希尔密码需要的是矩阵模逆,而不是numpy.linalg.inv()提供的矩阵逆。我需要的是this post中Johns答案中的代码。