【发布时间】:2017-11-18 21:00:45
【问题描述】:
我对 Python 还很陌生,我正在尝试将 Hill Cipher 作为一个小项目来实现。我想我已经弄清楚了逻辑并且已经让加密部分工作,但是,在解密部分,我遇到了麻烦。尤其是模数运算符。在下面的解密函数中,倒数第二行是问题所在。
import numpy as np
import fractions as fr
def decrypt(matrix, words):
matrix=np.asmatrix(matrix)
length = len(matrix)
det_matrix=int(round((np.linalg.det(matrix))%26))
mult_inv=(abs(det_matrix*26)/fr.gcd(det_matrix,26))/26
matrix_inv=(((np.linalg.inv(matrix)*np.linalg.det(matrix))%26)*mult_inv)%26
words = words.lower()
arr = np.array([ord(i) - ord('a') for i in words], dtype=int)
decrypt_matrix=(np.asmatrix(matrix_inv)*(np.asmatrix(arr).transpose()))%26
return decrypt_matrix
我对解密函数的输入是:
>>> matrix
[[6, 24, 1], [13, 16, 10], [20, 17, 15]]
>>> words
'poh'
在计算det_matrix 之后,mult_inv 变量的值将是 25。所以计算 matrix_inv 的代码行将具有以下值,(这是绝对正确的):
>>> matrix_inv
array([[ 8., 5., 10.],
[ 21., 8., 21.],
[ 21., 12., 8.]])
数组arr 将具有值:
>>> arr
array([15, 14, 7])
现在的问题是下一行代码,在执行取模之前表达式的结果
matrix_inv*(np.asmatrix(arr).transpose())
是:
matrix([[ 260.],
[ 574.],
[ 539.]])
现在,如果我对上述矩阵执行模 26,我应该得到输出为
([[0.],[2.],[19.]])
但是,下面是我执行表达式时得到的结果
>>> (np.asmatrix(matrix_inv)*(np.asmatrix(arr).transpose()))%26
matrix([[ 26.],
[ 2.],
[ 19.]])
我不明白为什么第一个元素计算不正确(260%26 是 0 而不是 26)!但是,其余两个元素已正确计算!
非常感谢任何帮助!
P.S:我已经尝试在 2.7.11 和 3.6.1 版本上运行代码。两者都不起作用。
【问题讨论】:
-
到目前为止我唯一尝试过的就是检查
(matrix @ matrix_inv)%26 = 1。这不是……
标签: python arrays matrix modulus