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