poulpy/rlwe/src/ciphertext.rs
rlwe/src/ciphertext.rsRaw
1use crate::elem::{Elem, ElemCommon};
2use crate::parameters::Parameters;
3use base2k::{Infos, 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 rows(&self) -> usize {
42 self.elem().rows()
43 }
44
45 fn cols(&self) -> usize {
46 self.elem().cols()
47 }
48
49 fn at(&self, i: usize) -> &T {
50 self.elem().at(i)
51 }
52
53 fn at_mut(&mut self, i: usize) -> &mut T {
54 self.elem_mut().at_mut(i)
55 }
56
57 fn log_base2k(&self) -> usize {
58 self.elem().log_base2k()
59 }
60
61 fn log_scale(&self) -> usize {
62 self.elem().log_scale()
63 }
64}
65
66impl Ciphertext<VecZnx> {
67 pub fn new(module: &Module, log_base2k: usize, log_q: usize, rows: usize) -> Self {
68 Self(Elem::<VecZnx>::new(module, log_base2k, log_q, rows))
69 }
70}
71
72pub fn new_rlwe_ciphertext(module: &Module, log_base2k: usize, log_q: usize) -> Ciphertext<VecZnx> {
73 let rows: usize = 2;
74 Ciphertext::<VecZnx>::new(module, log_base2k, log_q, rows)
75}
76
77pub fn new_gadget_ciphertext(
78 module: &Module,
79 log_base2k: usize,
80 rows: usize,
81 log_q: usize,
82) -> Ciphertext<VmpPMat> {
83 let cols: usize = (log_q + log_base2k - 1) / log_base2k;
84 let mut elem: Elem<VmpPMat> = Elem::<VmpPMat>::new(module, log_base2k, 2, rows, cols);
85 elem.log_q = log_q;
86 Ciphertext(elem)
87}
88
89pub fn new_rgsw_ciphertext(
90 module: &Module,
91 log_base2k: usize,
92 rows: usize,
93 log_q: usize,
94) -> Ciphertext<VmpPMat> {
95 let cols: usize = (log_q + log_base2k - 1) / log_base2k;
96 let mut elem: Elem<VmpPMat> = Elem::<VmpPMat>::new(module, log_base2k, 4, rows, cols);
97 elem.log_q = log_q;
98 Ciphertext(elem)
99}