Блог пользователя RodionGork

Автор RodionGork, 10 лет назад, По-русски
A * B + C - D
(C + A * B) - D
C + (-D + B * A)

Как установить факт (не)равенства пары таких вот арифметических выражений? Вчера мне казалось что это лёгкая задачка — нужно построить деревья для выражений и функцию сравнения деревьев написать. Сегодня мне так перестало казаться — чтобы функция получилась достаточно простой, по-видимому, придётся с деревьями манипуляции проводить какие-то.

Ещё можно потестить на случайных наборах чисел — присваивать произвольные значения, считать результат и проверять что он совпадает. Этот вариант мне не нравится — тут и вопросы точности и т.п. :)

Или если уж говорить о манипуляциях, казалось бы надо все скобки пораскрывать чтобы к некоему унифицированному виду прийти, потом отсортировать слагаемые и множители и ура. Но выражения в знаменателях по-моему усложняют этот подход. %)

Всё действительно так сложно, или я не вижу какого-то более разумного пути?

P.S. Набор действий ограничим четырьмя (+ - * /).

P.P.S. М.б. в ОПН сравнивать выражения легче технически, но мне не кажется что суть это упростит.

  • Проголосовать: нравится
  • +22
  • Проголосовать: не нравится

»
10 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится

Домножить каждое выражение на каждый знаменатель? (Остается открытым вопрос, изменяет ли каждое домножение чью-нибудь область определение)

  • »
    »
    10 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Что ж, спасибо! Пожалуй так и сделаю. С областями определений ладно — я пожалуй готов считать выражения "равными" с точностью до выколотых точек / линий и т.п. Всё равно лучше пока не получается придумать %)

»
10 лет назад, # |
Rev. 12   Проголосовать: нравится +6 Проголосовать: не нравится

Какие ограничения на операнды?

В случае, если все операнды -- переменные или числа, выражение наверное можно представить в каноническом виде (в виде полинома, например, если раскрыть все скобки и привести подобные):

A1·x10·...·xn0 + A2·x10·...·xn1 + ... + Aknx1k - 1·...·xnk - 1

А затем сравнить коэффициенты.

Если в операндах есть произвольные функции -- задача наверное не разрешима (тк не все функции можно вычислить).

Для функций определенного вида наверное есть какие нибудь специальные решения.

  • »
    »
    10 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    А если использовать ряд Тэйлора?

  • »
    »
    10 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Хотя правильность (достаточность и необходимость) такого метода зависит еще от того, какие конкретно значения могут принимать переменные. Если например они все могут быть только равны нулю, то такой метод будет достаточный, но не необходимый.

  • »
    »
    10 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Операнды — просто переменные, по крайней мере пока усложнять что-то не хочется :)

    В целом тоже склоняюсь к приведению к некоему общему виду (каноническому, сортированному и т.п.) — только нюансы вроде деления смущали...

»
10 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Погуглите по запросу "Constant Problem". Для алгебраических функций (а у Вас как раз они) эта задача точно разрешима.