使用 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 sympy,asmeurer 给出的解决方案有效:
>>> 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⋅ⅈ)
我想完全分解一个多项式,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,asmeurer 给出的解决方案有效:
>>> 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⋅ⅈ)