Кажется, что A - более старая dll, потому что она используется многими другими. Что кажется плохим, так это то, что вам нужно изменить A так, чтобы он вызывал B явно, это может указывать на то, что вы собираетесь снова и снова вносить изменения в A. Это плохая новость, потому что изменение A потребует перестройки всех остальных dll.
Вам нужно будет абстрагироваться от того, как B выполняет уравнения или как A решает уравнения, вводя обратный вызов любой формы, которую вы передаете B (виртуальный, обратный вызов, шаблон). Я пойду на B, так как A старше и, вероятно, более используется. Вот некоторый псевдокод, где Solver - это класс A, Equation - это класс B:
solver=new Solver;
equation=new Equation(&solver);
Solver должен реализовать своего рода абстрактный интерфейс. Лучшее решение зависит от вашего языка и структуры. Google для "принципа инверсии зависимости" или "внедрения зависимости".