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}