如何在Python中求解线性丢番图同余式及多变量模线性方程组
用Python SymPy求解模线性方程组
要在Python中自动求解指定模数的线性方程组,无需依赖在线工具,SymPy可以通过**有限域(GF)**操作实现——核心是把方程组转化为有限域上的线性代数问题,而非直接用丢番图求解器。以下是具体实现方案:
核心思路
模线性方程组的求解等价于在有限域 (GF(p))((p) 为指定模数,素数模数最常见且易处理;合数模数可扩展为环上操作)上求解线性系统 (A\mathbf{x} = \mathbf{b} \mod p)。
代码实现(以你的方程组+模数19为例)
from sympy import symbols, Matrix, GF, linsolve # 1. 定义变量和目标模数 a, b, c, d, e, f, g, h, i, j, k, l, m, n = symbols('a b c d e f g h i j k l m n') modulus = 19 # 2. 构建系数矩阵A和常数项向量b # 每行对应一个方程,变量顺序严格匹配:a,b,c,d,e,f,g,h,i,j,k,l,m,n A = Matrix([ [3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1], [7, 9, 17, 11, 6, 5, 1, 0, 0, 0, 0, 0, 0, 0], [13, 2, 9, 8, 0, 12, 13, 0, 0, 0, 0, 0, 0, 0], [5, 2, 16, 12, 5, 7, 1, 0, 0, 0, 0, 0, 0, 0], [6, 4, 9, 6, 4, 9, 6, 1, 7, 11, 1, 7, 11, 1], [10, 15, 13, 10, 15, 13, 10, 12, 18, 8, 12, 18, 8, 12], [9, 12, 14, 4, 9, 16, 3, 7, 17, 11, 14, 3, 18, 1], [9, 12, 16, 15, 1, 14, 6, 11, 2, 9, 12, 16, 15, 1] ]) b = Matrix([15, 3, 17, 11, 8, 18, 15, 14]) # 3. 将矩阵转换到指定有限域上 A_mod = A.applyfunc(lambda x: x % modulus) b_mod = b.applyfunc(lambda x: x % modulus) # 4. 求解线性系统 solution = linsolve((A_mod, b_mod), (a, b, c, d, e, f, g, h, i, j, k, l, m, n)) # 5. 输出参数化解 print(f"参数化解(模{modulus}):") for sol in solution: for var, expr in zip([a,b,c,d,e,f,g,h,i,j,k,l,m,n], sol): print(f"{var} = {expr}")
关键说明
- 适配任意方程组:只需修改
A(每行对应一个方程的变量系数,无变量则填0)和b(对应方程的常数项),变量数量可按需调整。 - 合数模数处理:若模数为合数(如12),可将有限域替换为有限环,用
GF(modulus, modulus=True)实现(需确认SymPy版本支持)。 - 解的情况处理:
linsolve会自动识别方程组的解状态——无解时返回空集,有唯一解时直接给出结果,无穷多解时用自由符号表示参数,与在线求解器输出逻辑一致。
内容的提问来源于stack exchange,提问作者Josiah Winslow
相关产品推荐
相关产品推荐

