首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用SymPy求解丢番图方程x^2-2w^2+2y^2-z^2-常数

如何用SymPy求解丢番图方程x^2-2w^2+2y^2-z^2-常数
EN

Stack Overflow用户
提问于 2021-12-27 14:00:07
回答 2查看 181关注 0票数 0

我有一个三重态,例如(1806336, 1849600, 93636),我需要解丢番图方程:

代码语言:javascript
复制
x^2-2w^2+2y^2-z^2-constant=0

这里的常数是1806336 + 1849600 - 93636

我试过的是:

代码语言:javascript
复制
from sympy.solvers.diophantine.diophantine import diop_general_pythagorean
from sympy.abc import x, w, y, z
tuple = [1806336, 1849600, 93636]
s = tuple[0]
t = tuple[1]
u = tuple[2]
diop_general_pythagorean(x**2 - 2*w**2 + 2*y**2 - z**2 - s-t+u)

,这会产生异常

“这个方程还没有被识别,或者还没有得到足够的简化,使得它不能以diop_classify()所认可的形式出现。”

没有成功,我也试图避免将常量用作变量,并直接写道:

代码语言:javascript
复制
diop_general_pythagorean(x**2 - 2*w**2 + 2*y**2 - z**2 - 3562300)

错误仍然存在。如果有机会直接用一个常数来解这样的丢番图方程,那就太好了,我可以用变量来表示。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-28 14:13:38

也许Z3是一种选择?

代码语言:javascript
复制
from z3 import Ints, solve

x, y, z, w = Ints('x y z w')
s, t, u = (1806336, 1849600, 93636)
solve(x**2 - 2*w**2 + 2*y**2 - z**2 - s-t+u==0)

使[x = -368, w = -865, z = 14, y = 1569]成为一种可能性。

票数 3
EN

Stack Overflow用户

发布于 2021-12-28 14:06:18

您已经建议了一种以SymPy可以帮助的方式来处理这个问题的方法。SymPy可以求解x**2 - y**2 - c,其中c是常量。你的问题可以用这种形式分为三部分:

代码语言:javascript
复制
x**2 - w**2 - s + y**2 + w**2 - t + y**2 - z**2 + u = 0

下面是一种方法,使用一个较小的常量28,我将将其分解为15 + 8 + 5。我将把输出限制为正数,因为负数是多余的,因为每个值都是平方的。

代码语言:javascript
复制
>>> from sympy import diophantine
>>> from sympy.abc import x, y
>>> pos = lambda eq: [i for i in diophantine(eq) if all(j>0 for j in i)]

由于我用相同的符号将28项分解为3个项,所以我将为这3个c值求解c,并寻找适合于该模式的解决方案:

代码语言:javascript
复制
>>> pos(x**2-y**2-15)
[(8, 7), (4, 1)]
>>> pos(x**2-y**2-8)
[(3, 1)]
>>> pos(x**2-y**2-5)
[(3, 2)]

对于(x,w),(y,w),(y,z)点(4,1),(3,1),(3,2)功。因此,在st的子问题之间寻找一个解决方案,后者有一个匹配的第二个元素,然后一个u的解决方案,其中第一个元素与st候选项中的第一个元素匹配。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70496447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档