use crate::modules::companion::{Mat, identity, multiply_mat};
use crate::modules::field::Field;
use std::ops::{Add, Mul};
pub fn poly_matrix_eval(g_coeffs: &[u64], c: &Mat) -> Mat {
let k = c.len();
let mut powers: Vec<Mat> = Vec::with_capacity(g_coeffs.len());
powers.push(identity(k));
if g_coeffs.len() > 1 {
powers.push(c.clone());
for e in 2..g_coeffs.len() {
let next = multiply_mat(&powers[e-1], c);
powers.push(next);
}
}
let mut accum = vec![vec![Field::zero(); k]; k];
for (i, &coef) in g_coeffs.iter().enumerate() {
if coef == 0 { continue; }
let mulf = Field::new(coef as u128);
let pow = &powers[i];
for r in 0..k {
for c in 0..k {
let addval = pow[r][c].mul(mulf);
accum[r][c] = accum[r][c].add(addval);
}
}
}
accum
}