arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/poulpy-hal/src/api/vec_znx.rs
poulpy-hal/src/api/vec_znx.rsRaw
  1use crate::{
  2    layouts::{Backend, ScalarZnxToRef, Scratch, VecZnxToMut, VecZnxToRef},
  3    source::Source,
  4};
  5
  6pub trait VecZnxNormalizeTmpBytes {
  7    /// Returns the minimum number of bytes necessary for normalization.
  8    fn vec_znx_normalize_tmp_bytes(&self) -> usize;
  9}
 10
 11pub trait VecZnxNormalize<B: Backend> {
 12    /// Normalizes the selected column of `a` and stores the result into the selected column of `res`.
 13    fn vec_znx_normalize<R, A>(&self, basek: usize, res: &mut R, res_col: usize, a: &A, a_col: usize, scratch: &mut Scratch<B>)
 14    where
 15        R: VecZnxToMut,
 16        A: VecZnxToRef;
 17}
 18
 19pub trait VecZnxNormalizeInplace<B: Backend> {
 20    /// Normalizes the selected column of `a`.
 21    fn vec_znx_normalize_inplace<A>(&self, basek: usize, a: &mut A, a_col: usize, scratch: &mut Scratch<B>)
 22    where
 23        A: VecZnxToMut;
 24}
 25
 26pub trait VecZnxAdd {
 27    /// Adds the selected column of `a` to the selected column of `b` and writes the result on the selected column of `res`.
 28    fn vec_znx_add<R, A, B>(&self, res: &mut R, res_col: usize, a: &A, a_col: usize, b: &B, b_col: usize)
 29    where
 30        R: VecZnxToMut,
 31        A: VecZnxToRef,
 32        B: VecZnxToRef;
 33}
 34
 35pub trait VecZnxAddInplace {
 36    /// Adds the selected column of `a` to the selected column of `res` and writes the result on the selected column of `res`.
 37    fn vec_znx_add_inplace<R, A>(&self, res: &mut R, res_col: usize, a: &A, a_col: usize)
 38    where
 39        R: VecZnxToMut,
 40        A: VecZnxToRef;
 41}
 42
 43pub trait VecZnxAddScalar {
 44    /// Adds the selected column of `a` on the selected column and limb of `b` and writes the result on the selected column of `res`.
 45    #[allow(clippy::too_many_arguments)]
 46    fn vec_znx_add_scalar<R, A, B>(&self, res: &mut R, res_col: usize, a: &A, a_col: usize, b: &B, b_col: usize, b_limb: usize)
 47    where
 48        R: VecZnxToMut,
 49        A: ScalarZnxToRef,
 50        B: VecZnxToRef;
 51}
 52
 53pub trait VecZnxAddScalarInplace {
 54    /// Adds the selected column of `a` on the selected column and limb of `res`.
 55    fn vec_znx_add_scalar_inplace<R, A>(&self, res: &mut R, res_col: usize, res_limb: usize, a: &A, a_col: usize)
 56    where
 57        R: VecZnxToMut,
 58        A: ScalarZnxToRef;
 59}
 60
 61pub trait VecZnxSub {
 62    /// Subtracts the selected column of `b` from the selected column of `a` and writes the result on the selected column of `res`.
 63    fn vec_znx_sub<R, A, B>(&self, res: &mut R, res_col: usize, a: &A, a_col: usize, b: &B, b_col: usize)
 64    where
 65        R: VecZnxToMut,
 66        A: VecZnxToRef,
 67        B: VecZnxToRef;
 68}
 69
 70pub trait VecZnxSubABInplace {
 71    /// Subtracts the selected column of `a` from the selected column of `res` inplace.
 72    ///
 73    /// res\[res_col\] -= a\[a_col\]
 74    fn vec_znx_sub_ab_inplace<R, A>(&self, res: &mut R, res_col: usize, a: &A, a_col: usize)
 75    where
 76        R: VecZnxToMut,
 77        A: VecZnxToRef;
 78}
 79
 80pub trait VecZnxSubBAInplace {
 81    /// Subtracts the selected column of `res` from the selected column of `a` and inplace mutates `res`
 82    ///
 83    /// res\[res_col\] = a\[a_col\] - res\[res_col\]
 84    fn vec_znx_sub_ba_inplace<R, A>(&self, res: &mut R, res_col: usize, a: &A, a_col: usize)
 85    where
 86        R: VecZnxToMut,
 87        A: VecZnxToRef;
 88}
 89
 90pub trait VecZnxSubScalar {
 91    /// Subtracts the selected column of `a` on the selected column and limb of `b` and writes the result on the selected column of `res`.
 92    #[allow(clippy::too_many_arguments)]
 93    fn vec_znx_sub_scalar<R, A, B>(&self, res: &mut R, res_col: usize, a: &A, a_col: usize, b: &B, b_col: usize, b_limb: usize)
 94    where
 95        R: VecZnxToMut,
 96        A: ScalarZnxToRef,
 97        B: VecZnxToRef;
 98}
 99
100pub trait VecZnxSubScalarInplace {
101    /// Subtracts the selected column of `a` on the selected column and limb of `res`.
102    fn vec_znx_sub_scalar_inplace<R, A>(&self, res: &mut R, res_col: usize, res_limb: usize, a: &A, a_col: usize)
103    where
104        R: VecZnxToMut,
105        A: ScalarZnxToRef;
106}
107
108pub trait VecZnxNegate {
109    // Negates the selected column of `a` and stores the result in `res_col` of `res`.
110    fn vec_znx_negate<R, A>(&self, res: &mut R, res_col: usize, a: &A, a_col: usize)
111    where
112        R: VecZnxToMut,
113        A: VecZnxToRef;
114}
115
116pub trait VecZnxNegateInplace {
117    /// Negates the selected column of `a`.
118    fn vec_znx_negate_inplace<A>(&self, a: &mut A, a_col: usize)
119    where
120        A: VecZnxToMut;
121}
122
123pub trait VecZnxLshTmpBytes {
124    fn vec_znx_lsh_tmp_bytes(&self) -> usize;
125}
126
127pub trait VecZnxLsh<B: Backend> {
128    /// Left shift by k bits all columns of `a`.
129    #[allow(clippy::too_many_arguments)]
130    fn vec_znx_lsh<R, A>(&self, basek: usize, k: usize, r: &mut R, res_col: usize, a: &A, a_col: usize, scratch: &mut Scratch<B>)
131    where
132        R: VecZnxToMut,
133        A: VecZnxToRef;
134}
135
136pub trait VecZnxRshTmpBytes {
137    fn vec_znx_rsh_tmp_bytes(&self) -> usize;
138}
139
140pub trait VecZnxRsh<B: Backend> {
141    /// Right shift by k bits all columns of `a`.
142    #[allow(clippy::too_many_arguments)]
143    fn vec_znx_rsh<R, A>(&self, basek: usize, k: usize, r: &mut R, res_col: usize, a: &A, a_col: usize, scratch: &mut Scratch<B>)
144    where
145        R: VecZnxToMut,
146        A: VecZnxToRef;
147}
148
149pub trait VecZnxLshInplace<B: Backend> {
150    /// Left shift by k bits all columns of `a`.
151    fn vec_znx_lsh_inplace<A>(&self, basek: usize, k: usize, a: &mut A, a_col: usize, scratch: &mut Scratch<B>)
152    where
153        A: VecZnxToMut;
154}
155
156pub trait VecZnxRshInplace<B: Backend> {
157    /// Right shift by k bits all columns of `a`.
158    fn vec_znx_rsh_inplace<A>(&self, basek: usize, k: usize, a: &mut A, a_col: usize, scratch: &mut Scratch<B>)
159    where
160        A: VecZnxToMut;
161}
162
163pub trait VecZnxRotate {
164    /// Multiplies the selected column of `a` by X^k and stores the result in `res_col` of `res`.
165    fn vec_znx_rotate<R, A>(&self, p: i64, res: &mut R, res_col: usize, a: &A, a_col: usize)
166    where
167        R: VecZnxToMut,
168        A: VecZnxToRef;
169}
170
171pub trait VecZnxRotateInplaceTmpBytes {
172    fn vec_znx_rotate_inplace_tmp_bytes(&self) -> usize;
173}
174
175pub trait VecZnxRotateInplace<B: Backend> {
176    /// Multiplies the selected column of `a` by X^k.
177    fn vec_znx_rotate_inplace<A>(&self, p: i64, a: &mut A, a_col: usize, scratch: &mut Scratch<B>)
178    where
179        A: VecZnxToMut;
180}
181
182pub trait VecZnxAutomorphism {
183    /// Applies the automorphism X^i -> X^ik on the selected column of `a` and stores the result in `res_col` column of `res`.
184    fn vec_znx_automorphism<R, A>(&self, k: i64, res: &mut R, res_col: usize, a: &A, a_col: usize)
185    where
186        R: VecZnxToMut,
187        A: VecZnxToRef;
188}
189
190pub trait VecZnxAutomorphismInplaceTmpBytes {
191    fn vec_znx_automorphism_inplace_tmp_bytes(&self) -> usize;
192}
193
194pub trait VecZnxAutomorphismInplace<B: Backend> {
195    /// Applies the automorphism X^i -> X^ik on the selected column of `a`.
196    fn vec_znx_automorphism_inplace<R>(&self, k: i64, res: &mut R, res_col: usize, scratch: &mut Scratch<B>)
197    where
198        R: VecZnxToMut;
199}
200
201pub trait VecZnxMulXpMinusOne {
202    fn vec_znx_mul_xp_minus_one<R, A>(&self, p: i64, res: &mut R, res_col: usize, a: &A, a_col: usize)
203    where
204        R: VecZnxToMut,
205        A: VecZnxToRef;
206}
207
208pub trait VecZnxMulXpMinusOneInplaceTmpBytes {
209    fn vec_znx_mul_xp_minus_one_inplace_tmp_bytes(&self) -> usize;
210}
211
212pub trait VecZnxMulXpMinusOneInplace<B: Backend> {
213    fn vec_znx_mul_xp_minus_one_inplace<R>(&self, p: i64, res: &mut R, res_col: usize, scratch: &mut Scratch<B>)
214    where
215        R: VecZnxToMut;
216}
217
218pub trait VecZnxSplitRingTmpBytes {
219    fn vec_znx_split_ring_tmp_bytes(&self) -> usize;
220}
221
222pub trait VecZnxSplitRing<B: Backend> {
223    /// Splits the selected columns of `b` into subrings and copies them them into the selected column of `res`.
224    ///
225    /// # Panics
226    ///
227    /// This method requires that all [crate::layouts::VecZnx] of b have the same ring degree
228    /// and that b.n() * b.len() <= a.n()
229    fn vec_znx_split_ring<R, A>(&self, res: &mut [R], res_col: usize, a: &A, a_col: usize, scratch: &mut Scratch<B>)
230    where
231        R: VecZnxToMut,
232        A: VecZnxToRef;
233}
234
235pub trait VecZnxMergeRingsTmpBytes {
236    fn vec_znx_merge_rings_tmp_bytes(&self) -> usize;
237}
238
239pub trait VecZnxMergeRings<B: Backend> {
240    /// Merges the subrings of the selected column of `a` into the selected column of `res`.
241    ///
242    /// # Panics
243    ///
244    /// This method requires that all [crate::layouts::VecZnx] of a have the same ring degree
245    /// and that a.n() * a.len() <= b.n()
246    fn vec_znx_merge_rings<R, A>(&self, res: &mut R, res_col: usize, a: &[A], a_col: usize, scratch: &mut Scratch<B>)
247    where
248        R: VecZnxToMut,
249        A: VecZnxToRef;
250}
251
252pub trait VecZnxSwitchRing {
253    fn vec_znx_switch_ring<R, A>(&self, res: &mut R, res_col: usize, a: &A, col_a: usize)
254    where
255        R: VecZnxToMut,
256        A: VecZnxToRef;
257}
258
259pub trait VecZnxCopy {
260    fn vec_znx_copy<R, A>(&self, res: &mut R, res_col: usize, a: &A, a_col: usize)
261    where
262        R: VecZnxToMut,
263        A: VecZnxToRef;
264}
265
266pub trait VecZnxFillUniform {
267    /// Fills the first `size` size with uniform values in \[-2^{basek-1}, 2^{basek-1}\]
268    fn vec_znx_fill_uniform<R>(&self, basek: usize, res: &mut R, res_col: usize, source: &mut Source)
269    where
270        R: VecZnxToMut;
271}
272
273#[allow(clippy::too_many_arguments)]
274pub trait VecZnxFillNormal {
275    fn vec_znx_fill_normal<R>(
276        &self,
277        basek: usize,
278        res: &mut R,
279        res_col: usize,
280        k: usize,
281        source: &mut Source,
282        sigma: f64,
283        bound: f64,
284    ) where
285        R: VecZnxToMut;
286}
287
288#[allow(clippy::too_many_arguments)]
289pub trait VecZnxAddNormal {
290    /// Adds a discrete normal vector scaled by 2^{-k} with the provided standard deviation and bounded to \[-bound, bound\].
291    fn vec_znx_add_normal<R>(
292        &self,
293        basek: usize,
294        res: &mut R,
295        res_col: usize,
296        k: usize,
297        source: &mut Source,
298        sigma: f64,
299        bound: f64,
300    ) where
301        R: VecZnxToMut;
302}