gpt4 book ai didi

sympy laurent多项式因子

转载 作者:行者123 更新时间:2023-12-04 20:30:18 25 4
gpt4 key购买 nike

我想这一定有一个简单的答案,但我搜索了很长时间,没有找到。

例子:一个简单的洛朗多项式,所以
>> p = 2*y*x**2+4*y/x
分解给出
>> factor(p)
2*y*(x**3 + 2)/x
如何提取因子 2*y/x ?当表达式不是多项式时,是否有一种简单的方法来获得表达式中的公因数?我尝试了很多,但没有发现任何令人满意的东西。分解必须存在于 factor() 的步骤中的某处。 , 对?

最佳答案

正如@unutbu 指出的,来自 this question你可以看到 factor_list以更易于使用的方式给出多项式的因子。

不幸的是,SymPy 实际上并不处理 Laurent 多项式(参见 https://github.com/sympy/sympy/issues/5131)。对于高阶项,您实际上可能得​​不到您所期望的结果。 SymPy 所做的是看到 p是一个有理函数,所以它分别因式分解分子和分母。

如果你也想这样做,你可以使用类似的东西

n, d = fraction(cancel(p))
factor_list(n)
factor_list(d)

并分别操纵这些因素。
cancel将确保没有重复,否则 factor(p) 会自动发生。 ,并且它也将表达式置于有理形式使得 fraction将工作。您也可以使用 p.as_numer_denom()跳过这一步(如果它最终很慢)。

或者,您可能需要考虑 x1/x作为多项式的独立生成器。这是上述问题的(更正)函数
def aspoly1t(p, t, z=Symbol('z')):
"""
Rewrite p, a polynomial in t and 1/t, as a polynomial in t and z=1/t
"""
pa, pd = cancel(p).as_numer_denom()
pa, pd = Poly(pa, t), Poly(pd, t)
assert pd.is_monomial
d = pd.degree(t)
one_t_part = pa.slice(0, d + 1)
t_part = pa - one_t_part
t_part = t_part.to_field().quo(pd)
one_t_part = Poly.from_list(reversed(one_t_part.rep.rep), *one_t_part.gens, domain=one_t_part.domain)
one_t_part = one_t_part.replace(t, z) # z will be 1/t
ans = t_part.as_poly(t, z) + one_t_part.as_poly(t, z)
return ans

(有一天,Poly 会以 Poly(p, x, 1/x) 的形式原生支持它)然后您可以使用 factor_list对此:
>>> aspoly1t(p, x)
Poly(2*y*x**2 + 4*y*z, x, z, domain='ZZ[y]')
>>> factor_list(aspoly1t(p, x))
(2, [(Poly(y, x, y, z, domain='ZZ'), 1), (Poly(x**2 + 2*z, x, y, z, domain='ZZ'), 1)])

请注意,此处的因子并不相同,因此您想如何解释和分解 Laurent 多项式确实很重要。

关于sympy laurent多项式因子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47782407/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com