用SymPy对复数的多项式进行全因式分解

问题描述 投票:0回答:1

我想把一个多项式完全分解。从而将其分解为复数.

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

如同meurer 给出了一个解决方案来做这件事。

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

我找的是 文件的 factor但我没有找到任何东西。 更进一步。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
python math sympy polynomial-math
1个回答
2
投票

域论证应该可以,在高斯理式的情况下,你也可以用 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⋅ⅈ)
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.