poulpy/base2k/src/vec_znx_dft.rs
base2k/src/vec_znx_dft.rsRaw
1use crate::bindings::{new_vec_znx_dft, vec_znx_idft, vec_znx_idft_tmp_a, vec_znx_idft_tmp_bytes};
2use crate::module::{Module, VecZnxBig, VecZnxDft};
3
4impl Module {
5 // Allocates a vector Z[X]/(X^N+1) that stores normalized in the DFT space.
6 pub fn new_vec_znx_dft(&self, limbs: usize) -> VecZnxDft {
7 unsafe { VecZnxDft(new_vec_znx_dft(self.0, limbs as u64), limbs) }
8 }
9
10 // b <- IDFT(a), uses a as scratch space.
11 pub fn vec_znx_idft_tmp_a(&self, b: &mut VecZnxBig, a: &mut VecZnxDft, a_limbs: usize) {
12 assert!(
13 b.limbs() >= a_limbs,
14 "invalid c_vector: b_vector.limbs()={} < a_limbs={}",
15 b.limbs(),
16 a_limbs
17 );
18 unsafe { vec_znx_idft_tmp_a(self.0, b.0, a_limbs as u64, a.0, a_limbs as u64) }
19 }
20
21 // Returns the size of the scratch space for [vec_znx_idft].
22 pub fn vec_znx_idft_tmp_bytes(&self) -> usize {
23 unsafe { vec_znx_idft_tmp_bytes(self.0) as usize }
24 }
25
26 // b <- IDFT(a), scratch space size obtained with [vec_znx_idft_tmp_bytes].
27 pub fn vec_znx_idft(
28 &self,
29 b_vector: &mut VecZnxBig,
30 a_vector: &mut VecZnxDft,
31 a_limbs: usize,
32 tmp_bytes: &mut [u8],
33 ) {
34 assert!(
35 b_vector.limbs() >= a_limbs,
36 "invalid c_vector: b_vector.limbs()={} < a_limbs={}",
37 b_vector.limbs(),
38 a_limbs
39 );
40 assert!(
41 a_vector.limbs() >= a_limbs,
42 "invalid c_vector: c_vector.limbs()={} < a_limbs={}",
43 a_vector.limbs(),
44 a_limbs
45 );
46 assert!(
47 tmp_bytes.len() <= self.vec_znx_idft_tmp_bytes(),
48 "invalid tmp_bytes: tmp_bytes.len()={} < self.vec_znx_idft_tmp_bytes()={}",
49 tmp_bytes.len(),
50 self.vec_znx_idft_tmp_bytes()
51 );
52 unsafe {
53 vec_znx_idft(
54 self.0,
55 b_vector.0,
56 a_limbs as u64,
57 a_vector.0,
58 a_limbs as u64,
59 tmp_bytes.as_mut_ptr(),
60 )
61 }
62 }
63}