arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/base2k/src/vec_znx_dft.rs
base2k/src/vec_znx_dft.rsRaw
 1use crate::ffi::vec_znx_big::vec_znx_bigcoeff_t;
 2use crate::ffi::vec_znx_dft::{
 3    delete_vec_znx_dft, new_vec_znx_dft, vec_znx_dft_t, vec_znx_idft, vec_znx_idft_tmp_a,
 4    vec_znx_idft_tmp_bytes,
 5};
 6use crate::{Module, VecZnxBig};
 7
 8pub struct VecZnxDft(pub *mut vec_znx_dft_t, pub usize);
 9
10impl VecZnxDft {
11    pub fn as_vec_znx_big(&mut self) -> VecZnxBig {
12        VecZnxBig(self.0 as *mut vec_znx_bigcoeff_t, self.1)
13    }
14    pub fn limbs(&self) -> usize {
15        self.1
16    }
17
18    pub fn delete(self) {
19        unsafe { delete_vec_znx_dft(self.0) };
20        drop(self);
21    }
22}
23
24impl Module {
25    // Allocates a vector Z[X]/(X^N+1) that stores normalized in the DFT space.
26    pub fn new_vec_znx_dft(&self, limbs: usize) -> VecZnxDft {
27        unsafe { VecZnxDft(new_vec_znx_dft(self.0, limbs as u64), limbs) }
28    }
29
30    // b <- IDFT(a), uses a as scratch space.
31    pub fn vec_znx_idft_tmp_a(&self, b: &mut VecZnxBig, a: &mut VecZnxDft, a_limbs: usize) {
32        assert!(
33            b.limbs() >= a_limbs,
34            "invalid c_vector: b_vector.limbs()={} < a_limbs={}",
35            b.limbs(),
36            a_limbs
37        );
38        unsafe { vec_znx_idft_tmp_a(self.0, b.0, a_limbs as u64, a.0, a_limbs as u64) }
39    }
40
41    // Returns the size of the scratch space for [vec_znx_idft].
42    pub fn vec_znx_idft_tmp_bytes(&self) -> usize {
43        unsafe { vec_znx_idft_tmp_bytes(self.0) as usize }
44    }
45
46    // b <- IDFT(a), scratch space size obtained with [vec_znx_idft_tmp_bytes].
47    pub fn vec_znx_idft(
48        &self,
49        b_vector: &mut VecZnxBig,
50        a_vector: &mut VecZnxDft,
51        a_limbs: usize,
52        tmp_bytes: &mut [u8],
53    ) {
54        assert!(
55            b_vector.limbs() >= a_limbs,
56            "invalid c_vector: b_vector.limbs()={} < a_limbs={}",
57            b_vector.limbs(),
58            a_limbs
59        );
60        assert!(
61            a_vector.limbs() >= a_limbs,
62            "invalid c_vector: c_vector.limbs()={} < a_limbs={}",
63            a_vector.limbs(),
64            a_limbs
65        );
66        assert!(
67            tmp_bytes.len() <= self.vec_znx_idft_tmp_bytes(),
68            "invalid tmp_bytes: tmp_bytes.len()={} < self.vec_znx_idft_tmp_bytes()={}",
69            tmp_bytes.len(),
70            self.vec_znx_idft_tmp_bytes()
71        );
72        unsafe {
73            vec_znx_idft(
74                self.0,
75                b_vector.0,
76                a_limbs as u64,
77                a_vector.0,
78                a_limbs as u64,
79                tmp_bytes.as_mut_ptr(),
80            )
81        }
82    }
83}