如何使用 SymPy 求解丢番图方程 x^2-2w^2+2y^2-z^2-constant
How can I solve a diophantine equation x^2-2w^2+2y^2-z^2-constant using SymPy
我有一个三元组,例如(1806336, 1849600, 93636)
,我需要求解丢番图方程:
x^2-2w^2+2y^2-z^2-constant=0
这里的常量是1806336 + 1849600 - 93636
.
我试过的是:
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)
产生异常
"This equation is not yet recognized or else has not been simplified sufficiently to put it in a form recognized by diop_classify()."
没有成功,我也尽量避免使用常量作为变量,直接写:
diop_general_pythagorean(x**2 - 2*w**2 + 2*y**2 - z**2 - 3562300)
错误依旧。如果有机会直接使用我可以表示为变量的常数来求解这样的丢番图方程,那就太好了。
您已经提出了一种 SymPy 可以提供帮助的方法来解决这个问题。 SymPy 可以解决 x**2 - y**2 - c
其中 c
是一个常数。您的问题可以用这种形式分为 3 个部分:
x**2 - w**2 - s + y**2 + w**2 - t + y**2 - z**2 + u = 0
这里有一种方法可以实现,使用较小的常量 28,我将其分解为 15 + 8 + 5
。我将把输出限制为正值,因为负值是多余的,因为每个值都是平方的。
>>> 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 个项,我将对 c
的这 3 个值求解 x**2 - y**2 - c
并寻找符合模式的解决方案:
>>> 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) 有效。因此,在具有匹配的第二个元素的 s
和 t
的子问题之间寻找解决方案,然后寻找 u
的解决方案,其第一个元素与第一个元素中的任何一个匹配s
和 t
候选人。
也许 Z3 是一个选项?
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]
作为一种可能性。
我有一个三元组,例如(1806336, 1849600, 93636)
,我需要求解丢番图方程:
x^2-2w^2+2y^2-z^2-constant=0
这里的常量是1806336 + 1849600 - 93636
.
我试过的是:
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)
产生异常
"This equation is not yet recognized or else has not been simplified sufficiently to put it in a form recognized by diop_classify()."
没有成功,我也尽量避免使用常量作为变量,直接写:
diop_general_pythagorean(x**2 - 2*w**2 + 2*y**2 - z**2 - 3562300)
错误依旧。如果有机会直接使用我可以表示为变量的常数来求解这样的丢番图方程,那就太好了。
您已经提出了一种 SymPy 可以提供帮助的方法来解决这个问题。 SymPy 可以解决 x**2 - y**2 - c
其中 c
是一个常数。您的问题可以用这种形式分为 3 个部分:
x**2 - w**2 - s + y**2 + w**2 - t + y**2 - z**2 + u = 0
这里有一种方法可以实现,使用较小的常量 28,我将其分解为 15 + 8 + 5
。我将把输出限制为正值,因为负值是多余的,因为每个值都是平方的。
>>> 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 个项,我将对 c
的这 3 个值求解 x**2 - y**2 - c
并寻找符合模式的解决方案:
>>> 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) 有效。因此,在具有匹配的第二个元素的 s
和 t
的子问题之间寻找解决方案,然后寻找 u
的解决方案,其第一个元素与第一个元素中的任何一个匹配s
和 t
候选人。
也许 Z3 是一个选项?
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]
作为一种可能性。