use crate::crypto::UnsignedTorus;
use crate::math::polynomial::{MonomialDegree, Polynomial};
use crate::math::random;
use rand::Rng;
fn test_multiply_divide_unit_monomial<T: UnsignedTorus>() {
let mut rng = rand::thread_rng();
let polynomial_size = (rng.gen::<usize>() % 2048) + 1;
let mut poly = Polynomial::from_container(
random::random_uniform_tensor::<T>(polynomial_size).into_container(),
);
let ground_truth = poly.clone();
let mut r: usize = rng.gen();
r %= polynomial_size;
poly.update_with_wrapping_monic_monomial_mul(MonomialDegree(r));
poly.update_with_wrapping_unit_monomial_div(MonomialDegree(r));
assert_eq!(&poly, &ground_truth);
let mut r_big: usize = rng.gen();
r_big = r_big % polynomial_size + 2048;
poly.update_with_wrapping_monic_monomial_mul(MonomialDegree(r_big));
poly.update_with_wrapping_unit_monomial_div(MonomialDegree(r_big));
assert_eq!(&poly, &ground_truth);
poly.update_with_wrapping_monic_monomial_mul(MonomialDegree(r_big));
poly.update_with_wrapping_unit_monomial_div(MonomialDegree(r_big));
assert_eq!(&poly, &ground_truth);
}
#[test]
pub fn test_multiply_divide_unit_monomial_u32() {
test_multiply_divide_unit_monomial::<u32>()
}
#[test]
pub fn test_multiply_divide_unit_monomial_u64() {
test_multiply_divide_unit_monomial::<u64>()
}