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) {
121        let limbs: usize = a.limbs();
122        assert!(
123            b.limbs() >= limbs,
124            "invalid c_vector: b.limbs()={} < a.limbs()={}",
125            b.limbs(),
126            limbs
127        );
128        unsafe {
129            vec_znx_big::vec_znx_big_add_small(
130                self.0,
131                b.0,
132                limbs as u64,
133                b.0,
134                limbs as u64,
135                a.as_ptr(),
136                limbs as u64,
137                a.n() as u64,
138            )
139        }
140    }
141
142    pub fn vec_znx_big_normalize_tmp_bytes(&self) -> usize {
143        unsafe { vec_znx_big::vec_znx_big_normalize_base2k_tmp_bytes(self.0) as usize }
144    }
145
146    // b <- normalize(a)
147    pub fn vec_znx_big_normalize(
148        &self,
149        log_base2k: usize,
150        b: &mut VecZnx,
151        a: &VecZnxBig,
152        tmp_bytes: &mut [u8],
153    ) {
154        let limbs: usize = b.limbs();
155        assert!(
156            b.limbs() >= limbs,
157            "invalid c_vector: b.limbs()={} < a.limbs()={}",
158            b.limbs(),
159            limbs
160        );
161        assert!(
162            tmp_bytes.len() >= self.vec_znx_big_normalize_tmp_bytes(),
163            "invalid tmp_bytes: tmp_bytes.len()={} <= self.vec_znx_big_normalize_tmp_bytes()={}",
164            tmp_bytes.len(),
165            self.vec_znx_big_normalize_tmp_bytes()
166        );
167        unsafe {
168            vec_znx_big::vec_znx_big_normalize_base2k(
169                self.0,
170                log_base2k as u64,
171                b.as_mut_ptr(),
172                limbs as u64,
173                b.n() as u64,
174                a.0,
175                limbs as u64,
176                tmp_bytes.as_mut_ptr(),
177            )
178        }
179    }
180
181    pub fn vec_znx_big_automorphism(&self, gal_el: i64, b: &mut VecZnxBig, a: &VecZnxBig) {
182        unsafe {
183            vec_znx_big::vec_znx_big_automorphism(
184                self.0,
185                gal_el,
186                b.0,
187                b.limbs() as u64,
188                a.0,
189                a.limbs() as u64,
190            );
191        }
192    }
193
194    pub fn vec_znx_big_automorphism_inplace(&self, gal_el: i64, a: &mut VecZnxBig) {
195        unsafe {
196            vec_znx_big::vec_znx_big_automorphism(
197                self.0,
198                gal_el,
199                a.0,
200                a.limbs() as u64,
201                a.0,
202                a.limbs() as u64,
203            );
204        }
205    }
206}