使用 SymPy 对复合物上的多项式进行全因式分解

Full factorization of polynomials over complexes with SymPy

我想完全分解一个多项式,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 sympyasmeurer 给出的解决方案有效:

>>> 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

asmeurer 给出了解决方案:

>>> 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中找过,但我没有找到任何东西。 此外,factor 可以将 domain 作为可选参数,我相信它允许指定进行分解的集合,但不是

>>> factor(z**2 + 2, z, domain='Z')
 2
z  + 2
>>> factor(z**2 + 2, z, domain='R')
    /     2      \
2.0*[=15=].5*z  + 1.0/
>>> factor(z**2 + 2, z, domain='C')
     2
1.0*z  + 2.0

域参数应该有效,在高斯有理数的情况下,您还可以使用 gaussian=True,它等同于 extension=I:

In [24]: factor(z**2 + 1, gaussian=True)
Out[24]: (z - ⅈ)⋅(z + ⅈ)

但这在您的情况下不起作用,因为因式分解需要超过 QQ(I, sqrt(2)) 而不是 QQ(I)。域 'R''C' 没有按预期工作的原因是因为它们是不精确的浮点域,而不是表示纯数学意义上的实数或复数的域,因式分解是

上述方法可以与

结合使用
In [28]: e = z**2 + 2

In [29]: factor(e, extension=roots(e))
Out[29]: (z - √2⋅ⅈ)⋅(z + √2⋅ⅈ)