Hacer todos los símbolos conmutativos en una expresión simpy

Supongamos que tiene una serie de símbolos no conmutativos dentro de una expresión sympy, algo como

a, c = sympy.symbols('a c', commutative=False) b = sympy.Symbol('b') expr = a * c + b * c 

¿Cuál es la forma preferida de hacer que todos los símbolos en la expresión sean conmutativos, de modo que, por ejemplo, sympy.simplify(allcommutative(expr)) = c * (a + b) ?

En esta respuesta , se afirma que no hay forma de cambiar la conmutatividad de un símbolo después de la creación sin reemplazar un símbolo, pero ¿tal vez hay una manera fácil de cambiar en bloques todos los símbolos de una expresión como esta?

Si desea que Eq(expr, c * (a + b)) evalúe como Verdadero, deberá reemplazar los símbolos por otros símbolos que conmutan. Por ejemplo:

 replacements = {s: sympy.Dummy(s.name) for s in expr.free_symbols} sympy.Eq(expr, c * (a + b)).xreplace(replacements).simplify() 

Esto devuelve True.

Dos comentarios:

  1. los factores no conmutativos serán importantes (aunque respetan el lado en el que aparece nc expr)
  2. Si bien tiene una respuesta sólida, una respuesta simple que a menudo será lo suficientemente buena es simplemente sintetizar la versión en cadena de la expresión.

Ambos se muestran a continuación:

 >>> import sympy >>> a, c = sympy.symbols('a c', commutative=False) >>> b = sympy.Symbol('b') >>> expr = a * c + b * c >>> factor(expr) (b + a)*c >>> S(str(_)) c*(a + b)