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}