use super::Zq;
use flint_sys::fmpz_mod::fmpz_mod_set_fmpz;
impl Zq {
pub(crate) fn reduce(&mut self) {
unsafe {
fmpz_mod_set_fmpz(
&mut self.value.value,
&self.value.value,
self.modulus.get_fmpz_mod_ctx_struct(),
);
};
}
}
#[cfg(test)]
mod test_reduce {
use crate::{
integer::Z,
integer_mod_q::{Modulus, Zq},
};
const LARGE_PRIME: u64 = u64::MAX - 58;
#[test]
fn reduces_large() {
let modulus = Modulus::from(LARGE_PRIME);
let value = Z::from(u64::MAX);
let mut original = Zq { value, modulus };
let cmp_modulus = Modulus::from(LARGE_PRIME);
let cmp_value = Z::from(58);
let cmp = Zq {
value: cmp_value,
modulus: cmp_modulus,
};
assert_ne!(original, cmp);
original.reduce();
assert_eq!(original, cmp);
}
#[test]
fn reduces_small() {
let modulus = Modulus::from(17);
let value = Z::from(20);
let mut original = Zq { value, modulus };
let cmp_modulus = Modulus::from(17);
let cmp_value = Z::from(3);
let cmp = Zq {
value: cmp_value,
modulus: cmp_modulus,
};
assert_ne!(original, cmp);
original.reduce();
assert_eq!(original, cmp);
}
}