Численное решение для выполнения этого многократно надежным и стабильным образом включает: (1) Формируют сопутствующую матрицу, (2) находят собственные значения сопутствующей матрицы.
Вы можете подумать, что решить эту проблему сложнее, чем оригинальную, но именно так решение реализовано в большинстве рабочих кодов (скажем, Matlab).
Для многочлена:
p(t) = c0 + c1 * t + c2 * t^2 + t^3
сопутствующая матрица:
[[0 0 -c0],[1 0 -c1],[0 1 -c2]]
Найти собственные значения такой матрицы; они соответствуют корням исходного многочлена.
Для того, чтобы сделать это очень быстро, загрузите подпрограммы единственного значения из LAPACK, скомпилируйте их и свяжите с вашим кодом. Делайте это параллельно, если у вас слишком много (скажем, около миллиона) наборов коэффициентов.
Обратите внимание, что коэффициент t^3
равен единице, если это не так в ваших полиномах, вам придется разделить все это на коэффициент и затем продолжить.
Удачи.
Редактировать: Numpy и октава также зависят от этой методологии для вычисления корней полиномов. Смотрите, например, эту ссылку .