use crate::num::basic::traits::Zero;
use crate::num::basic::unsigneds::PrimitiveUnsigned;
use crate::polynomial::Polynomial;
use crate::test_util::unsigned_polynomial::arithmetic::mod_power_of_2_mul::*;
use crate::unsigned_polynomial::UnsignedPolynomial;
use alloc::vec;
use alloc::vec::Vec;
pub fn mod_mul_naive<T: PrimitiveUnsigned>(xs: &[T], ys: &[T], m: T) -> Vec<T> {
let mut out = vec![T::ZERO; xs.len() + ys.len() - 1];
for (i, &x) in xs.iter().enumerate() {
for (o, &y) in out[i..].iter_mut().zip(ys) {
*o = o.mod_add(x.mod_mul(y, m), m);
}
}
out
}
pub fn mod_generated_coefficients<T: PrimitiveUnsigned>(len: usize, m: T, seed: u64) -> Vec<T> {
mod_power_of_2_generated_coefficients::<T>(len, T::WIDTH, seed)
.into_iter()
.map(|x| x % m)
.collect()
}
pub fn test_moduli<T: PrimitiveUnsigned>() -> Vec<T> {
let half = T::MAX >> 1;
vec![
T::ONE,
T::TWO,
T::exact_from(3),
T::exact_from(7),
half,
half + T::TWO,
T::MAX - T::ONE,
T::MAX,
]
}
pub fn mod_mul_polynomial_naive<T: PrimitiveUnsigned>(
p: &UnsignedPolynomial<T>,
q: &UnsignedPolynomial<T>,
m: T,
) -> UnsignedPolynomial<T> {
let xs = p.coefficients_asc();
let ys = q.coefficients_asc();
if xs.is_empty() || ys.is_empty() {
return UnsignedPolynomial::ZERO;
}
UnsignedPolynomial::from_coefficients_asc(mod_mul_naive(xs, ys, m))
}
pub fn long_test_moduli<T: PrimitiveUnsigned>() -> Vec<T> {
vec![T::exact_from(7), T::low_mask(T::WIDTH >> 1), T::MAX]
}