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