我使用 sympy.groebner 遇到以下错误:“sympy.polys.polyerrors.PolynomialError:不支持非交换表达式”。
在真实的情况下,我的表达非常困难,不容易减少。要减少的多项式
p
的开头是
我得到(其中
compute_vtmv_product
计算一个多项式 p
应该使用 Groebner 基来减少)
我尝试减少问题(与实际示例中创建/使用变量的方式相同),但问题似乎消失了
在实际情况中,变量是混合的,所以我尝试添加 a/b/c 变量与 x/y/z 变量混合,但我得到
有人知道这些问题的原因吗?
您使用的是旧版本的 SymPy,但使用最新版本 1.13.1,您会在此处看到不同的错误:
CoercionFailed: expected an integer, got a
原因是
Groebner
归约方法期望要归约的表达式应该是具有与 Groebner 基相同的生成器和定义域的多项式。有两种方法可以做到这一点:
In [21]: x, y, z = symbols('x, y, z')
In [22]: a, b, c = symbols('a, b, c')
In [23]: groebner([x, y, z])
Out[23]: GroebnerBasis([x, y, z], x, y, z, domain=ℤ, order=lex)
In [24]: groebner([x, y, z], [x, y, z, a, b, c])
Out[24]: GroebnerBasis([x, y, z], x, y, z, a, b, c, domain=ℤ, order=lex)
In [25]: groebner([x, y, z], domain=QQ[a, b, c])
Out[25]: GroebnerBasis([x, y, z], x, y, z, domain=ℚ[a, b, c], order=lex)
In [26]: G = groebner([x, y, z], domain=QQ[a, b, c])
In [27]: p = a*x + b*y + c*z
In [28]: G.reduce(p)
Out[28]: ([a, b, c], 0)