我想完全分解一个多项式,thus factorize it over complexes
SymPy提供了factor
来完成它,但是我非常惊讶的是,分解只在整数根上完成,例如:
>>> from sympy import *
>>> z = symbols('z')
>>> factor(z**2 - 1, z)
(z - 1)*(z + 1)
>>> factor(z**2 + 1, z)
z**2 + 1
或
>>> factor(2*z - 1, z)
2*z - 1
>>> factor(2*z - 1, z, extension=[Integer(1)/2])
2*(z - 1/2)
已经存在一个已回答的问题:Factor to complex roots using sympy,并且asmurer给出的解决方案有效:
>>> factor(z**2 + 1, z, extension=[I])
(z - I)*(z + I)
但是您需要指定非整数根的每个除数,例如:
>>> factor(z**2 + 2, z, extension=[I])
z**2 + 2
>>> factor(z**2 + 2, z, extension=[I, sqrt(2)])
(z - sqrt(2)*I)*(z + sqrt(2)*I)
我的问题是:如何完全分解多项式(因此在复数上),而不需要给extension
每个除数
asmurer提供了一个解决方案:
>>> poly = z**2 + 2
>>> r = roots(poly, z)
>>> LC(poly, z)*Mul(*[(z - a)**r[a] for a in r])
/ ___ \ / ___ \
\z - \/ 2 *I/*\z + \/ 2 *I/
但是它应该有一种本地的方式来做,不是吗?
像factor(poly, z, complex=True)
之类的东西
我在documentation of ^{factor
可以将domain
作为可选参数,我认为它允许指定进行因式分解的集合,但不允许
>>> factor(z**2 + 2, z, domain='Z')
2
z + 2
>>> factor(z**2 + 2, z, domain='R')
/ 2 \
2.0*\0.5*z + 1.0/
>>> factor(z**2 + 2, z, domain='C')
2
1.0*z + 2.0
域参数应该有效,在高斯有理数的情况下,您也可以使用
gaussian=True
,它相当于extension=I
:但这在您的情况下不起作用,因为分解需要在
QQ(I, sqrt(2))
之上,而不是QQ(I)
。域'R'
和'C'
不能按预期工作的原因是,它们是不精确的浮点域,而不是在纯数学意义上表示实数或复数的域,并且分解是不精确的但是,上述方法可以与
相关问题 更多 >
编程相关推荐