我编写了一个 Python 包galois,它在 Galois 字段上扩展了 NumPy 数组。伽罗瓦域矩阵上的线性代数是预期的用例之一。它是用 Python 编写的,但使用 Numba 进行 JIT 编译以提高速度。它非常快,并且大多数线性代数例程也被编译。(一个例外,截至 2021 年 8 月 11 日,行缩减例程尚未经过 JIT 编译,但可以添加。)
这是一个使用该galois
库来执行您所描述的示例的示例。
创建一个GF(2)
数组类并创建一个显式数组和一个随机数组。
In [1]: import numpy as np
In [2]: import galois
In [3]: GF = galois.GF(2)
In [4]: A = GF([[0, 0, 1, 0], [0, 1, 1, 1], [1, 0, 1, 0], [1, 0, 1, 0]]); A
Out[4]:
GF([[0, 0, 1, 0],
[0, 1, 1, 1],
[1, 0, 1, 0],
[1, 0, 1, 0]], order=2)
In [5]: B = GF.Random((4,4)); B
Out[5]:
GF([[1, 1, 1, 0],
[1, 1, 1, 0],
[1, 1, 0, 0],
[0, 0, 1, 0]], order=2)
您可以像这样更新整行(根据您的要求)。
In [6]: B[0,:] = [1,0,0,0]; B
Out[6]:
GF([[1, 0, 0, 0],
[1, 1, 1, 0],
[1, 1, 0, 0],
[0, 0, 1, 0]], order=2)
矩阵算术适用于普通的二元运算符。这里是矩阵加法和矩阵乘法。
In [7]: A + B
Out[7]:
GF([[1, 0, 1, 0],
[1, 0, 0, 1],
[0, 1, 1, 0],
[1, 0, 0, 0]], order=2)
In [8]: A @ B
Out[8]:
GF([[1, 1, 0, 0],
[0, 0, 0, 0],
[0, 1, 0, 0],
[0, 1, 0, 0]], order=2)
NumPy 数组有一个添加的方法,称为row_reduce()
对矩阵执行高斯消元。您还可以在 Galois 域数组上调用标准 NumPy 线性代数函数并获得正确的结果。
In [9]: A.row_reduce()
Out[9]:
GF([[1, 0, 0, 0],
[0, 1, 0, 1],
[0, 0, 1, 0],
[0, 0, 0, 0]], order=2)
In [10]: np.linalg.matrix_rank(A)
Out[10]: 3
希望这可以帮助!如果需要其他功能,请在GitHub 上打开一个问题。