From bbc664fa389ec780cc159cea7fe772644ad8def9 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Bossuat Date: Thu, 16 Oct 2025 11:25:55 +0200 Subject: [PATCH] glwe ops --- poulpy-core/src/automorphism/mod.rs | 4 +++ poulpy-core/src/keyswitching/mod.rs | 2 +- poulpy-core/src/lib.rs | 1 + poulpy-core/src/operations/glwe.rs | 50 ++++++++++++++--------------- poulpy-hal/src/api/module.rs | 6 ++++ poulpy-hal/src/layouts/module.rs | 4 ++- 6 files changed, 40 insertions(+), 27 deletions(-) diff --git a/poulpy-core/src/automorphism/mod.rs b/poulpy-core/src/automorphism/mod.rs index f985c5e..1cd7bea 100644 --- a/poulpy-core/src/automorphism/mod.rs +++ b/poulpy-core/src/automorphism/mod.rs @@ -1,3 +1,7 @@ mod gglwe_atk; mod ggsw_ct; mod glwe_ct; + +pub use gglwe_atk::*; +pub use ggsw_ct::*; +pub use glwe_ct::*; \ No newline at end of file diff --git a/poulpy-core/src/keyswitching/mod.rs b/poulpy-core/src/keyswitching/mod.rs index b23fd47..462e474 100644 --- a/poulpy-core/src/keyswitching/mod.rs +++ b/poulpy-core/src/keyswitching/mod.rs @@ -4,6 +4,6 @@ mod glwe_ct; mod lwe_ct; pub use gglwe_ct::*; -pub use gglwe_ct::*; +//pub use gglwe_ct::*; pub use glwe_ct::*; pub use lwe_ct::*; diff --git a/poulpy-core/src/lib.rs b/poulpy-core/src/lib.rs index ffa36a8..49c39b0 100644 --- a/poulpy-core/src/lib.rs +++ b/poulpy-core/src/lib.rs @@ -19,6 +19,7 @@ pub use dist::*; pub use external_product::*; pub use glwe_packing::*; pub use keyswitching::*; +pub use automorphism::*; pub use encryption::SIGMA; diff --git a/poulpy-core/src/operations/glwe.rs b/poulpy-core/src/operations/glwe.rs index b8b32ce..021d10e 100644 --- a/poulpy-core/src/operations/glwe.rs +++ b/poulpy-core/src/operations/glwe.rs @@ -4,7 +4,7 @@ use poulpy_hal::{ VecZnxNormalize, VecZnxNormalizeInplace, VecZnxRotate, VecZnxRotateInplace, VecZnxRshInplace, VecZnxSub, VecZnxSubInplace, VecZnxSubNegateInplace, }, - layouts::{Backend, DataMut, Module, Scratch, VecZnx, ZnxZero}, + layouts::{Backend, DataMut, Scratch, VecZnx, ZnxZero}, }; use crate::layouts::{GLWE, GLWEInfos, GLWEPlaintext, GLWEToMut, GLWEToRef, LWEInfos, SetGLWEInfos, TorusPrecision}; @@ -19,11 +19,11 @@ where impl GLWEOperations for GLWE where GLWE: GLWEToMut + GLWEInfos {} pub trait GLWEOperations: GLWEToMut + GLWEInfos + SetGLWEInfos + Sized { - fn add(&mut self, module: &Module, a: &A, b: &B) + fn add(&mut self, module: &M, a: &A, b: &B) where A: GLWEToRef + GLWEInfos, B: GLWEToRef + GLWEInfos, - Module: VecZnxAdd + VecZnxCopy, + M: VecZnxAdd + VecZnxCopy, { #[cfg(debug_assertions)] { @@ -66,10 +66,10 @@ pub trait GLWEOperations: GLWEToMut + GLWEInfos + SetGLWEInfos + Sized { self.set_k(set_k_binary(self, a, b)); } - fn add_inplace(&mut self, module: &Module, a: &A) + fn add_inplace(&mut self, module: &M, a: &A) where A: GLWEToRef + GLWEInfos, - Module: VecZnxAddInplace, + M: VecZnxAddInplace, { #[cfg(debug_assertions)] { @@ -88,11 +88,11 @@ pub trait GLWEOperations: GLWEToMut + GLWEInfos + SetGLWEInfos + Sized { self.set_k(set_k_unary(self, a)) } - fn sub(&mut self, module: &Module, a: &A, b: &B) + fn sub(&mut self, module: &M, a: &A, b: &B) where A: GLWEToRef + GLWEInfos, B: GLWEToRef + GLWEInfos, - Module: VecZnxSub + VecZnxCopy + VecZnxNegateInplace, + M: VecZnxSub + VecZnxCopy + VecZnxNegateInplace, { #[cfg(debug_assertions)] { @@ -136,10 +136,10 @@ pub trait GLWEOperations: GLWEToMut + GLWEInfos + SetGLWEInfos + Sized { self.set_k(set_k_binary(self, a, b)); } - fn sub_inplace_ab(&mut self, module: &Module, a: &A) + fn sub_inplace_ab(&mut self, module: &M, a: &A) where A: GLWEToRef + GLWEInfos, - Module: VecZnxSubInplace, + M: VecZnxSubInplace, { #[cfg(debug_assertions)] { @@ -158,10 +158,10 @@ pub trait GLWEOperations: GLWEToMut + GLWEInfos + SetGLWEInfos + Sized { self.set_k(set_k_unary(self, a)) } - fn sub_inplace_ba(&mut self, module: &Module, a: &A) + fn sub_inplace_ba(&mut self, module: &M, a: &A) where A: GLWEToRef + GLWEInfos, - Module: VecZnxSubNegateInplace, + M: VecZnxSubNegateInplace, { #[cfg(debug_assertions)] { @@ -180,10 +180,10 @@ pub trait GLWEOperations: GLWEToMut + GLWEInfos + SetGLWEInfos + Sized { self.set_k(set_k_unary(self, a)) } - fn rotate(&mut self, module: &Module, k: i64, a: &A) + fn rotate(&mut self, module: &M, k: i64, a: &A) where A: GLWEToRef + GLWEInfos, - Module: VecZnxRotate, + M: VecZnxRotate, { #[cfg(debug_assertions)] { @@ -202,9 +202,9 @@ pub trait GLWEOperations: GLWEToMut + GLWEInfos + SetGLWEInfos + Sized { self.set_k(set_k_unary(self, a)) } - fn rotate_inplace(&mut self, module: &Module, k: i64, scratch: &mut Scratch) + fn rotate_inplace(&mut self, module: &M, k: i64, scratch: &mut Scratch) where - Module: VecZnxRotateInplace, + M: VecZnxRotateInplace, { let self_mut: &mut GLWE<&mut [u8]> = &mut self.to_mut(); @@ -213,10 +213,10 @@ pub trait GLWEOperations: GLWEToMut + GLWEInfos + SetGLWEInfos + Sized { }); } - fn mul_xp_minus_one(&mut self, module: &Module, k: i64, a: &A) + fn mul_xp_minus_one(&mut self, module: &M, k: i64, a: &A) where A: GLWEToRef + GLWEInfos, - Module: VecZnxMulXpMinusOne, + M: VecZnxMulXpMinusOne, { #[cfg(debug_assertions)] { @@ -235,9 +235,9 @@ pub trait GLWEOperations: GLWEToMut + GLWEInfos + SetGLWEInfos + Sized { self.set_k(set_k_unary(self, a)) } - fn mul_xp_minus_one_inplace(&mut self, module: &Module, k: i64, scratch: &mut Scratch) + fn mul_xp_minus_one_inplace(&mut self, module: &M, k: i64, scratch: &mut Scratch) where - Module: VecZnxMulXpMinusOneInplace, + M: VecZnxMulXpMinusOneInplace, { let self_mut: &mut GLWE<&mut [u8]> = &mut self.to_mut(); @@ -268,9 +268,9 @@ pub trait GLWEOperations: GLWEToMut + GLWEInfos + SetGLWEInfos + Sized { self.set_base2k(a.base2k()); } - fn rsh(&mut self, module: &Module, k: usize, scratch: &mut Scratch) + fn rsh(&mut self, module: &M, k: usize, scratch: &mut Scratch) where - Module: VecZnxRshInplace, + M: VecZnxRshInplace, { let base2k: usize = self.base2k().into(); (0..(self.rank() + 1).into()).for_each(|i| { @@ -278,10 +278,10 @@ pub trait GLWEOperations: GLWEToMut + GLWEInfos + SetGLWEInfos + Sized { }) } - fn normalize(&mut self, module: &Module, a: &A, scratch: &mut Scratch) + fn normalize(&mut self, module: &M, a: &A, scratch: &mut Scratch) where A: GLWEToRef + GLWEInfos, - Module: VecZnxNormalize, + M: VecZnxNormalize, { #[cfg(debug_assertions)] { @@ -307,9 +307,9 @@ pub trait GLWEOperations: GLWEToMut + GLWEInfos + SetGLWEInfos + Sized { self.set_k(a.k().min(self.k())); } - fn normalize_inplace(&mut self, module: &Module, scratch: &mut Scratch) + fn normalize_inplace(&mut self, module: &M, scratch: &mut Scratch) where - Module: VecZnxNormalizeInplace, + M: VecZnxNormalizeInplace, { let self_mut: &mut GLWE<&mut [u8]> = &mut self.to_mut(); (0..(self_mut.rank() + 1).into()).for_each(|i| { diff --git a/poulpy-hal/src/api/module.rs b/poulpy-hal/src/api/module.rs index 3dd6176..c2e2f1c 100644 --- a/poulpy-hal/src/api/module.rs +++ b/poulpy-hal/src/api/module.rs @@ -8,3 +8,9 @@ pub trait ModuleNew { pub trait ModuleN { fn n(&self) -> usize; } + +pub trait ModuleLogN where Self: ModuleN{ + fn log_n(&self) -> usize{ + (u64::BITS - (self.n() as u64-1).leading_zeros()) as usize + } +} \ No newline at end of file diff --git a/poulpy-hal/src/layouts/module.rs b/poulpy-hal/src/layouts/module.rs index 44fccbc..ccefb3a 100644 --- a/poulpy-hal/src/layouts/module.rs +++ b/poulpy-hal/src/layouts/module.rs @@ -2,7 +2,7 @@ use std::{fmt::Display, marker::PhantomData, ptr::NonNull}; use rand_distr::num_traits::Zero; -use crate::{GALOISGENERATOR, api::ModuleN}; +use crate::{api::{ModuleLogN, ModuleN}, GALOISGENERATOR}; #[allow(clippy::missing_safety_doc)] pub trait Backend: Sized { @@ -86,6 +86,8 @@ where } } +impl ModuleLogN for Module where Self: ModuleN{} + impl CyclotomicOrder for Module where Self: ModuleN {} pub trait GaloisElement