Выбор между различными факторизациями выражений в SymPy

Скажем, у меня есть следующее выражение:

a*b*c + b*c + a*d

Его можно разложить на множители как:

b*(a*c + c) + (a*d)

, или как

c*(a*b + b) + (a*d)

, или как

a*d + b*c*(a + 1)

среди других возможностей.

Для других выражений количество возможностей может быть намного больше.

У меня вопрос, есть ли у SymPy какая-нибудь утилита, которая позволяет пользователю выбирать, какие из них отображать? Есть ли способ указать общий коэффициент / коэффициенты для использования при факторизации / группировке терминов в выражении?

РЕДАКТИРОВАТЬ: Как @ user772649 указывает ниже, я могу использовать для этого collect . Однако collect , кажется, дает разные результаты в зависимости от начальной факторизации математического выражения, например:

a,b,c,d = symbols("a,b,c,d")

# These two equations are mathematically equivalent:
eq1 = a*b*c + b*c + a*d
eq2 = a*d + b*c*(a + 1)

print collect(eq1, a)
print collect(eq2, a)

печатает:

a*(b*c + d) + b*c
a*d + b*c*(a + 1)

Уравнения eq1 и eq2 математически эквивалентны, но collect выводит разную факторизацию для каждого из них, несмотря на то, что вызов команды collect был одинаковым для обоих. Это подводит меня к следующим двум вопросам:

  1. Есть ли способ «развернуть» выражение перед вызовом collect ?
  2. Существует ли способ «сбора» (разложения выражения) на множители, инвариантный по отношению к исходной факторизации, без необходимости сначала расширять выражение?
8
задан Amelio Vazquez-Reina 31 July 2011 в 22:26
поделиться