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        let limbs: usize = a.limbs();
 41        assert!(
 42            b.limbs() >= limbs,
 43            "invalid c_vector: b.limbs()={} < a.limbs()={}",
 44            b.limbs(),
 45            limbs
 46        );
 47        unsafe {
 48            vec_znx_big::vec_znx_big_sub_small_a(
 49                self.0,
 50                b.0,
 51                b.limbs() as u64,
 52                a.as_ptr(),
 53                limbs as u64,
 54                a.n() as u64,
 55                b.0,
 56                b.limbs() as u64,
 57            )
 58        }
 59    }
 60
 61    // c <- b - a
 62    pub fn vec_znx_big_sub_small_a(&self, c: &mut VecZnxBig, a: &VecZnx, b: &VecZnxBig) {
 63        let limbs: usize = a.limbs();
 64        assert!(
 65            b.limbs() >= limbs,
 66            "invalid c: b.limbs()={} < a.limbs()={}",
 67            b.limbs(),
 68            limbs
 69        );
 70        assert!(
 71            c.limbs() >= limbs,
 72            "invalid c: c.limbs()={} < a.limbs()={}",
 73            c.limbs(),
 74            limbs
 75        );
 76        unsafe {
 77            vec_znx_big::vec_znx_big_sub_small_a(
 78                self.0,
 79                c.0,
 80                c.limbs() as u64,
 81                a.as_ptr(),
 82                limbs as u64,
 83                a.n() as u64,
 84                b.0,
 85                b.limbs() as u64,
 86            )
 87        }
 88    }
 89
 90    // c <- b + a
 91    pub fn vec_znx_big_add_small(&self, c: &mut VecZnxBig, a: &VecZnx, b: &VecZnxBig) {
 92        let limbs: usize = a.limbs();
 93        assert!(
 94            b.limbs() >= limbs,
 95            "invalid c: b.limbs()={} < a.limbs()={}",
 96            b.limbs(),
 97            limbs
 98        );
 99        assert!(
100            c.limbs() >= limbs,
101            "invalid c: c.limbs()={} < a.limbs()={}",
102            c.limbs(),
103            limbs
104        );
105        unsafe {
106            vec_znx_big::vec_znx_big_add_small(
107                self.0,
108                c.0,
109                limbs as u64,
110                b.0,
111                limbs as u64,
112                a.as_ptr(),
113                limbs as u64,
114                a.n() as u64,
115            )
116        }
117    }
118
119    // b <- b + a
120    pub fn vec_znx_big_add_small_inplace(&self, b: &mut VecZnxBig, a: &VecZnx, a_limbs: usize) {
121        assert!(
122            b.limbs() >= a_limbs,
123            "invalid c_vector: b.limbs()={} < a.limbs()={}",
124            b.limbs(),
125            a_limbs
126        );
127        unsafe {
128            vec_znx_big::vec_znx_big_add_small(
129                self.0,
130                b.0,
131                a_limbs as u64,
132                b.0,
133                a_limbs as u64,
134                a.as_ptr(),
135                a_limbs as u64,
136                a.n() as u64,
137            )
138        }
139    }
140
141    pub fn vec_znx_big_normalize_tmp_bytes(&self) -> usize {
142        unsafe { vec_znx_big::vec_znx_big_normalize_base2k_tmp_bytes(self.0) as usize }
143    }
144
145    // b <- normalize(a)
146    pub fn vec_znx_big_normalize(
147        &self,
148        log_base2k: usize,
149        b: &mut VecZnx,
150        a: &VecZnxBig,
151        tmp_bytes: &mut [u8],
152    ) {
153        let limbs: usize = b.limbs();
154        assert!(
155            b.limbs() >= limbs,
156            "invalid c_vector: b.limbs()={} < a.limbs()={}",
157            b.limbs(),
158            limbs
159        );
160        assert!(
161            tmp_bytes.len() >= self.vec_znx_big_normalize_tmp_bytes(),
162            "invalid tmp_bytes: tmp_bytes.len()={} <= self.vec_znx_big_normalize_tmp_bytes()={}",
163            tmp_bytes.len(),
164            self.vec_znx_big_normalize_tmp_bytes()
165        );
166        unsafe {
167            vec_znx_big::vec_znx_big_normalize_base2k(
168                self.0,
169                log_base2k as u64,
170                b.as_mut_ptr(),
171                limbs as u64,
172                b.n() as u64,
173                a.0,
174                limbs as u64,
175                tmp_bytes.as_mut_ptr(),
176            )
177        }
178    }
179
180    pub fn vec_znx_big_automorphism(&self, gal_el: i64, b: &mut VecZnxBig, a: &VecZnxBig) {
181        unsafe {
182            vec_znx_big::vec_znx_big_automorphism(
183                self.0,
184                gal_el,
185                b.0,
186                b.limbs() as u64,
187                a.0,
188                a.limbs() as u64,
189            );
190        }
191    }
192
193    pub fn vec_znx_big_automorphism_inplace(&self, gal_el: i64, a: &mut VecZnxBig) {
194        unsafe {
195            vec_znx_big::vec_znx_big_automorphism(
196                self.0,
197                gal_el,
198                a.0,
199                a.limbs() as u64,
200                a.0,
201                a.limbs() as u64,
202            );
203        }
204    }
205}