我使用Sympy来表示自定义交换伪环的元素。我想让Sympy知道我的域名中的一些特定的简化规则,如
x*x = x
n*x = x
根据这些规则,我希望在x*y*x + y*x
中简化x*y
之类的内容。 Sympy有办法做到这一点吗?你推荐其他的libs吗? (我只使用expand
,simplify
,平等测试,subs
和parse_expr
)
答案 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&为整数。