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::{Free, 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
19impl Free for VecZnxDft {
20    fn free(self) {
21        unsafe { delete_vec_znx_dft(self.0) };
22        drop(self);
23    }
24}
25
26impl Module {
27    // Allocates a vector Z[X]/(X^N+1) that stores normalized in the DFT space.
28    pub fn new_vec_znx_dft(&self, limbs: usize) -> VecZnxDft {
29        unsafe { VecZnxDft(new_vec_znx_dft(self.0, limbs as u64), limbs) }
30    }
31
32    // b <- IDFT(a), uses a as scratch space.
33    pub fn vec_znx_idft_tmp_a(&self, b: &mut VecZnxBig, a: &mut VecZnxDft, a_limbs: usize) {
34        assert!(
35            b.limbs() >= a_limbs,
36            "invalid c_vector: b_vector.limbs()={} < a_limbs={}",
37            b.limbs(),
38            a_limbs
39        );
40        unsafe { vec_znx_idft_tmp_a(self.0, b.0, a_limbs as u64, a.0, a_limbs as u64) }
41    }
42
43    // Returns the size of the scratch space for [vec_znx_idft].
44    pub fn vec_znx_idft_tmp_bytes(&self) -> usize {
45        unsafe { vec_znx_idft_tmp_bytes(self.0) as usize }
46    }
47
48    // b <- IDFT(a), scratch space size obtained with [vec_znx_idft_tmp_bytes].
49    pub fn vec_znx_idft(
50        &self,
51        b_vector: &mut VecZnxBig,
52        a_vector: &mut VecZnxDft,
53        a_limbs: usize,
54        tmp_bytes: &mut [u8],
55    ) {
56        assert!(
57            b_vector.limbs() >= a_limbs,
58            "invalid c_vector: b_vector.limbs()={} < a_limbs={}",
59            b_vector.limbs(),
60            a_limbs
61        );
62        assert!(
63            a_vector.limbs() >= a_limbs,
64            "invalid c_vector: c_vector.limbs()={} < a_limbs={}",
65            a_vector.limbs(),
66            a_limbs
67        );
68        assert!(
69            tmp_bytes.len() <= self.vec_znx_idft_tmp_bytes(),
70            "invalid tmp_bytes: tmp_bytes.len()={} < self.vec_znx_idft_tmp_bytes()={}",
71            tmp_bytes.len(),
72            self.vec_znx_idft_tmp_bytes()
73        );
74        unsafe {
75            vec_znx_idft(
76                self.0,
77                b_vector.0,
78                a_limbs as u64,
79                a_vector.0,
80                a_limbs as u64,
81                tmp_bytes.as_mut_ptr(),
82            )
83        }
84    }
85}