我正在尝试编写代码来解密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函数的工作原理,这给了我错误的结果。请帮助我尝试了解如何才能获得预期的结果
答案 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工作正常,其功能是将矩阵求逆,这是正确完成的。我想你在纸笔数学上犯了一些错误。