arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/rlwe/src/elem.rs
rlwe/src/elem.rsRaw
  1use base2k::{
  2    Backend, Module, VecZnx, VecZnxAlloc, VecZnxDft, VecZnxDftAlloc, VecZnxDftToMut, VecZnxDftToRef, VecZnxToMut, VecZnxToRef,
  3    ZnxInfos,
  4};
  5
  6pub trait Infos {
  7    type Inner: ZnxInfos;
  8
  9    fn inner(&self) -> &Self::Inner;
 10
 11    /// Returns the ring degree of the polynomials.
 12    fn n(&self) -> usize {
 13        self.inner().n()
 14    }
 15
 16    /// Returns the base two logarithm of the ring dimension of the polynomials.
 17    fn log_n(&self) -> usize {
 18        self.inner().log_n()
 19    }
 20
 21    /// Returns the number of rows.
 22    fn rows(&self) -> usize {
 23        self.inner().rows()
 24    }
 25
 26    /// Returns the number of polynomials in each row.
 27    fn cols(&self) -> usize {
 28        self.inner().cols()
 29    }
 30
 31    /// Returns the number of size per polynomial.
 32    fn size(&self) -> usize {
 33        let size: usize = self.inner().size();
 34        debug_assert_eq!(size, derive_size(self.log_base2k(), self.log_k()));
 35        size
 36    }
 37
 38    /// Returns the total number of small polynomials.
 39    fn poly_count(&self) -> usize {
 40        self.rows() * self.cols() * self.size()
 41    }
 42
 43    /// Returns the base 2 logarithm of the ciphertext base.
 44    fn log_base2k(&self) -> usize;
 45
 46    /// Returns the bit precision of the ciphertext.
 47    fn log_k(&self) -> usize;
 48}
 49
 50pub struct RLWECt<C> {
 51    pub data: VecZnx<C>,
 52    pub log_base2k: usize,
 53    pub log_k: usize,
 54}
 55
 56impl<T> Infos for RLWECt<T> {
 57    type Inner = VecZnx<T>;
 58
 59    fn inner(&self) -> &Self::Inner {
 60        &self.data
 61    }
 62
 63    fn log_base2k(&self) -> usize {
 64        self.log_base2k
 65    }
 66
 67    fn log_k(&self) -> usize {
 68        self.log_k
 69    }
 70}
 71
 72impl<C> VecZnxToMut for RLWECt<C>
 73where
 74    VecZnx<C>: VecZnxToMut,
 75{
 76    fn to_mut(&mut self) -> VecZnx<&mut [u8]> {
 77        self.data.to_mut()
 78    }
 79}
 80
 81impl<C> VecZnxToRef for RLWECt<C>
 82where
 83    VecZnx<C>: VecZnxToRef,
 84{
 85    fn to_ref(&self) -> VecZnx<&[u8]> {
 86        self.data.to_ref()
 87    }
 88}
 89
 90pub struct RLWEPt<C> {
 91    pub data: VecZnx<C>,
 92    pub log_base2k: usize,
 93    pub log_k: usize,
 94}
 95
 96impl<T> Infos for RLWEPt<T> {
 97    type Inner = VecZnx<T>;
 98
 99    fn inner(&self) -> &Self::Inner {
100        &self.data
101    }
102
103    fn log_base2k(&self) -> usize {
104        self.log_base2k
105    }
106
107    fn log_k(&self) -> usize {
108        self.log_k
109    }
110}
111
112impl<C> VecZnxToMut for RLWEPt<C>
113where
114    VecZnx<C>: VecZnxToMut,
115{
116    fn to_mut(&mut self) -> VecZnx<&mut [u8]> {
117        self.data.to_mut()
118    }
119}
120
121impl<C> VecZnxToRef for RLWEPt<C>
122where
123    VecZnx<C>: VecZnxToRef,
124{
125    fn to_ref(&self) -> VecZnx<&[u8]> {
126        self.data.to_ref()
127    }
128}
129
130impl RLWECt<Vec<u8>> {
131    pub fn new<B: Backend>(module: &Module<B>, log_base2k: usize, log_k: usize, cols: usize) -> Self {
132        Self {
133            data: module.new_vec_znx(cols, derive_size(log_base2k, log_k)),
134            log_base2k: log_base2k,
135            log_k: log_k,
136        }
137    }
138}
139
140impl RLWEPt<Vec<u8>> {
141    pub fn new<B: Backend>(module: &Module<B>, log_base2k: usize, log_k: usize) -> Self {
142        Self {
143            data: module.new_vec_znx(1, derive_size(log_base2k, log_k)),
144            log_base2k: log_base2k,
145            log_k: log_k,
146        }
147    }
148}
149
150pub struct RLWECtDft<C, B: Backend> {
151    pub data: VecZnxDft<C, B>,
152    pub log_base2k: usize,
153    pub log_k: usize,
154}
155
156impl<B: Backend> RLWECtDft<Vec<u8>, B> {
157    pub fn new(module: &Module<B>, log_base2k: usize, log_k: usize, cols: usize) -> Self {
158        Self {
159            data: module.new_vec_znx_dft(cols, derive_size(log_base2k, log_k)),
160            log_base2k: log_base2k,
161            log_k: log_k,
162        }
163    }
164}
165
166impl<T, B: Backend> Infos for RLWECtDft<T, B> {
167    type Inner = VecZnxDft<T, B>;
168
169    fn inner(&self) -> &Self::Inner {
170        &self.data
171    }
172
173    fn log_base2k(&self) -> usize {
174        self.log_base2k
175    }
176
177    fn log_k(&self) -> usize {
178        self.log_k
179    }
180}
181
182impl<C, B: Backend> VecZnxDftToMut<B> for RLWECtDft<C, B>
183where
184    VecZnxDft<C, B>: VecZnxDftToMut<B>,
185{
186    fn to_mut(&mut self) -> VecZnxDft<&mut [u8], B> {
187        self.data.to_mut()
188    }
189}
190
191impl<C, B: Backend> VecZnxDftToRef<B> for RLWECtDft<C, B>
192where
193    VecZnxDft<C, B>: VecZnxDftToRef<B>,
194{
195    fn to_ref(&self) -> VecZnxDft<&[u8], B> {
196        self.data.to_ref()
197    }
198}
199
200pub(crate) fn derive_size(log_base2k: usize, log_k: usize) -> usize {
201    (log_k + log_base2k - 1) / log_base2k
202}