同态表达式的抽象表示

2024-04-25 21:26:39 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑以下两个等式:

x^y+xy

a^b+ab型

我希望能够把它们识别为完全相同的符号表达。”简化“行不通”Subs“(用a代替x等)也不总是有效的,因为变量的顺序可能会改变,等等

那么,有没有一种方法可以独立于所使用的符号来获得一个SymPy表达式的抽象表示呢?你知道吗


Tags: 方法ab顺序表达式符号subssympyxy
2条回答

与所用符号无关的表示是函数。例如

f1 = lambda x, y: (2*x+y)**2 

定义一个未绑定到x和y的函数,它们除了作为占位符之外不存在。(这是一个Python函数;也可以定义SymPy函数对象,但区别在这里并不重要。)

如果有人问你(2*x+y)**2是否与a**2 + 4*b*(a+b)相同,你会怎么做?我所知道的唯一方法是将两者简化,并尝试在所有可能的排列下匹配变量。下面的代码就是这么做的。你知道吗

from sympy import *
from itertools import permutations
f1 = lambda x, y: (2*x+y)**2
f2 = lambda a, b: a**2 + 4*b*(a+b)
vars = symbols("v0:2")    # auxiliary variables to plug in f1 and f2
identical = any([simplify(f1(*vars) - f2(*p)) == 0 for p in permutations(vars)])

现在identical是真的,因为表达式在您描述的意义上是相同的。你知道吗

如果要开始使用表达式而不是函数,则可以使用subs

x, y, a, b = symbols("x y a b")
expr1 = (2*x+y)**2
expr2 = a**2 + 4*b*(a+b)
vars = symbols("v0:2")
identical = any([simplify(expr1.subs(zip((x, y), vars)) - expr2.subs(zip((a, b), p))) for p in permutations(vars)]) 

再详细说明一下:

我对排列法不太满意。所以,我继续挖掘,我注意到SymPy生成了一个树图来表示符号表达式。树的结构就是表达的结构,它独立于符号。但是,一旦有了相应的图,就需要确定它们是否同构(即,如果两个表达式相同),即very non-trivial problem。你知道吗

相关问题 更多 >