我试图理解为什么求解器在此代码中找不到解决方案
R.<x,y,z,w> = BooleanPolynomialRing()
S = PolynomialSequence([x*y+z,x+y])
sol = S.solve(); sol
[]
对我来说,解决方案是x = 1; y = 1且z = 1,或者我错了?
答案 0 :(得分:1)
通过仔细阅读我们正在使用的solve
方法的文档,可以找到这个返回值的解释(以及如何获得更令人满意的),但我同意你的看法,这个返回值令人费解
要访问该方法的文档,请键入S.solve?
,要访问源代码,请键入S.solve??
。这还将显示定义此方法的文件,然后您可以在系统上或在Sage source code at GitHub上在线阅读此文件。
作为参考,我使用Sage 6.3。删除不起作用的w
,并通过编写Sequence
并且不给解决方案命名略微简化,您的示例变为:
sage: R.<x,y,z> = BooleanPolynomialRing()
sage: S = Sequence([x * y + z, x + y])
sage: S.solve()
[]
我们确实感到惊讶,因为(0,0,0)和(1,1,1)是两个明显的解决方案。
sage: obvious_0 = {x: 0, y: 0, z: 0}
sage: obvious_1 = {x: 1, y: 1, z: 1}
sage: S.subs(obvious_0)
[0, 0]
sage: S.subs(obvious_1)
[0, 0]
这是因为此solve
方法具有可选参数eliminate_linear_variables
,默认情况下设置为True
,这会将变量的所有线性匹配项移除到方程式中。在我们的例子中,这只是删除了所有方程式。
这个solve
方法的另一个可能令人惊讶的特征是,如果多项式序列为空,则返回一个空列表:
sage: S = S[0:]
sage: S.solve()
(而有人可能会争辩说任何东西都是一个空方程列表的解决方案)。
获得多项式序列的解:
sage: S.solve(eliminate_linear_variables=False)
[{z: 0, y: 0, x: 0}]
这里我们只得到一个解决方案。这是因为solve
方法的另一个可选参数n
表示最多返回n
个解决方案,默认设置为1。将其设置为Infinity
以获取所有解决方案。
sage: S.solve(n=Infinity,eliminate_linear_variables=False)
[{z: 0, y: 0, x: 0}, {z: 1, y: 1, x: 1}]