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