Python 矩阵求逆结果不正确

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

对于一个主题,我正在使用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 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。