Remove Zn (replaced by VecZnx), add more cross-base2k ops & tests

This commit is contained in:
Pro7ech
2025-11-18 01:08:20 +01:00
parent a3264b8851
commit f39e3e2865
52 changed files with 952 additions and 1550 deletions

View File

@@ -1,10 +1,10 @@
use std::fmt;
use poulpy_hal::{
api::ZnFillUniform,
api::VecZnxFillUniform,
layouts::{
Backend, Data, DataMut, DataRef, FillUniform, Module, ReaderFrom, WriterTo, Zn, ZnToMut, ZnToRef, ZnxInfos, ZnxView,
ZnxViewMut,
Backend, Data, DataMut, DataRef, FillUniform, Module, ReaderFrom, VecZnx, VecZnxToMut, VecZnxToRef, WriterTo, ZnxInfos,
ZnxView, ZnxViewMut,
},
source::Source,
};
@@ -13,7 +13,7 @@ use crate::layouts::{Base2K, Degree, LWE, LWEInfos, LWEToMut, TorusPrecision};
#[derive(PartialEq, Eq, Clone)]
pub struct LWECompressed<D: Data> {
pub(crate) data: Zn<D>,
pub(crate) data: VecZnx<D>,
pub(crate) k: TorusPrecision,
pub(crate) base2k: Base2K,
pub(crate) seed: [u8; 32],
@@ -72,7 +72,7 @@ impl LWECompressed<Vec<u8>> {
pub fn alloc(base2k: Base2K, k: TorusPrecision) -> Self {
LWECompressed {
data: Zn::alloc(1, 1, k.0.div_ceil(base2k.0) as usize),
data: VecZnx::alloc(1, 1, k.0.div_ceil(base2k.0) as usize),
k,
base2k,
seed: [0u8; 32],
@@ -87,7 +87,7 @@ impl LWECompressed<Vec<u8>> {
}
pub fn bytes_of(base2k: Base2K, k: TorusPrecision) -> usize {
Zn::bytes_of(1, 1, k.0.div_ceil(base2k.0) as usize)
VecZnx::bytes_of(1, 1, k.0.div_ceil(base2k.0) as usize)
}
}
@@ -113,7 +113,7 @@ impl<D: DataRef> WriterTo for LWECompressed<D> {
pub trait LWEDecompress
where
Self: ZnFillUniform,
Self: VecZnxFillUniform,
{
fn decompress_lwe<R, O>(&self, res: &mut R, other: &O)
where
@@ -126,20 +126,14 @@ where
assert_eq!(res.lwe_layout(), other.lwe_layout());
let mut source: Source = Source::new(other.seed);
self.zn_fill_uniform(
res.n().into(),
other.base2k().into(),
&mut res.data,
0,
&mut source,
);
self.vec_znx_fill_uniform(other.base2k().into(), &mut res.data, 0, &mut source);
for i in 0..res.size() {
res.data.at_mut(0, i)[0] = other.data.at(0, i)[0];
}
}
}
impl<B: Backend> LWEDecompress for Module<B> where Self: ZnFillUniform {}
impl<B: Backend> LWEDecompress for Module<B> where Self: VecZnxFillUniform {}
impl<D: DataMut> LWE<D> {
pub fn decompress<O, M>(&mut self, module: &M, other: &O)

View File

@@ -158,3 +158,15 @@ impl<D: DataMut> GLWEPlaintextToMut for GLWEPlaintext<D> {
}
}
}
impl<D: DataMut> GLWEPlaintext<D> {
pub fn data_mut(&mut self) -> &mut VecZnx<D> {
&mut self.data
}
}
impl<D: DataRef> GLWEPlaintext<D> {
pub fn data(&self) -> &VecZnx<D> {
&self.data
}
}

View File

@@ -1,7 +1,7 @@
use std::fmt;
use poulpy_hal::{
layouts::{Data, DataMut, DataRef, FillUniform, ReaderFrom, WriterTo, Zn, ZnToMut, ZnToRef, ZnxInfos},
layouts::{Data, DataMut, DataRef, FillUniform, ReaderFrom, VecZnx, VecZnxToMut, VecZnxToRef, WriterTo, ZnxInfos},
source::Source,
};
@@ -57,7 +57,7 @@ impl LWEInfos for LWELayout {
}
#[derive(PartialEq, Eq, Clone)]
pub struct LWE<D: Data> {
pub(crate) data: Zn<D>,
pub(crate) data: VecZnx<D>,
pub(crate) k: TorusPrecision,
pub(crate) base2k: Base2K,
}
@@ -90,13 +90,13 @@ impl<D: Data> SetLWEInfos for LWE<D> {
}
impl<D: DataRef> LWE<D> {
pub fn data(&self) -> &Zn<D> {
pub fn data(&self) -> &VecZnx<D> {
&self.data
}
}
impl<D: DataMut> LWE<D> {
pub fn data_mut(&mut self) -> &Zn<D> {
pub fn data_mut(&mut self) -> &VecZnx<D> {
&mut self.data
}
}
@@ -121,7 +121,7 @@ impl<D: DataRef> fmt::Display for LWE<D> {
impl<D: DataMut> FillUniform for LWE<D>
where
Zn<D>: FillUniform,
VecZnx<D>: FillUniform,
{
fn fill_uniform(&mut self, log_bound: usize, source: &mut Source) {
self.data.fill_uniform(log_bound, source);
@@ -138,7 +138,7 @@ impl LWE<Vec<u8>> {
pub fn alloc(n: Degree, base2k: Base2K, k: TorusPrecision) -> Self {
LWE {
data: Zn::alloc((n + 1).into(), 1, k.0.div_ceil(base2k.0) as usize),
data: VecZnx::alloc((n + 1).into(), 1, k.0.div_ceil(base2k.0) as usize),
k,
base2k,
}
@@ -152,7 +152,7 @@ impl LWE<Vec<u8>> {
}
pub fn bytes_of(n: Degree, base2k: Base2K, k: TorusPrecision) -> usize {
Zn::bytes_of((n + 1).into(), 1, k.0.div_ceil(base2k.0) as usize)
VecZnx::bytes_of((n + 1).into(), 1, k.0.div_ceil(base2k.0) as usize)
}
}

View File

@@ -1,6 +1,6 @@
use std::fmt;
use poulpy_hal::layouts::{Data, DataMut, DataRef, Zn, ZnToMut, ZnToRef, ZnxInfos};
use poulpy_hal::layouts::{Data, DataMut, DataRef, VecZnx, VecZnxToMut, VecZnxToRef, ZnxInfos};
use crate::layouts::{Base2K, Degree, LWEInfos, TorusPrecision};
@@ -29,7 +29,7 @@ impl LWEInfos for LWEPlaintextLayout {
}
pub struct LWEPlaintext<D: Data> {
pub(crate) data: Zn<D>,
pub(crate) data: VecZnx<D>,
pub(crate) k: TorusPrecision,
pub(crate) base2k: Base2K,
}
@@ -62,7 +62,7 @@ impl LWEPlaintext<Vec<u8>> {
pub fn alloc(base2k: Base2K, k: TorusPrecision) -> Self {
LWEPlaintext {
data: Zn::alloc(1, 1, k.0.div_ceil(base2k.0) as usize),
data: VecZnx::alloc(1, 1, k.0.div_ceil(base2k.0) as usize),
k,
base2k,
}
@@ -111,8 +111,14 @@ impl<D: DataMut> LWEPlaintextToMut for LWEPlaintext<D> {
}
}
impl<D: DataRef> LWEPlaintext<D> {
pub fn data(&self) -> &VecZnx<D> {
&self.data
}
}
impl<D: DataMut> LWEPlaintext<D> {
pub fn data_mut(&mut self) -> &mut Zn<D> {
pub fn data_mut(&mut self) -> &mut VecZnx<D> {
&mut self.data
}
}