use backend::hal::{ api::{ScratchOwnedAlloc, ScratchOwnedBorrow, VecZnxNormalizeInplace, ZnxView, ZnxViewMut}, layouts::{Backend, DataMut, DataRef, Module, ScratchOwned}, oep::{ScratchOwnedAllocImpl, ScratchOwnedBorrowImpl}, }; use crate::layouts::{Infos, LWECiphertext, LWEPlaintext, LWESecret, SetMetaData}; impl LWECiphertext where DataSelf: DataRef, { pub fn decrypt(&self, module: &Module, pt: &mut LWEPlaintext, sk: &LWESecret) where DataPt: DataMut, DataSk: DataRef, Module: VecZnxNormalizeInplace, B: Backend + ScratchOwnedAllocImpl + ScratchOwnedBorrowImpl, { #[cfg(debug_assertions)] { assert_eq!(self.n(), sk.n()); } (0..pt.size().min(self.size())).for_each(|i| { pt.data.at_mut(0, i)[0] = self.data.at(0, i)[0] + self.data.at(0, i)[1..] .iter() .zip(sk.data.at(0, 0)) .map(|(x, y)| x * y) .sum::(); }); module.vec_znx_normalize_inplace( self.basek(), &mut pt.data, 0, ScratchOwned::alloc(size_of::()).borrow(), ); pt.set_basek(self.basek()); pt.set_k(self.k().min(pt.size() * self.basek())); } }