Парсинг выражений и трансформации
Проблема с оператором ^
В стандартном Python оператор ^ означает побитовое XOR, а не возведение в степень. Поэтому sympify("x^2") даст неправильный результат.
Для корректной обработки ^ как степени используются трансформации.
Трансформации в parse_expr
Модуль sympy.parsing.sympy_parser содержит набор трансформаций:
from sympy.parsing.sympy_parser import (
parse_expr,
standard_transformations, # базовые преобразования
convert_xor, # ^ → ** (степень)
implicit_multiplication_application # 2x → 2*x
)
Пример использования:
from sympy.parsing.sympy_parser import parse_expr, standard_transformations, convert_xor
# Создаём набор трансформаций
transformations = standard_transformations + (convert_xor,)
# Теперь ^ работает как степень
expr = parse_expr("x^2 + y^2", transformations=transformations)
print(expr) # x**2 + y**2
Разница между simplify и factor
| Функция |
Что делает |
Пример |
simplify |
Общее упрощение (тригонометрия, дроби, радикалы) |
sin(x)^2 + cos(x)^2 → 1 |
factor |
Факторизация (разложение на множители) |
x^2 + 2*x*y + y^2 → (x + y)**2 |
Важно: simplify НЕ факторизует полиномы, а factor НЕ упрощает тригонометрию.
Комбинация factor(simplify(expr))
Для получения максимально упрощённого и факторизованного результата используйте комбинацию:
from sympy import simplify, factor
result = factor(simplify(expr))
Примеры:
| Вход |
simplify |
factor |
factor(simplify()) |
x^2 + 2*x*y + y^2 |
x**2 + 2*x*y + y**2 |
(x + y)**2 |
(x + y)**2 |
sin(x)^2 + cos(x)^2 |
1 |
sin(x)**2 + cos(x)**2 |
1 |
(x+1)^2 - (x-1)^2 |
4*x |
4*x |
4*x |
Полное решение задачи
from sympy import simplify, factor
from sympy.parsing.sympy_parser import parse_expr, standard_transformations, convert_xor
# Считываем выражение
expression = input()
# Преобразуем строку в символьное выражение (^ = степень)
expr = parse_expr(expression, transformations=standard_transformations + (convert_xor,))
# Упрощаем и факторизуем
result = factor(simplify(expr))
# Выводим результат
print(result)
Альтернатива: transformations='all'
Вместо явного указания трансформаций можно использовать 'all':
expr = parse_expr("2x^2", transformations='all')
# Включает convert_xor + implicit_multiplication + другие
Но лучше указывать явно, чтобы контролировать поведение парсера.