繁体   English   中英

创建和反转大型伽罗瓦域矩阵

[英]Create and invert large Galois field matrix

我有一个大小为 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]

看看 SAGE www.sagemath.org

我有一个尺寸为128x128的矩阵。 每个条目都是一个二进制字段元素(在我的用例中,只有0和1)。 我尝试在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]

反相通过伽罗瓦域的矩阵可以通过执行来实现高斯消去上(具有在伽罗瓦域执行的所有算术) [A | I] [A | I] ,结果为[I | A^-1] [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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM