arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/rlwe/src/ciphertext.rs
rlwe/src/ciphertext.rsRaw
 1use crate::elem::{Elem, ElemCommon};
 2use crate::parameters::Parameters;
 3use base2k::{Infos, LAYOUT, Module, VecZnx, VmpPMat};
 4
 5pub struct Ciphertext<T>(pub Elem<T>);
 6
 7impl Parameters {
 8    pub fn new_ciphertext(&self, log_q: usize) -> Ciphertext<VecZnx> {
 9        Ciphertext::new(self.module(), self.log_base2k(), log_q, 2)
10    }
11}
12
13impl<T> ElemCommon<T> for Ciphertext<T>
14where
15    T: Infos,
16{
17    fn n(&self) -> usize {
18        self.elem().n()
19    }
20
21    fn log_n(&self) -> usize {
22        self.elem().log_n()
23    }
24
25    fn log_q(&self) -> usize {
26        self.elem().log_q()
27    }
28
29    fn elem(&self) -> &Elem<T> {
30        &self.0
31    }
32
33    fn elem_mut(&mut self) -> &mut Elem<T> {
34        &mut self.0
35    }
36
37    fn size(&self) -> usize {
38        self.elem().size()
39    }
40
41    fn layout(&self) -> LAYOUT {
42        self.elem().layout()
43    }
44
45    fn rows(&self) -> usize {
46        self.elem().rows()
47    }
48
49    fn cols(&self) -> usize {
50        self.elem().cols()
51    }
52
53    fn at(&self, i: usize) -> &T {
54        self.elem().at(i)
55    }
56
57    fn at_mut(&mut self, i: usize) -> &mut T {
58        self.elem_mut().at_mut(i)
59    }
60
61    fn log_base2k(&self) -> usize {
62        self.elem().log_base2k()
63    }
64
65    fn log_scale(&self) -> usize {
66        self.elem().log_scale()
67    }
68}
69
70impl Ciphertext<VecZnx> {
71    pub fn new(module: &Module, log_base2k: usize, log_q: usize, rows: usize) -> Self {
72        Self(Elem::<VecZnx>::new(module, log_base2k, log_q, rows))
73    }
74}
75
76pub fn new_rlwe_ciphertext(module: &Module, log_base2k: usize, log_q: usize) -> Ciphertext<VecZnx> {
77    let rows: usize = 2;
78    Ciphertext::<VecZnx>::new(module, log_base2k, log_q, rows)
79}
80
81pub fn new_gadget_ciphertext(module: &Module, log_base2k: usize, rows: usize, log_q: usize) -> Ciphertext<VmpPMat> {
82    let cols: usize = (log_q + log_base2k - 1) / log_base2k;
83    let mut elem: Elem<VmpPMat> = Elem::<VmpPMat>::new(module, log_base2k, 2, rows, cols);
84    elem.log_q = log_q;
85    Ciphertext(elem)
86}
87
88pub fn new_rgsw_ciphertext(module: &Module, log_base2k: usize, rows: usize, log_q: usize) -> Ciphertext<VmpPMat> {
89    let cols: usize = (log_q + log_base2k - 1) / log_base2k;
90    let mut elem: Elem<VmpPMat> = Elem::<VmpPMat>::new(module, log_base2k, 4, rows, cols);
91    elem.log_q = log_q;
92    Ciphertext(elem)
93}