#pragma once #include "type_checks.h" #include #include namespace fratio { template ::value || is_complex_t::value>> struct VietaAlgo; template struct VietaAlgo { // Vieta's computation: https://en.wikipedia.org/wiki/Vieta%27s_formulas static std::vector polyCoeffFromRoot(const std::vector& poles); }; template std::vector VietaAlgo::polyCoeffFromRoot(const std::vector& poles) { std::vector coeff(poles.size() + 1, 0); coeff[0] = 1; for (size_t i = 0; i < poles.size(); ++i) { for (size_t k = i + 1; k > 0; --k) { coeff[k] = coeff[k] - poles[i] * coeff[k - 1]; } } return coeff; } } // namespace fratio