poulpy_core/decryption/
lwe_ct.rs1use poulpy_hal::{
2 api::{ScratchOwnedAlloc, ScratchOwnedBorrow, VecZnxNormalizeInplace, ZnxView, ZnxViewMut},
3 layouts::{Backend, DataMut, DataRef, Module, ScratchOwned},
4 oep::{ScratchOwnedAllocImpl, ScratchOwnedBorrowImpl},
5};
6
7use crate::layouts::{Infos, LWECiphertext, LWEPlaintext, LWESecret, SetMetaData};
8
9impl<DataSelf> LWECiphertext<DataSelf>
10where
11 DataSelf: DataRef,
12{
13 pub fn decrypt<DataPt, DataSk, B>(&self, module: &Module<B>, pt: &mut LWEPlaintext<DataPt>, sk: &LWESecret<DataSk>)
14 where
15 DataPt: DataMut,
16 DataSk: DataRef,
17 Module<B>: VecZnxNormalizeInplace<B>,
18 B: Backend + ScratchOwnedAllocImpl<B> + ScratchOwnedBorrowImpl<B>,
19 {
20 #[cfg(debug_assertions)]
21 {
22 assert_eq!(self.n(), sk.n());
23 }
24
25 (0..pt.size().min(self.size())).for_each(|i| {
26 pt.data.at_mut(0, i)[0] = self.data.at(0, i)[0]
27 + self.data.at(0, i)[1..]
28 .iter()
29 .zip(sk.data.at(0, 0))
30 .map(|(x, y)| x * y)
31 .sum::<i64>();
32 });
33 module.vec_znx_normalize_inplace(
34 self.basek(),
35 &mut pt.data,
36 0,
37 ScratchOwned::alloc(size_of::<i64>()).borrow(),
38 );
39 pt.set_basek(self.basek());
40 pt.set_k(self.k().min(pt.size() * self.basek()));
41 }
42}