use poulpy_hal::layouts::{Backend, Module, Scratch}; use crate::{ GLWERotate, ScratchTakeCore, layouts::{GGSW, GGSWInfos, GGSWToMut, GGSWToRef, GLWEInfos}, }; impl GGSWRotate for Module where Module: GLWERotate {} pub trait GGSWRotate where Self: GLWERotate, { fn ggsw_rotate_tmp_bytes(&self) -> usize { self.glwe_rotate_tmp_bytes() } fn ggsw_rotate(&self, k: i64, res: &mut R, a: &A) where R: GGSWToMut, A: GGSWToRef, { let res: &mut GGSW<&mut [u8]> = &mut res.to_mut(); let a: &GGSW<&[u8]> = &a.to_ref(); assert!(res.dnum() <= a.dnum()); assert_eq!(res.dsize(), a.dsize()); assert_eq!(res.rank(), a.rank()); let rows: usize = res.dnum().into(); let cols: usize = (res.rank() + 1).into(); for row in 0..rows { for col in 0..cols { self.glwe_rotate(k, &mut res.at_mut(row, col), &a.at(row, col)); } } } fn ggsw_rotate_inplace(&self, k: i64, res: &mut R, scratch: &mut Scratch) where R: GGSWToMut, Scratch: ScratchTakeCore, { let res: &mut GGSW<&mut [u8]> = &mut res.to_mut(); let rows: usize = res.dnum().into(); let cols: usize = (res.rank() + 1).into(); for row in 0..rows { for col in 0..cols { self.glwe_rotate_inplace(k, &mut res.at_mut(row, col), scratch); } } } }