use crate::num::basic::unsigneds::PrimitiveUnsigned;
use crate::num::conversion::traits::ExactFrom;
use crate::unsigned_polynomial::UnsignedPolynomial;
use alloc::vec::Vec;
pub fn mod_power_of_2_evaluate_naive<T: PrimitiveUnsigned>(
p: &UnsignedPolynomial<T>,
x: T,
pow: u64,
) -> T {
let mut sum = T::ZERO;
for (i, &c) in p.coefficients_asc().iter().enumerate() {
let term = c.mod_power_of_2_mul(x.mod_power_of_2_pow(u64::exact_from(i), pow), pow);
sum = sum.mod_power_of_2_add(term, pow);
}
sum
}
pub fn mod_evaluate_naive<T: PrimitiveUnsigned>(p: &UnsignedPolynomial<T>, x: T, m: T) -> T {
let mut sum = T::ZERO;
for (i, &c) in p.coefficients_asc().iter().enumerate() {
sum.mod_add_assign(c.mod_mul(x.mod_pow(u64::exact_from(i), m), m), m);
}
sum
}
pub fn mod_evaluate_many_naive<T: PrimitiveUnsigned>(
p: &UnsignedPolynomial<T>,
xs: &[T],
m: T,
) -> Vec<T> {
xs.iter().map(|&x| mod_evaluate_naive(p, x, m)).collect()
}
pub fn mod_evaluate_geometric_naive<T: PrimitiveUnsigned>(
p: &UnsignedPolynomial<T>,
q: T,
k: u64,
m: T,
) -> Vec<T> {
(0..k)
.map(|j| mod_evaluate_naive(p, q.mod_pow(j, m), m))
.collect()
}