A * B + C - D (C + A * B) - D C + (-D + B * A)
Как установить факт (не)равенства пары таких вот арифметических выражений? Вчера мне казалось что это лёгкая задачка — нужно построить деревья для выражений и функцию сравнения деревьев написать. Сегодня мне так перестало казаться — чтобы функция получилась достаточно простой, по-видимому, придётся с деревьями манипуляции проводить какие-то.
Ещё можно потестить на случайных наборах чисел — присваивать произвольные значения, считать результат и проверять что он совпадает. Этот вариант мне не нравится — тут и вопросы точности и т.п. :)
Или если уж говорить о манипуляциях, казалось бы надо все скобки пораскрывать чтобы к некоему унифицированному виду прийти, потом отсортировать слагаемые и множители и ура. Но выражения в знаменателях по-моему усложняют этот подход. %)
Всё действительно так сложно, или я не вижу какого-то более разумного пути?
P.S. Набор действий ограничим четырьмя (+ - * /
).
P.P.S. М.б. в ОПН сравнивать выражения легче технически, но мне не кажется что суть это упростит.
Домножить каждое выражение на каждый знаменатель? (Остается открытым вопрос, изменяет ли каждое домножение чью-нибудь область определение)
Что ж, спасибо! Пожалуй так и сделаю. С областями определений ладно — я пожалуй готов считать выражения "равными" с точностью до выколотых точек / линий и т.п. Всё равно лучше пока не получается придумать %)
Какие ограничения на операнды?
В случае, если все операнды -- переменные или числа, выражение наверное можно представить в каноническом виде (в виде полинома, например, если раскрыть все скобки и привести подобные):
A1·x10·...·xn0 + A2·x10·...·xn1 + ... + Aknx1k - 1·...·xnk - 1
А затем сравнить коэффициенты.
Если в операндах есть произвольные функции -- задача наверное не разрешима (тк не все функции можно вычислить).
Для функций определенного вида наверное есть какие нибудь специальные решения.
А если использовать ряд Тэйлора?
Хотя правильность (достаточность и необходимость) такого метода зависит еще от того, какие конкретно значения могут принимать переменные. Если например они все могут быть только равны нулю, то такой метод будет достаточный, но не необходимый.
Операнды — просто переменные, по крайней мере пока усложнять что-то не хочется :)
В целом тоже склоняюсь к приведению к некоему общему виду (каноническому, сортированному и т.п.) — только нюансы вроде деления смущали...
Погуглите по запросу "Constant Problem". Для алгебраических функций (а у Вас как раз они) эта задача точно разрешима.