poulpy/rlwe/src/elem.rs
rlwe/src/elem.rsRaw
1use base2k::{Backend, FFT64, MatZnxDft, MatZnxDftAlloc, Module, VecZnx, VecZnxAlloc, VecZnxDft, VecZnxDftAlloc};
2
3pub struct Ciphertext<T> {
4 data: T,
5 log_base2k: usize,
6 log_q: usize,
7}
8
9impl<T> Ciphertext<T> {
10 pub fn log_base2k(&self) -> usize {
11 self.log_base2k
12 }
13
14 pub fn log_q(&self) -> usize {
15 self.log_q
16 }
17
18 pub fn data(&self) -> &T {
19 &self.data
20 }
21
22 pub fn data_mut(&mut self) -> &mut T {
23 &mut self.data
24 }
25}
26
27pub struct Plaintext<T> {
28 data: T,
29 log_base2k: usize,
30 log_q: usize,
31}
32
33impl<T> Plaintext<T> {
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 data(&self) -> &T {
43 &self.data
44 }
45
46 pub fn data_mut(&mut self) -> &mut T {
47 &mut self.data
48 }
49}
50
51pub(crate) type CtVecZnx<C> = Ciphertext<VecZnx<C>>;
52pub(crate) type CtVecZnxDft<C, B: Backend> = Ciphertext<VecZnxDft<C, B>>;
53pub(crate) type CtMatZnxDft<C, B: Backend> = Ciphertext<MatZnxDft<C, B>>;
54pub(crate) type PtVecZnx<C> = Plaintext<VecZnx<C>>;
55pub(crate) type PtVecZnxDft<C, B: Backend> = Plaintext<VecZnxDft<C, B>>;
56pub(crate) type PtMatZnxDft<C, B: Backend> = Plaintext<MatZnxDft<C, B>>;
57
58impl Ciphertext<VecZnx<Vec<u8>>> {
59 pub fn new<B: Backend>(module: &Module<B>, log_base2k: usize, log_q: usize, cols: usize) -> Self {
60 Self {
61 data: module.new_vec_znx(cols, derive_size(log_base2k, log_q)),
62 log_base2k: log_base2k,
63 log_q: log_q,
64 }
65 }
66}
67
68impl Plaintext<VecZnx<Vec<u8>>> {
69 pub fn new<B: Backend>(module: &Module<B>, log_base2k: usize, log_q: usize) -> Self {
70 Self {
71 data: module.new_vec_znx(1, derive_size(log_base2k, log_q)),
72 log_base2k: log_base2k,
73 log_q: log_q,
74 }
75 }
76}
77
78impl<B: Backend> Ciphertext<VecZnxDft<Vec<u8>, B>> {
79 pub fn new(module: &Module<B>, log_base2k: usize, log_q: usize, cols: usize) -> Self {
80 Self {
81 data: module.new_vec_znx_dft(cols, derive_size(log_base2k, log_q)),
82 log_base2k: log_base2k,
83 log_q: log_q,
84 }
85 }
86}
87
88impl<B: Backend> Ciphertext<MatZnxDft<Vec<u8>, B>> {
89 pub fn new(module: &Module<B>, log_base2k: usize, rows: usize, cols_in: usize, cols_out: usize, log_q: usize) -> Self {
90 Self {
91 data: module.new_mat_znx_dft(rows, cols_in, cols_out, derive_size(log_base2k, log_q)),
92 log_base2k: log_base2k,
93 log_q: log_q,
94 }
95 }
96}
97
98pub(crate) fn derive_size(log_base2k: usize, log_q: usize) -> usize {
99 (log_q + log_base2k - 1) / log_base2k
100}