use crate::integer_mod_q::{Modulus, Zq};
impl Zq {
pub fn change_modulus(&mut self, modulus: impl Into<Modulus>) {
self.modulus = modulus.into();
self.value = self.get_representative_least_nonnegative_residue();
self.reduce();
}
}
#[cfg(test)]
mod test_change_modulus {
use super::Zq;
use crate::integer_mod_q::Modulus;
use std::str::FromStr;
#[test]
fn modulus_correct() {
let mut matrix = Zq::from_str("6 mod 7").unwrap();
let modulus = Modulus::from(5);
matrix.change_modulus(&modulus);
assert_eq!("1 mod 5", matrix.to_string());
}
#[test]
fn big_modulus_correct() {
let mut matrix = Zq::from_str(&format!("6 mod {}", i64::MAX)).unwrap();
let modulus = Modulus::from(u64::MAX);
matrix.change_modulus(&modulus);
assert_eq!(format!("6 mod {}", u64::MAX), matrix.to_string());
}
#[test]
fn reduced_correct() {
let mut matrix = Zq::from_str("6 mod 7").unwrap();
let modulus = Modulus::from(2);
matrix.change_modulus(&modulus);
assert_eq!("0 mod 2", matrix.to_string());
}
}