我想把一个多项式完全分解。从而将其分解为复数.
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
域论证应该可以,在高斯理式的情况下,你也可以用 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⋅ⅈ)