arnaucube
arnaucube/poulpyPublic Self-hosted repository
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}