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