sympy 中的多项式因式分解

2023-11-24

我正在做一个非常简单的概率计算,从 A-Z 集合中获取 X、Y、Z 的子集(具有相应的概率 x、y、z)。

由于公式非常繁重,为了处理它们,我正在尝试simplify (or collect or factor- 我不知道确切的定义)这些多项式表达式使用sympy.

所以..有这个(一个非常简单的概率计算表达式,从 A-Z 集合中获取 X、Y、Z 的子集,并具有相应的概率 x、y、z)

import sympy as sp

x, y, z = sp.symbols('x y z')

expression = (
    x * (1 - x) * y * (1 - x - y) * z +
    x * (1 - x) * z * (1 - x - z) * y +

    y * (1 - y) * x * (1 - y - x) * z +
    y * (1 - y) * z * (1 - y - z) * x +

    z * (1 - z) * y * (1 - z - y) * x +
    z * (1 - z) * x * (1 - z - x) * y
)

我想要得到这样的东西

x * y * z * (6 * (1 - x - y - z) + (x + y) ** 2 + (y + z) ** 2 + (x + z) ** 2)

一个poly,以最少的操作重写(+, -, *, **, ...) 尽可能


I tried factor(), collect(), simplify()。但结果与我的预期不同。大多数情况下我得到

2*x*y*z*(x**2 + x*y + x*z - 3*x + y**2 + y*z - 3*y + z**2 - 3*z + 3)

我知道同情可以combine将多项式化为简单形式:

sp.factor(x**2 + 2*x*y + y**2)  # gives (x + y)**2

但如何使人同情combine上面表达式的多项式?


如果这在 sympy 中是不可能的任务,可能还有其他选择吗?


这次将一些方法放在一起恰好给出了一个很好的答案。看看这种策略在您生成的方程上是否更有效,或者顾名思义,这一次是否只是一个幸运的结果,这将是很有趣的。

def iflfactor(eq):
    """Return the "I'm feeling lucky" factored form of eq."""
    e = Mul(*[horner(e) if e.is_Add else e for e in
        Mul.make_args(factor_terms(expand(eq)))])
    r, e = cse(e)
    s = [ri[0] for ri in r]
    e = Mul(*[collect(ei.expand(), s) if ei.is_Add else ei for ei in
        Mul.make_args(e[0])]).subs(r)
    return e

>>> iflfactor(eq)  # using your equation as eq
2*x*y*z*(x**2 + x*y + y**2 + (z - 3)*(x + y + z) + 3)
>>> _.count_ops()
15

顺便说一句,factor_terms 和 gcd_terms 之间的区别在于,factor_terms 会更加努力地提取常用术语,同时保留表达式的原始结构,非常像您手动执行的操作(即在 Adds 中查找可以提取的常用术语) 。

>>> factor_terms(x/(z+z*y)+x/z)
x*(1 + 1/(y + 1))/z
>>> gcd_terms(x/(z+z*y)+x/z)
x*(y*z + 2*z)/(z*(y*z + z))

物有所值,

Chris

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sympy 中的多项式因式分解 的相关文章

随机推荐