Я пытаюсь символически упростить уравнения в C # без использования каких-либо библиотек. Конечной целью является формат:
(a * b * c * d * ... + a1 * b1 * c1 * d1 * ... + a2 * b2 * c2 * d2 * ... +...) / (e * f * g * h * ... + e1 * f1 * g1 * h1 * ... + e2 * f2 * g2 * h2 * ... + ...)
означает сумму продуктов, деленную на другую сумму продуктов. Я дошел до того, что могу избавиться от очевидных общих факторов, например:
(a b + a c) / (a e + a d)
правильно упростит до
(b + c) / (e + d)
Однако я не знаю, как выделить более сложные вещи, например (a ^ 2 * x ^ 2 + a b x ^ 2 + a b x + a + x b ^ 2 + b) / (a c x ^ 2 + a d x + a + b c x ^ 2 + b d * x + b)
совпадает с(a x ^ 2 + b x + 1) / (c x ^ 2 + d x + 1), когда вы выводите (a + b) из числителя и знаменателя
Мой вопрос заключается в том, как создать алгоритм, который будет символически выделять такие термины (даже для очень длинных и сложных уравнений) с учетом суммы продуктов по сравнению с форматом суммы продуктов.
Редактировать: для этой задачи можно смело предположить, что ни одна из переменных не равна нулю