Sympy中的伪环中的自定义简化规则

时间:2018-05-09 18:42:14

标签: python sympy symbolic-math algebra

我使用Sympy来表示自定义交换伪环的元素。我想让Sympy知道我的域名中的一些特定的简化规则,如

x*x = x
n*x = x

根据这些规则,我希望在x*y*x + y*x中简化x*y之类的内容。 Sympy有办法做到这一点吗?你推荐其他的libs吗? (我只使用expandsimplify,平等测试,subsparse_expr

2 个答案:

答案 0 :(得分:1)

经过多次实验,我最好的猜测是根据扩展路径使用常量的自定义替换(参见Sympy doc on Epath

formula = expand(simplify(EPath("/*/*/Integer").apply(formula, lambda x: Integer(1))))
formula = expand(simplify(EPath("/*/Integer").apply(formula, lambda x: Integer(1))))
formula = expand(simplify(EPath("/Integer").apply(formula, lambda x: Integer(1))))

这三行基本上做了所需的简化(例如x*y*x + y*x - > x*y)。

可能有更优雅的解决方案,但我发布这个答案,因为它可以帮助其他人。

答案 1 :(得分:1)

以下是一种解决方案:

expr = x*y*x + x*y
expr = expr.subs(x*x, x) # to apply the restriction x*x = x
expr = expr.subs([(n*x, x) for n in expr.args if n%1==0]) #  n*x = x for all n in Z

在这里

  • expr.subs(x*x, x)方法用$ x $代替$ x ^ 2 $。
  • expr.args属性给出了expr的所有变量的列表。
  • n%1==0条件保证人&n&为整数。