Статья Автор: Деникина Н.В., Деникин А.В.

Парсинг выражений и трансформации

Парсинг выражений и трансформации

Проблема с оператором ^

В стандартном 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)^21
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 + другие

Но лучше указывать явно, чтобы контролировать поведение парсера.


Печать