SymPy - обработка чисел как символов - PullRequest
0 голосов
/ 29 ноября 2018

Как я могу трактовать числа как символы в SymPy?

Например, если я выполняю факторизацию с символами, я получаю:

from sympy import factor
factor('a*c*d + a*c*e + a*c*f + b*c*d + b*c*e + b*c*f')
c*(a + b)*(d + e + f)

Мне бы хотелось, чтобы такое же поведение, когда яЯ использую цифры в выражении.Вместо

from sympy import factor
factor('2006*c*d + 2006*c*e + 2006*c*f + 2007*c*d + 2007*c*e + 2007*c*f')
4013*c*(d + e + f)

хотелось бы получить

from sympy import factor
factor('2006*c*d + 2006*c*e + 2006*c*f + 2007*c*d + 2007*c*e + 2007*c*f')
c*(2006 + 2007)*(d + e + f)

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Обман символов для спасения: замените свои номера на символы с именем, данным номером.В вашем случае вам не нужно искать отрицательные версии, поэтому следующее просто:

>>> s = '2006*c*d + 2006*c*e + 2006*c*f + 2007*c*d + 2007*c*e + 2007*c*f'
>>> eq = S(s, evaluate=False); eq
2006*c*d + 2007*c*d + 2006*c*e + 2007*c*e + 2006*c*f + 2007*c*f
>>> reps = dict([(i,Symbol(str(i))) for i in _.atoms(Integer)]); reps
{2006: 2006, 2007: 2007}
>>> factor(eq.subs(reps))
c*(2006 + 2007)*(d + e + f)

Примечание: evaluate=False используется для предотвращения объединения одинаковых терминов в 4013*c*d + 4013*c*e + 4013*c*f.

0 голосов
/ 29 ноября 2018

Замените каждую константу уникальным символом.Фактор полученного выражения.Замените уникальные символы константами.

Для вашего конкретного случая, что-то вроде этого:

simple = factor('const2006*c*d + const2006*c*e + const2006*c*f + const2007*c*d + const2007*c*e + const2007*c*f')
simple.replace("const", '')
print(simple)

Это должно дать вам желаемый результат.Вы можете идентифицировать числовые токены в выражении с помощью простого регулярного выражения или тривиального синтаксического анализатора, каждый из которых описан во многих других местах.

...