- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个大小为 128x128 的矩阵。每个条目都是一个二进制字段元素(在我的用例中,只有 0 和 1)。我尝试在 matlab 中反转这个矩阵。我在 matlab 中找到了一些可以在此处执行有限域矩阵求逆的函数 http://www.mathworks.com/help/comm/galois-field-computations.html .
但是,这些内置函数仅支持最大 16x16 的矩阵大小。还有其他方法可以克服这个限制吗?我愿意使用其他工具,例如 python 或 C/C++。
如果您想尝试您的方法,这里是测试矩阵及其逆矩阵。
矩阵A[0,0,0,1,0,0,1,0;1,1,1,0,1,0,1,1;1,1,1,0,1,1,0,1;0 ,1,0,0,0,0,1,0;0,1,1,1,1,1,1,0;1,0,1,1,0,0,1,0;0,0 ,1,0,0,0,1,0;0,0,0,0,0,1,0,0]
矩阵 A^-1[1,1,1,0,0,1,1,1;0,1,1,1,0,0,0,1;0,1,1,0,0,0,1,1;1 ,1,1,0,0,0,0,1;1,0,0,1,1,0,1,1;0,0,0,0,0,0,0,1;0,1 ,1,0,0,0,0,1;0,1,0,0,1,1,1,1]
最佳答案
可以通过执行 Gaussian elimination 来实现伽罗华域上的矩阵求逆。 (在 Galois 域中执行所有算术)[A | I]
,结果是 [I | A^-1]
.
下面是一些执行高斯消元(行减少)的伪代码。
def row_reduce(A):
A_rre = A.copy()
p = 0 # The pivot
for j in range(A.shape[1]):
# Find a pivot in column `j` at or below row `p`
idxs = np.nonzero(A_rre[p:,j])[0]
if idxs.size == 0:
continue
i = p + idxs[0] # Row with a pivot
# Swap row `p` and `i`. The pivot is now located at row `p`.
A_rre[[p,i],:] = A_rre[[i,p],:]
# Force pivot value to be 1
A_rre[p,:] /= A_rre[p,j]
# Force zeros above and below the pivot
idxs = np.nonzero(A_rre[:,j])[0].tolist()
idxs.remove(p)
A_rre[idxs,:] -= np.multiply.outer(A_rre[idxs,j], A_rre[p,:])
p += 1
if p == A_rre.shape[0]:
break
return A_rre
我有这个用例,但找不到完成此操作的 Python 库。所以我创建了一个 Python 包 galois在 Galois 域上扩展 NumPy 数组。它支持使用普通 np.linalg
函数的线性代数。
这是一个使用您的测试矩阵的示例。
In [1]: import numpy as np
In [2]: import galois
In [3]: GF = galois.GF(2)
In [4]: A = GF([[0,0,0,1,0,0,1,0],[1,1,1,0,1,0,1,1],[1,1,1,0,1,1,0,1],[0,1,0,0,0,0,1,0],[0,1,1,1,1,1,1,0
...: ],[1,0,1,1,0,0,1,0],[0,0,1,0,0,0,1,0],[0,0,0,0,0,1,0,0]]); A
Out[4]:
GF([[0, 0, 0, 1, 0, 0, 1, 0],
[1, 1, 1, 0, 1, 0, 1, 1],
[1, 1, 1, 0, 1, 1, 0, 1],
[0, 1, 0, 0, 0, 0, 1, 0],
[0, 1, 1, 1, 1, 1, 1, 0],
[1, 0, 1, 1, 0, 0, 1, 0],
[0, 0, 1, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 1, 0, 0]], order=2)
In [5]: A_inv = np.linalg.inv(A); A_inv
Out[5]:
GF([[1, 1, 1, 0, 0, 1, 1, 1],
[0, 1, 1, 1, 0, 0, 0, 1],
[0, 1, 1, 0, 0, 0, 1, 1],
[1, 1, 1, 0, 0, 0, 0, 1],
[1, 0, 0, 1, 1, 0, 1, 1],
[0, 0, 0, 0, 0, 0, 0, 1],
[0, 1, 1, 0, 0, 0, 0, 1],
[0, 1, 0, 0, 1, 1, 1, 1]], order=2)
In [6]: A @ A_inv
Out[6]:
GF([[1, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 0, 0, 1]], order=2)
关于python - 创建和反转大型 Galois 域矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24248380/
我试图了解如何更改伽罗瓦 LFSR 代码,以便能够将输出位数指定为下面提到的函数的参数。我的意思是我需要返回的不是 LFSR 的最后一位作为输出位,而是 LFSR 的任何位(例如第二位或第三位)。我真
我有一个大小为 128x128 的矩阵。每个条目都是一个二进制字段元素(在我的用例中,只有 0 和 1)。我尝试在 matlab 中反转这个矩阵。我在 matlab 中找到了一些可以在此处执行有限域矩
我想了解 galois LFSR 代码的工作原理。在维基百科页面上有一个带有示例的图。有一段 C 代码。 #include uint16_t lfsr = 0xACE1u; unsigned per
我正在寻求为专有 TLS 实现实现 Galois 计数器模式(不是,使用,实现)。我遇到的问题是我无法弄清楚标准 NIST 设计的 128 位大小是否与规定的底层密码的 128 位大小相结合。 IE。
我很难将 galois_mul2 函数转换为 javascript。 我在 c 中有以下功能 unsigned char galois_mul2(unsigned char value) {
根据Linear feedback shift register维基百科上的页面, 除了 Galois LFSR 对计算机更友好之外,您能说出使用伽罗瓦数列相对于斐波那契数列的真正优势是什么吗? 换句
我正在寻找 finite field/galois field C 的精确线性代数库(C++ 是 Not Acceptable ,因为我需要能够为其编写 Haskell 绑定(bind),这显然是 d
我在 C++ 中使用 OpenSSL API 来执行私钥的基本加密/解密。我正在尝试不同的加密模式,由于某种原因,在使用 GCM ( Galois Counter Mode) 加密和 AES 时出现错
一段时间以来,我一直在努力解决我正在开发的应用程序中网络编码的性能问题(请参阅 Optimzing SSE-code、Improving performance of network coding-e
我是一名优秀的程序员,十分优秀!