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}