arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/base2k/src/vec_znx_big.rs
base2k/src/vec_znx_big.rsRaw
  1use crate::ffi::vec_znx_big;
  2use crate::ffi::vec_znx_dft;
  3use crate::{Infos, Module, VecZnx, VecZnxDft};
  4
  5pub struct VecZnxBig(pub *mut vec_znx_big::vec_znx_bigcoeff_t, pub usize);
  6
  7impl VecZnxBig {
  8    /// Returns a new [VecZnxBig] with the provided data as backing array.
  9    /// User must ensure that data is properly alligned and that
 10    /// the size of data is at least equal to [Module::bytes_of_vec_znx_big].
 11    pub fn from_bytes(limbs: usize, data: &mut [u8]) -> VecZnxBig {
 12        VecZnxBig(
 13            data.as_mut_ptr() as *mut vec_znx_big::vec_znx_bigcoeff_t,
 14            limbs,
 15        )
 16    }
 17
 18    pub fn as_vec_znx_dft(&mut self) -> VecZnxDft {
 19        VecZnxDft(self.0 as *mut vec_znx_dft::vec_znx_dft_t, self.1)
 20    }
 21    pub fn limbs(&self) -> usize {
 22        self.1
 23    }
 24}
 25
 26impl Module {
 27    // Allocates a vector Z[X]/(X^N+1) that stores not normalized values.
 28    pub fn new_vec_znx_big(&self, limbs: usize) -> VecZnxBig {
 29        unsafe { VecZnxBig(vec_znx_big::new_vec_znx_big(self.0, limbs as u64), limbs) }
 30    }
 31
 32    /// Returns the minimum number of bytes necessary to allocate
 33    /// a new [VecZnxBig] through [VecZnxBig::from_bytes].
 34    pub fn bytes_of_vec_znx_big(&self, limbs: usize) -> usize {
 35        unsafe { vec_znx_big::bytes_of_vec_znx_big(self.0, limbs as u64) as usize }
 36    }
 37
 38    // b <- b - a
 39    pub fn vec_znx_big_sub_small_a_inplace(&self, b: &mut VecZnxBig, a: &VecZnx) {
 40        unsafe {
 41            vec_znx_big::vec_znx_big_sub_small_a(
 42                self.0,
 43                b.0,
 44                b.limbs() as u64,
 45                a.as_ptr(),
 46                a.limbs() as u64,
 47                a.n() as u64,
 48                b.0,
 49                b.limbs() as u64,
 50            )
 51        }
 52    }
 53
 54    // c <- b - a
 55    pub fn vec_znx_big_sub_small_a(&self, c: &mut VecZnxBig, a: &VecZnx, b: &VecZnxBig) {
 56        unsafe {
 57            vec_znx_big::vec_znx_big_sub_small_a(
 58                self.0,
 59                c.0,
 60                c.limbs() as u64,
 61                a.as_ptr(),
 62                a.limbs() as u64,
 63                a.n() as u64,
 64                b.0,
 65                b.limbs() as u64,
 66            )
 67        }
 68    }
 69
 70    // c <- b + a
 71    pub fn vec_znx_big_add_small(&self, c: &mut VecZnxBig, a: &VecZnx, b: &VecZnxBig) {
 72        unsafe {
 73            vec_znx_big::vec_znx_big_add_small(
 74                self.0,
 75                c.0,
 76                c.limbs() as u64,
 77                b.0,
 78                b.limbs() as u64,
 79                a.as_ptr(),
 80                a.limbs() as u64,
 81                a.n() as u64,
 82            )
 83        }
 84    }
 85
 86    // b <- b + a
 87    pub fn vec_znx_big_add_small_inplace(&self, b: &mut VecZnxBig, a: &VecZnx) {
 88        unsafe {
 89            vec_znx_big::vec_znx_big_add_small(
 90                self.0,
 91                b.0,
 92                b.limbs() as u64,
 93                b.0,
 94                b.limbs() as u64,
 95                a.as_ptr(),
 96                a.limbs() as u64,
 97                a.n() as u64,
 98            )
 99        }
100    }
101
102    pub fn vec_znx_big_normalize_tmp_bytes(&self) -> usize {
103        unsafe { vec_znx_big::vec_znx_big_normalize_base2k_tmp_bytes(self.0) as usize }
104    }
105
106    // b <- normalize(a)
107    pub fn vec_znx_big_normalize(
108        &self,
109        log_base2k: usize,
110        b: &mut VecZnx,
111        a: &VecZnxBig,
112        tmp_bytes: &mut [u8],
113    ) {
114        assert!(
115            tmp_bytes.len() >= self.vec_znx_big_normalize_tmp_bytes(),
116            "invalid tmp_bytes: tmp_bytes.len()={} <= self.vec_znx_big_normalize_tmp_bytes()={}",
117            tmp_bytes.len(),
118            self.vec_znx_big_normalize_tmp_bytes()
119        );
120        unsafe {
121            vec_znx_big::vec_znx_big_normalize_base2k(
122                self.0,
123                log_base2k as u64,
124                b.as_mut_ptr(),
125                b.limbs() as u64,
126                b.n() as u64,
127                a.0,
128                a.limbs() as u64,
129                tmp_bytes.as_mut_ptr(),
130            )
131        }
132    }
133
134    pub fn vec_znx_big_automorphism(&self, gal_el: i64, b: &mut VecZnxBig, a: &VecZnxBig) {
135        unsafe {
136            vec_znx_big::vec_znx_big_automorphism(
137                self.0,
138                gal_el,
139                b.0,
140                b.limbs() as u64,
141                a.0,
142                a.limbs() as u64,
143            );
144        }
145    }
146
147    pub fn vec_znx_big_automorphism_inplace(&self, gal_el: i64, a: &mut VecZnxBig) {
148        unsafe {
149            vec_znx_big::vec_znx_big_automorphism(
150                self.0,
151                gal_el,
152                a.0,
153                a.limbs() as u64,
154                a.0,
155                a.limbs() as u64,
156            );
157        }
158    }
159}