arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/rlwe/src/elem.rs
rlwe/src/elem.rsRaw
 1use crate::parameters::Parameters;
 2use base2k::{Infos, VecZnx};
 3
 4pub struct Elem {
 5    pub value: Vec<VecZnx>,
 6    pub log_base2k: usize,
 7    pub log_q: usize,
 8}
 9
10impl Elem {
11    pub fn new(n: usize, log_base2k: usize, log_q: usize, degree: usize) -> Self {
12        let limbs: usize = (log_q + log_base2k - 1) / log_base2k;
13        let mut value: Vec<VecZnx> = Vec::new();
14        (0..degree + 1).for_each(|_| value.push(VecZnx::new(n, limbs)));
15        Self {
16            value,
17            log_base2k,
18            log_q,
19        }
20    }
21
22    pub fn n(&self) -> usize {
23        self.value[0].n()
24    }
25
26    pub fn degree(&self) -> usize {
27        self.value.len()
28    }
29
30    pub fn limbs(&self) -> usize {
31        self.value[0].limbs()
32    }
33
34    pub fn log_base2k(&self) -> usize {
35        self.log_base2k
36    }
37
38    pub fn log_q(&self) -> usize {
39        self.log_q
40    }
41
42    pub fn at(&self, i: usize) -> &VecZnx {
43        assert!(i <= self.degree());
44        &self.value[i]
45    }
46
47    pub fn at_mut(&mut self, i: usize) -> &mut VecZnx {
48        assert!(i <= self.degree());
49        &mut self.value[i]
50    }
51}