arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/rlwe/src/rgsw_product.rs
rlwe/src/rgsw_product.rsRaw
 1use crate::{
 2    ciphertext::Ciphertext,
 3    elem::{Elem, ElemCommon, ElemVecZnx, VecZnxCommon},
 4};
 5use base2k::{Module, VecZnxBig, VecZnxBigOps, VecZnxDft, VecZnxDftOps, VmpPMat, VmpPMatOps};
 6use std::cmp::min;
 7
 8pub fn rgsw_product<T>(
 9    module: &Module,
10    _res: &mut Elem<T>,
11    a: &Ciphertext<T>,
12    b: &Ciphertext<VmpPMat>,
13    tmp_bytes: &mut [u8],
14) where
15    T: VecZnxCommon<Owned = T>,
16    Elem<T>: ElemVecZnx<T>,
17{
18    let _log_base2k: usize = b.log_base2k();
19    let rows: usize = min(b.rows(), a.cols());
20    let cols: usize = b.cols();
21    let in_cols = a.cols();
22    let out_cols: usize = a.cols();
23
24    let bytes_of_vec_znx_dft = module.bytes_of_vec_znx_dft(cols);
25    let bytes_of_vmp_apply_dft_to_dft =
26        module.vmp_apply_dft_to_dft_tmp_bytes(out_cols, in_cols, rows, cols);
27
28    let (tmp_bytes_c0_dft, tmp_bytes) = tmp_bytes.split_at_mut(bytes_of_vec_znx_dft);
29    let (tmp_bytes_c1_dft, tmp_bytes) = tmp_bytes.split_at_mut(bytes_of_vec_znx_dft);
30    let (tmp_bytes_tmp_dft, tmp_bytes) = tmp_bytes.split_at_mut(bytes_of_vec_znx_dft);
31    let (tmp_bytes_r1_dft, tmp_bytes) = tmp_bytes.split_at_mut(bytes_of_vec_znx_dft);
32    let (tmp_bytes_r2_dft, tmp_bytes) = tmp_bytes.split_at_mut(bytes_of_vec_znx_dft);
33    let (bytes_of_vmp_apply_dft_to_dft, tmp_bytes) =
34        tmp_bytes.split_at_mut(bytes_of_vmp_apply_dft_to_dft);
35
36    let mut c0_dft: VecZnxDft = module.new_vec_znx_dft_from_bytes(cols, tmp_bytes_c0_dft);
37    let mut c1_dft: VecZnxDft = module.new_vec_znx_dft_from_bytes(cols, tmp_bytes_c1_dft);
38    let mut _tmp_dft: VecZnxDft = module.new_vec_znx_dft_from_bytes(cols, tmp_bytes_tmp_dft);
39    let mut r1_dft: VecZnxDft = module.new_vec_znx_dft_from_bytes(cols, tmp_bytes_r1_dft);
40    let mut _r2_dft: VecZnxDft = module.new_vec_znx_dft_from_bytes(cols, tmp_bytes_r2_dft);
41
42    // c0_dft <- DFT(a[0])
43    module.vec_znx_dft(&mut c0_dft, a.at(0), in_cols);
44
45    // r_dft <- sum[rows] c0_dft[cols] x RGSW[0][cols]
46    module.vmp_apply_dft_to_dft(
47        &mut r1_dft,
48        &c1_dft,
49        &b.0.value[0],
50        bytes_of_vmp_apply_dft_to_dft,
51    );
52
53    // c1_dft <- DFT(a[1])
54    module.vec_znx_dft(&mut c1_dft, a.at(1), in_cols);
55}