
本文介绍使用 galois 库在有限域 gf(2) 上快速计算矩阵零空间,从而自动找出使行向量线性组合模 2 为零的一组非零系数,避免手动实现高斯消元。
本文介绍使用 galois 库在有限域 gf(2) 上快速计算矩阵零空间,从而自动找出使行向量线性组合模 2 为零的一组非零系数,避免手动实现高斯消元。
在密码学、编码理论和布尔函数分析等场景中,常需判断一组整数向量在模 2 意义下是否线性相关,并显式构造一个非平凡的线性依赖关系(即不全为零的系数向量 c,使得 cA ≡ 0 (mod 2))。给定一个形状为 (n+1) × n 的整数矩阵(行数多于列数),根据线性代数原理,其行向量在 GF(2) 上必然线性相关,因此零空间维数至少为 1 —— 这意味着一定存在非零解。
Python 标准生态(如 NumPy)本身不原生支持有限域运算,但专用库 Galois 提供了完整的 GF(2) 矩阵代数支持,包括高效的零空间(null space)计算。关键在于:求行线性依赖 ⇔ 求左零空间 ⇔ 求 Aᵀ 的右零空间。因此,我们需对原矩阵转置后,在 GF(2) 上计算其零空间。
以下为完整可运行示例:
from galois import GF2
import numpy as np
# 原始整数矩阵(4×3)
A_int = np.array([
[1, 3, 0],
[1, 1, 0],
[1, 0, 1],
[0, 1, 5]
])
# 步骤1:模2约简 + 转置 → 得到 GF(2) 上的 3×4 矩阵
A_gf2 = GF2(A_int.T % 2)
# 步骤2:计算零空间(返回行向量构成的基矩阵,每行是一个解)
null_basis = A_gf2.null_space()
print("GF(2) 上 A.T 的零空间基(每行是一个依赖系数向量):")
print(null_basis)输出:
立即学习“Python免费学习笔记(深入)”;
GF(2) 上 A.T 的零空间基(每行是一个依赖系数向量): [[1 0 1 1] [0 1 1 1]]
结果中第一行 [1, 0, 1, 1] 即为题目所求:它表示以第 1、第 3、第 4 行(索引从 0 开始)作系数为 1 的加法(GF(2) 中加法即异或,等价于整数模 2 求和),其余行为 0,所得行向量和为 [2, 4, 6] ≡ [0, 0, 0] (mod 2)。
⚠️ 注意事项:
- galois.GF2 自动将输入数组元素模 2 并映射到 {0, 1},但必须先转置:因为 null_space() 默认求解 X @ A = 0(右零空间),而我们要的是 c @ A = 0(左零空间),故传入 A.T;
- 返回的零空间基是行满秩的,任意非零行(或其 GF(2) 线性组合)都是有效解;若仅需一个非零解,取 null_basis[0] 即可;
- 安装依赖:pip install galois(需 Python ≥ 3.8,底层基于 NumPy 和 Numba,性能优异);
- 对于超大规模稀疏矩阵,可考虑结合 scipy.sparse 预处理,但 Galois 当前主要面向稠密小中规模问题。
综上,借助 Galois 库,仅需 3 行核心代码即可稳健、可读、高效地解决模 2 线性依赖问题,显著优于手写高斯消元(易错、难维护、无域语义保障)。


















