arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/poulpy-core/src/layouts/lwe_pt.rs
poulpy-core/src/layouts/lwe_pt.rsRaw
  1use std::fmt;
  2
  3use poulpy_hal::layouts::{Data, DataMut, DataRef, Zn, ZnToMut, ZnToRef, ZnxInfos};
  4
  5use crate::layouts::{Base2K, Degree, LWEInfos, TorusPrecision};
  6
  7#[derive(PartialEq, Eq, Copy, Clone, Debug)]
  8pub struct LWEPlaintextLayout {
  9    k: TorusPrecision,
 10    base2k: Base2K,
 11}
 12
 13impl LWEInfos for LWEPlaintextLayout {
 14    fn base2k(&self) -> Base2K {
 15        self.base2k
 16    }
 17
 18    fn k(&self) -> TorusPrecision {
 19        self.k
 20    }
 21
 22    fn n(&self) -> Degree {
 23        Degree(0)
 24    }
 25
 26    fn size(&self) -> usize {
 27        self.k.0.div_ceil(self.base2k.0) as usize
 28    }
 29}
 30
 31pub struct LWEPlaintext<D: Data> {
 32    pub(crate) data: Zn<D>,
 33    pub(crate) k: TorusPrecision,
 34    pub(crate) base2k: Base2K,
 35}
 36
 37impl<D: Data> LWEInfos for LWEPlaintext<D> {
 38    fn base2k(&self) -> Base2K {
 39        self.base2k
 40    }
 41
 42    fn k(&self) -> TorusPrecision {
 43        self.k
 44    }
 45
 46    fn n(&self) -> Degree {
 47        Degree(self.data.n() as u32 - 1)
 48    }
 49
 50    fn size(&self) -> usize {
 51        self.data.size()
 52    }
 53}
 54
 55impl LWEPlaintext<Vec<u8>> {
 56    pub fn alloc<A>(infos: &A) -> Self
 57    where
 58        A: LWEInfos,
 59    {
 60        Self::alloc_with(infos.base2k(), infos.k())
 61    }
 62
 63    pub fn alloc_with(base2k: Base2K, k: TorusPrecision) -> Self {
 64        Self {
 65            data: Zn::alloc(1, 1, k.0.div_ceil(base2k.0) as usize),
 66            k,
 67            base2k,
 68        }
 69    }
 70}
 71
 72impl<D: DataRef> fmt::Display for LWEPlaintext<D> {
 73    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
 74        write!(
 75            f,
 76            "LWEPlaintext: base2k={} k={}: {}",
 77            self.base2k().0,
 78            self.k().0,
 79            self.data
 80        )
 81    }
 82}
 83
 84pub trait LWEPlaintextToRef {
 85    #[allow(dead_code)]
 86    fn to_ref(&self) -> LWEPlaintext<&[u8]>;
 87}
 88
 89impl<D: DataRef> LWEPlaintextToRef for LWEPlaintext<D> {
 90    fn to_ref(&self) -> LWEPlaintext<&[u8]> {
 91        LWEPlaintext {
 92            data: self.data.to_ref(),
 93            base2k: self.base2k,
 94            k: self.k,
 95        }
 96    }
 97}
 98
 99pub trait LWEPlaintextToMut {
100    #[allow(dead_code)]
101    fn to_mut(&mut self) -> LWEPlaintext<&mut [u8]>;
102}
103
104impl<D: DataMut> LWEPlaintextToMut for LWEPlaintext<D> {
105    fn to_mut(&mut self) -> LWEPlaintext<&mut [u8]> {
106        LWEPlaintext {
107            data: self.data.to_mut(),
108            base2k: self.base2k,
109            k: self.k,
110        }
111    }
112}
113
114impl<D: DataMut> LWEPlaintext<D> {
115    pub fn data_mut(&mut self) -> &mut Zn<D> {
116        &mut self.data
117    }
118}