Python 矩阵求逆结果不正确
对于一个主题,我正在使用numpy实现Hill密码示例。到目前为止,我的代码如下:Python 矩阵求逆结果不正确,python,numpy,security,Python,Numpy,Security,对于一个主题,我正在使用numpy实现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
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()提供的矩阵逆。约翰回答中的代码正是我所需要的。我认为你的逆解是错误的。它不满足
keyiv.dot(key)=eye(3)
,相反,NumPy的解决方案满足了…同时,我不知道如何理解你的维基百科文章中的逆命题。逆运算是正确的。要验证这一点,您可以手动执行,也可以在mathematica的在线工具中插入您的值。您在Wiki文章中看到的值在逆方程右侧的矩阵前面有一个(mod(26))
。你不能忽视这一点。检查此链接的反向:Numpy正在计算正确的反向。希尔密码需要的“逆”是mod 26逆(Numpy不计算)。你网站上的Wikipedia
文章给出了一些提示,可以结合这些提示来编写你自己的mod 26矩阵求逆代码。今天我学到了矩阵求逆和矩阵模求逆之间的区别。感谢您的帮助:)或来自计算此类逆的Symphy。