Python 复系数多项式的辛化简

Python 复系数多项式的辛化简,python,sympy,symbolic-math,complex-numbers,polynomial-math,Python,Sympy,Symbolic Math,Complex Numbers,Polynomial Math,研究复系数多项式的问题, 我遇到了以下问题: 假设有一个多项式p=λ^16*z+λ^15*z^2,其中λ是复数。 我想简化以下约束:λ^14=1。 因此,插上电源,我们应该: P = λ^2*z + λ*z^2. 我试过p.subsλ**14,1,但它不起作用,因为我想它假设λ是真的。因此它返回原始表达式:P=λ^16*z+λ^15*z^2,而不考虑λ^14…这是有效的: P.simplify().subs(λ**15,1).expand() lambda_, z = sym.symbols

研究复系数多项式的问题, 我遇到了以下问题:

假设有一个多项式p=λ^16*z+λ^15*z^2,其中λ是复数。 我想简化以下约束:λ^14=1。 因此,插上电源,我们应该:

P = λ^2*z + λ*z^2.
我试过p.subsλ**14,1,但它不起作用,因为我想它假设λ是真的。因此它返回原始表达式:P=λ^16*z+λ^15*z^2,而不考虑λ^14…

这是有效的:

P.simplify().subs(λ**15,1).expand()
lambda_, z = sym.symbols('lambda z', real=True)
print((lambda_**16*z + lambda_**15*z**2).subs(lambda_**14, 1))
z**2 + z

如果你假设λ是实的,这是可行的:

P.simplify().subs(λ**15,1).expand()
lambda_, z = sym.symbols('lambda z', real=True)
print((lambda_**16*z + lambda_**15*z**2).subs(lambda_**14, 1))
z**2 + z
编辑:
它实际上无论如何都不应该起作用,因为λ可能是负数。只有当λ是正数时,你想要的才是真的。

我不知道任何简单的方法来实现你想要的Symphy,但是你可以明确地替换每个值:

p = (λ**16)*z + (λ**15)*(z**2)

p = p.subs(λ**16, λ**2).subs(λ**15, λ**1)
>>> z**2*λ + z*λ**2
潜艇无法在这里工作的原因:

当m是n的因子时,subs仅在x**n中替换表达式x**m,例如:

p、 subsλ,1 >>>z**2+z p、 subsλ**2,1 >>>z**2*λ**15+z p、 subsλ**3,1 >>>z**2+z*λ**16 p、 subsλ**6,1 >>>z**2*λ**15+z*λ**16 等等。

您可以使用ratsimpmodprime函数将多项式模化为一组其他多项式。还有reduce函数,它的作用类似

>>> P = λ**16*z + λ**15*z**2
>>> ratsimpmodprime(P, [λ**14 - 1])
z**2*λ + z*λ**2

你检查了吗?Sympy是正确的;你的预期结果是错误的。例如,假设λ=e**i*2*pi/15。那么λ**15=1,但λ**16不是1。@Stelios,谢谢你的回复。如果,如你所说,我们取λ=e^i*2*pi/15,那么既然λ^15=1,我们应该得到λ^16=λ*λ^15=λ,对吗?因此,我的预期结果应该是正确的。还是我遗漏了什么?再次感谢。@Gev_2000是的,当然,你是对的。抱歉,我误读了你的帖子。@Stelios,别担心:你知道如何解决这个问题吗?谢谢,谢谢,但是如果我们有一个不同的约束,比如说λ^14=1,那么我们应该得到P=λ^2*z+λ*z^2,但是你的解在这种情况下不起作用。不知道为什么…Lambda是单位的第14根-它可以是的唯一实数值是1和-1。Gev_2000要求的结果是只有正实数的有效Lambda。他们没有指定lambda是一个正实数。如果他们这样做了,他们会得到想要的结果。我不确定你不同意什么。我的观点是你不能假设它是真实的-它有12个可能的非真实值。