use crate::{
integer::Z,
integer_mod_q::{Modulus, Zq},
};
impl Zq {
pub fn get_representative_least_nonnegative_residue(&self) -> Z {
self.value.clone()
}
pub fn get_representative_least_absolute_residue(&self) -> Z {
let mod_z = Z::from(&self.modulus);
if self.value < mod_z.div_ceil(2) {
self.value.clone()
} else {
Z::from(self.modulus.clone()) - self.value.clone()
}
}
pub fn get_mod(&self) -> Modulus {
self.modulus.clone()
}
}
#[cfg(test)]
mod test_get_representative_least_nonnegative_residue {
use super::{Z, Zq};
#[test]
fn get_small() {
let value_0 = Zq::from((2, 20));
let value_1 = Zq::from((-2, 20));
let res_0 = value_0.get_representative_least_nonnegative_residue();
let res_1 = value_1.get_representative_least_nonnegative_residue();
assert_eq!(res_0, Z::from(2));
assert_eq!(res_1, Z::from(18));
}
#[test]
fn get_large() {
let value_0 = Zq::from((i64::MAX, u64::MAX));
let value_1 = Zq::from((i64::MIN, u64::MAX));
let res_0 = value_0.get_representative_least_nonnegative_residue();
let res_1 = value_1.get_representative_least_nonnegative_residue();
assert_eq!(res_0, Z::from(i64::MAX));
assert_eq!(res_1, Z::from(i64::MAX));
}
}
#[cfg(test)]
mod test_get_representative_least_absolute_residue {
use super::{Z, Zq};
#[test]
fn get_small() {
let value_0 = Zq::from((2, 20));
let value_1 = Zq::from((-2, 20));
let res_0 = value_0.get_representative_least_absolute_residue();
let res_1 = value_1.get_representative_least_absolute_residue();
assert_eq!(res_0, Z::from(2));
assert_eq!(res_1, Z::from(2));
}
#[test]
fn get_large() {
let value_0 = Zq::from((i64::MAX, u64::MAX));
let value_1 = Zq::from((u64::MAX - 1, u64::MAX));
let res_0 = value_0.get_representative_least_absolute_residue();
let res_1 = value_1.get_representative_least_absolute_residue();
assert_eq!(res_0, Z::from(i64::MAX));
assert_eq!(res_1, Z::from(1));
}
#[test]
fn get_special() {
let value_0 = Zq::from((10, 20));
let value_1 = Zq::from((0, 20));
let res_0 = value_0.get_representative_least_absolute_residue();
let res_1 = value_1.get_representative_least_absolute_residue();
assert_eq!(res_0, Z::from(10));
assert_eq!(res_1, Z::from(0));
}
}
#[cfg(test)]
mod test_get_mod {
use super::{Modulus, Zq};
#[test]
fn get_small() {
let value = Zq::from((2, 20));
let modulus = value.get_mod();
assert_eq!(modulus, Modulus::from(20));
}
#[test]
fn get_large() {
let value = Zq::from((2, u64::MAX));
let modulus = value.get_mod();
assert_eq!(modulus, Modulus::from(u64::MAX));
}
}