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}