对于一个主题,我正在使用numpy实现来自wikipedia的Hill密码示例。我的代码如下:
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.linalg.inv公司()提供。约翰斯答案中的代码是我需要的。你知道吗
相关问题 更多 >
编程相关推荐