Added LWE-GLWE conversion & LWE Keyswitch, improved LUT generation

This commit is contained in:
Jean-Philippe Bossuat
2025-07-07 11:09:04 +02:00
parent c4a517e9c3
commit 5234c3fc63
28 changed files with 979 additions and 782 deletions

View File

@@ -2,7 +2,11 @@ use backend::{Backend, FFT64, MatZnxDft, MatZnxDftOps, Module};
use crate::{FourierGLWECiphertext, GGLWECiphertext, GetRow, Infos, SetRow};
pub struct GLWESwitchingKey<Data, B: Backend>(pub(crate) GGLWECiphertext<Data, B>);
pub struct GLWESwitchingKey<Data, B: Backend> {
pub(crate) key: GGLWECiphertext<Data, B>,
pub(crate) sk_in_n: usize, // Degree of sk_in
pub(crate) sk_out_n: usize, // Degree of sk_out
}
impl GLWESwitchingKey<Vec<u8>, FFT64> {
pub fn alloc(
@@ -14,9 +18,11 @@ impl GLWESwitchingKey<Vec<u8>, FFT64> {
rank_in: usize,
rank_out: usize,
) -> Self {
GLWESwitchingKey(GGLWECiphertext::alloc(
module, basek, k, rows, digits, rank_in, rank_out,
))
GLWESwitchingKey {
key: GGLWECiphertext::alloc(module, basek, k, rows, digits, rank_in, rank_out),
sk_in_n: 0,
sk_out_n: 0,
}
}
pub fn bytes_of(
@@ -36,33 +42,41 @@ impl<T, B: Backend> Infos for GLWESwitchingKey<T, B> {
type Inner = MatZnxDft<T, B>;
fn inner(&self) -> &Self::Inner {
self.0.inner()
self.key.inner()
}
fn basek(&self) -> usize {
self.0.basek()
self.key.basek()
}
fn k(&self) -> usize {
self.0.k()
self.key.k()
}
}
impl<T, B: Backend> GLWESwitchingKey<T, B> {
pub fn rank(&self) -> usize {
self.0.data.cols_out() - 1
self.key.data.cols_out() - 1
}
pub fn rank_in(&self) -> usize {
self.0.data.cols_in()
self.key.data.cols_in()
}
pub fn rank_out(&self) -> usize {
self.0.data.cols_out() - 1
self.key.data.cols_out() - 1
}
pub fn digits(&self) -> usize {
self.0.digits()
self.key.digits()
}
pub fn sk_degree_in(&self) -> usize {
self.sk_in_n
}
pub fn sk_degree_out(&self) -> usize {
self.sk_out_n
}
}
@@ -74,7 +88,7 @@ impl<C: AsRef<[u8]>> GetRow<FFT64> for GLWESwitchingKey<C, FFT64> {
col_j: usize,
res: &mut FourierGLWECiphertext<R, FFT64>,
) {
module.mat_znx_dft_get_row(&mut res.data, &self.0.data, row_i, col_j);
module.mat_znx_dft_get_row(&mut res.data, &self.key.data, row_i, col_j);
}
}
@@ -86,6 +100,6 @@ impl<C: AsMut<[u8]> + AsRef<[u8]>> SetRow<FFT64> for GLWESwitchingKey<C, FFT64>
col_j: usize,
a: &FourierGLWECiphertext<R, FFT64>,
) {
module.mat_znx_dft_set_row(&mut self.0.data, row_i, col_j, &a.data);
module.mat_znx_dft_set_row(&mut self.key.data, row_i, col_j, &a.data);
}
}