使用numpy进行矩阵逆运算不会得到预期的结果

时间:2019-06-27 14:17:59

标签: python numpy encryption multidimensional-array cryptography

我正在尝试编写代码来解密Hill Cipher文本。在使用线性代数的地方,我们被教导如何手动执行此操作。我的代码需要我找到平方矩阵的逆。

假设我是手动为2x2矩阵执行此操作。如果我的矩阵是:

|1  4 |
|11 11|

如果我找到行列式(因为毕竟是密码,所以为mod 26)和矩阵的伴随,我将得到:

|121  44|
|-121 11|

稍后我可以找到元素mod 26,但是我想说的是我要获取整数。

现在要编写此代码,我遇到了时间紧迫的问题,因此我认为我将使用numpy来查找此矩阵的逆,而不是编写单独的代码来查找逆和伴随。这就是我所做的:

a=[[1,11],[4,11]]
print(linalg.inv(a))

当我手动执行操作时, 我得到19作为行列式

Inverse=     1 |11  -4| = 11|11  -4| = |121  -44|
             19|-11  1|     |-11  1|   |-121  11|

(我乘以11,因为19的模逆是11) 好的,这就是我们所教的。但是当我使用上面提到的numpy函数时:我得到:

[-0.33333333  0.12121212]
 [ 0.33333333 -0.03030303]]

我期望有一个[[121 -44],[-121,11]]

我认为我不了解numpy函数的工作原理,这给了我错误的结果。请帮助我尝试了解如何才能获得预期的结果

1 个答案:

答案 0 :(得分:0)

也许您的数学不正确?

我已经将{(1,11),(4,11)}的矩阵求逆变为{(-1/3,1/3),(4/33,-1/33)}。 (您可以使用在线计算器来尝试,我使用的是Wolframalpha。)

这给出了我获得的(与您一样)的输出:

runfile('C:/Users/HP/.spyder-py3/numpyinvtest_for_stackoverflow.py', wdir='C:/Users/HP/.spyder-py3')
[[-0.33333333  0.33333333]
 [ 0.12121212 -0.03030303]]

我的代码:

import numpy as np

b = np.array([[1,11],[4,11]])
c = np.linalg.inv(b)

print (c)

NumPy工作正常,其功能是将矩阵求逆,这是正确完成的。我想你在纸笔数学上犯了一些错误。