arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/rlwe/src/elem_grlwe.rs
rlwe/src/elem_grlwe.rsRaw
 1use base2k::{Backend, MatZnxDft, MatZnxDftAlloc, MatZnxDftToMut, MatZnxDftToRef, Module};
 2
 3use crate::{elem::Infos, utils::derive_size};
 4
 5pub struct GRLWECt<C, B: Backend> {
 6    pub data: MatZnxDft<C, B>,
 7    pub log_base2k: usize,
 8    pub log_k: usize,
 9}
10
11impl<B: Backend> GRLWECt<Vec<u8>, B> {
12    pub fn new(module: &Module<B>, log_base2k: usize, log_k: usize, rows: usize) -> Self {
13        Self {
14            data: module.new_mat_znx_dft(rows, 1, 2, derive_size(log_base2k, log_k)),
15            log_base2k: log_base2k,
16            log_k: log_k,
17        }
18    }
19}
20
21impl<T, B: Backend> Infos for GRLWECt<T, B> {
22    type Inner = MatZnxDft<T, B>;
23
24    fn inner(&self) -> &Self::Inner {
25        &self.data
26    }
27
28    fn log_base2k(&self) -> usize {
29        self.log_base2k
30    }
31
32    fn log_k(&self) -> usize {
33        self.log_k
34    }
35}
36
37impl<C, B: Backend> MatZnxDftToMut<B> for GRLWECt<C, B>
38where
39    MatZnxDft<C, B>: MatZnxDftToMut<B>,
40{
41    fn to_mut(&mut self) -> MatZnxDft<&mut [u8], B> {
42        self.data.to_mut()
43    }
44}
45
46impl<C, B: Backend> MatZnxDftToRef<B> for GRLWECt<C, B>
47where
48    MatZnxDft<C, B>: MatZnxDftToRef<B>,
49{
50    fn to_ref(&self) -> MatZnxDft<&[u8], B> {
51        self.data.to_ref()
52    }
53}