qfall_math/integer_mod_q/modulus_polynomial_ring_zq/
set.rs1use crate::integer_mod_q::{
12 Modulus, ModulusPolynomialRingZq, PolyOverZq,
13 modulus_polynomial_ring_zq::from::non_zero_positions,
14};
15use std::rc::Rc;
16
17impl ModulusPolynomialRingZq {
18 pub fn change_q(&mut self, modulus: impl Into<Modulus>) {
41 self.ntt_basis = Rc::new(None);
42
43 let new_poly_zq =
44 PolyOverZq::from((self.get_representative_least_nonnegative_residue(), modulus));
45 self.non_zero = non_zero_positions(&new_poly_zq);
46
47 self.modulus = Rc::new(new_poly_zq);
48 }
49}
50
51#[cfg(test)]
52mod test_change_q {
53 use super::ModulusPolynomialRingZq;
54 use crate::integer_mod_q::Modulus;
55 use std::str::FromStr;
56
57 #[test]
59 fn q_correct() {
60 let mut modulus = ModulusPolynomialRingZq::from_str("6 1 2 3 4 5 1 mod 7").unwrap();
61 let q = Modulus::from(8);
62
63 modulus.change_q(&q);
64
65 assert_eq!("6 1 2 3 4 5 1 mod 8", modulus.to_string());
66 }
67
68 #[test]
70 fn big_q_correct() {
71 let mut modulus =
72 ModulusPolynomialRingZq::from_str(&format!("6 1 2 3 4 5 1 mod {}", i64::MAX)).unwrap();
73 let q = Modulus::from(u64::MAX);
74
75 modulus.change_q(&q);
76
77 assert_eq!(
78 format!("6 1 2 3 4 5 1 mod {}", u64::MAX),
79 modulus.to_string()
80 );
81 }
82
83 #[test]
85 fn reduced_correct() {
86 let mut modulus = ModulusPolynomialRingZq::from_str("6 1 2 3 4 5 1 mod 7").unwrap();
87 let q = Modulus::from(2);
88
89 modulus.change_q(&q);
90
91 assert_eq!("6 1 0 1 0 1 1 mod 2", modulus.to_string());
92 }
93
94 #[test]
96 fn reset_ntt_values() {
97 let mut modulus = ModulusPolynomialRingZq::from_str("6 1 2 3 4 5 1 mod 7").unwrap();
98 let q = Modulus::from(2);
99
100 modulus.change_q(&q);
101
102 assert_eq!(vec![0, 2, 4], modulus.non_zero);
103 assert!(modulus.ntt_basis.is_none());
104 }
105}