use num_complex::Complex;
use num_traits::{Float, One, Zero};
use crate::Polynomial;
pub fn vieta_formula<T: Float>(roots: &[Complex<T>]) -> Polynomial<Complex<T>> {
let n = roots.len();
if n == 0 {
return Polynomial(vec![Complex::one()]);
}
let mut dp: Vec<Complex<T>> = vec![Complex::zero(); n + 1];
dp[0] = Complex::one();
for r in roots.iter() {
for k in (1..=n).rev() {
dp[k] = dp[k] + dp[k - 1] * r;
}
}
let mut coeffs: Vec<Complex<T>> = Vec::with_capacity(n + 1);
coeffs.push(Complex::one());
for (k, &d) in dp.iter().enumerate().skip(1) {
coeffs.push(if k % 2 == 0 { d } else { -d });
}
Polynomial(coeffs)
}