辛复形上多项式的全因式分解

2024-10-04 03:27:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我想完全分解一个多项式,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

Tags: domainextensionit整数sqrt解决方案sympyfactor
1条回答
网友
1楼 · 发布于 2024-10-04 03:27:06

域参数应该有效,在高斯有理数的情况下,您也可以使用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⋅ⅈ)

相关问题 更多 >