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}