栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

获取线性方程的所有正整数解

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

获取线性方程的所有正整数解

SymPy可以求解Diophantine方程,但没有生成正解的内置方法。使用Sage可以轻松完成此任务:这是四行代码,可生成方程式的所有
非负整数解

p = MixedIntegerLinearProgram()w = p.new_variable(integer=True, nonnegative=True)p.add_constraint(411*w[0] + 295*w[1] + 161*w[2] == 3200)p.polyhedron().integral_points()

输出是

((4, 2, 6),)

在幕后,

integral_points
很可能只会运行多个循环;尽管当这似乎不起作用时,它会尝试使用Smith范式。

我知道您想要积极的解决方案,但是(a)很容易从答案中排除任何包含零的元组;(b)在求解之前,也很容易用x-1等替换x;(c)坚持“否定性”使得使用
上述混合整数线性编程模块可以轻松创建多面体。

根据文档,也可以直接从不等式(“
Hrep”)构建多面体对象。这将允许人们明确地说x>
= 1,依此类推,但是我在这条路线上还没有成功。

使用SymPy

SymPy的Diophantine模块的输出是一个参数化解决方案,例如

(t_0, 2627*t_0 + 161*t_1 - 19200, -4816*t_0 - 295*t_1 + 35200)

在您的示例中。可以将其循环使用,以非常有效的方式生成解决方案。症结在于寻找参数t_0和t_1的界限。由于这只是一个示例,我查看了上面的最后一个表达式,并将限制35200/4816和35200/295直接插入下面的循环中。

from sympy import *x, y, z = symbols('x y z')[s] = diophantine(x*411 + y*295 + z*161 - 3200)print(s)t_0, t_1 = s[2].free_symbolsfor t0 in range(int(35200/4816)+1):    for t1 in range(int(35200/295)+1):        sol = [expr.subs({t_0: t0, t_1: t1}) for expr in s]        if min(sol) > 0: print(sol)

输出为

[4, 2, 6]



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/456009.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号