python中正整数怎么表示_python – 获得线性方程的所有正整数解

SymPy可以solve Diophantine equations,但没有内置的方法来生成积极的解决方案.使用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,6),)

在幕后,integral_points很可能只运行一个多循环;虽然当它似乎不起作用时,它会尝试使用史密斯普通形式.

我知道你想要积极的解决方案,但是(a)很容易从答案中排除任何零含有元组; (b)在解决之前,用x-1等替换x也很容易; (c)坚持使用“非负”可以很容易地使用Mixed Integer Linear Programming module创建一个多面体

如上.

根据文档,人们还可以直接从不等式系统(“Hrep”)构建Polyhedron object.这将允许一个人明确地说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,z = symbols('x y z')

[s] = diophantine(x*411 + y*295 + z*161 - 3200)

print(s)

t_0,t_1 = s[2].free_symbols

for 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,6].

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值