如何用SymPy复现Wolfram Solve的正整数求解示例?
用SymPy求解正整数解并满足m>n
要复现Wolfram语言中Solve[m^2+m*n==500 && m>n,{m,n},PositiveIntegers]的结果,你需要在SymPy中明确添加正整数约束和m>n的不等式条件,而不是只求解单个方程。以下是具体实现步骤:
1. 导入SymPy并定义带约束的符号
首先定义m和n为正整数类型的符号,这能直接缩小解的范围:
import sympy as sp from sympy import S # 定义m、n为正整数符号 m, n = sp.symbols('m n', integer=True, positive=True)
2. 构造方程和不等式条件
把原方程和m>n的条件都列为求解的约束:
# 原方程:m² + m*n = 500 eq = sp.Eq(m**2 + m*n, 500) # 不等式条件:m > n ineq = m > n
3. 求解带约束的方程组
使用sp.solve()同时传入方程和不等式,并指定解的域为正整数:
# 求解,返回字典形式的解 solutions = sp.solve((eq, ineq), (m, n), domain=S.PositiveIntegers, dict=True) print(solutions)
运行这段代码后,你会得到预期结果:
[{m: 20, n: 5}]
为什么你之前的代码没有得到预期结果?
你之前的代码只求解了m² + m*n - 500 = 0这个方程,没有添加两个关键约束:
- 正整数的范围限制(SymPy默认会寻找所有符号解)
m>n的不等式条件
所以得到的是[(m, -m + 500/m)]这种符号形式的关系,而不是具体的数值解。
另一种验证思路:因式分解简化求解
原方程可以因式分解为m(m + n) = 500,因为m和m+n都是500的正整数因数,结合条件推导:
- 由
m > n可得:m > (500/m - m)→2m² > 500→m > √250 ≈15.8 - 由
n > 0可得:500/m - m > 0→m² <500→m <√500≈22.36
所以只需要找500在16到22之间的因数,只有20,代入后得到n=500/20 -20=5,这也验证了结果的正确性。
内容的提问来源于stack exchange,提问作者Nigel Davies
相关产品推荐
相关产品推荐

