You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 21:17:49