mirror of
https://github.com/arnaucube/poulpy.git
synced 2026-02-10 05:06:44 +01:00
103 lines
2.8 KiB
Rust
103 lines
2.8 KiB
Rust
use std::collections::HashMap;
|
|
|
|
use backend::hal::layouts::{Backend, DataMut, DataRef, Module, Scratch};
|
|
|
|
use crate::{
|
|
layouts::{GLWECiphertext, prepared::GGLWEAutomorphismKeyExec},
|
|
operations::GLWEOperations,
|
|
};
|
|
|
|
use crate::trait_families::{GLWETraceModuleFamily, GLWETraceScratchFamily};
|
|
|
|
impl GLWECiphertext<Vec<u8>> {
|
|
pub fn trace_galois_elements<B: Backend>(module: &Module<B>) -> Vec<i64> {
|
|
let mut gal_els: Vec<i64> = Vec::new();
|
|
(0..module.log_n()).for_each(|i| {
|
|
if i == 0 {
|
|
gal_els.push(-1);
|
|
} else {
|
|
gal_els.push(module.galois_element(1 << (i - 1)));
|
|
}
|
|
});
|
|
gal_els
|
|
}
|
|
|
|
pub fn trace_scratch_space<B: Backend>(
|
|
module: &Module<B>,
|
|
n: usize,
|
|
basek: usize,
|
|
out_k: usize,
|
|
in_k: usize,
|
|
ksk_k: usize,
|
|
digits: usize,
|
|
rank: usize,
|
|
) -> usize
|
|
where
|
|
Module<B>: GLWETraceModuleFamily<B>,
|
|
{
|
|
Self::automorphism_inplace_scratch_space(module, n, basek, out_k.min(in_k), ksk_k, digits, rank)
|
|
}
|
|
|
|
pub fn trace_inplace_scratch_space<B: Backend>(
|
|
module: &Module<B>,
|
|
n: usize,
|
|
basek: usize,
|
|
out_k: usize,
|
|
ksk_k: usize,
|
|
digits: usize,
|
|
rank: usize,
|
|
) -> usize
|
|
where
|
|
Module<B>: GLWETraceModuleFamily<B>,
|
|
{
|
|
Self::automorphism_inplace_scratch_space(module, n, basek, out_k, ksk_k, digits, rank)
|
|
}
|
|
}
|
|
|
|
impl<DataSelf: DataMut> GLWECiphertext<DataSelf> {
|
|
pub fn trace<DataLhs: DataRef, DataAK: DataRef, B: Backend>(
|
|
&mut self,
|
|
module: &Module<B>,
|
|
start: usize,
|
|
end: usize,
|
|
lhs: &GLWECiphertext<DataLhs>,
|
|
auto_keys: &HashMap<i64, GGLWEAutomorphismKeyExec<DataAK, B>>,
|
|
scratch: &mut Scratch<B>,
|
|
) where
|
|
Module<B>: GLWETraceModuleFamily<B>,
|
|
Scratch<B>: GLWETraceScratchFamily<B>,
|
|
{
|
|
self.copy(module, lhs);
|
|
self.trace_inplace(module, start, end, auto_keys, scratch);
|
|
}
|
|
|
|
pub fn trace_inplace<DataAK: DataRef, B: Backend>(
|
|
&mut self,
|
|
module: &Module<B>,
|
|
start: usize,
|
|
end: usize,
|
|
auto_keys: &HashMap<i64, GGLWEAutomorphismKeyExec<DataAK, B>>,
|
|
scratch: &mut Scratch<B>,
|
|
) where
|
|
Module<B>: GLWETraceModuleFamily<B>,
|
|
Scratch<B>: GLWETraceScratchFamily<B>,
|
|
{
|
|
(start..end).for_each(|i| {
|
|
self.rsh(module, 1);
|
|
|
|
let p: i64;
|
|
if i == 0 {
|
|
p = -1;
|
|
} else {
|
|
p = module.galois_element(1 << (i - 1));
|
|
}
|
|
|
|
if let Some(key) = auto_keys.get(&p) {
|
|
self.automorphism_add_inplace(module, key, scratch);
|
|
} else {
|
|
panic!("auto_keys[{}] is empty", p)
|
|
}
|
|
});
|
|
}
|
|
}
|