poulpy/poulpy-hal/src/reference/vec_znx/sub_scalar.rs
poulpy-hal/src/reference/vec_znx/sub_scalar.rsRaw
1use crate::layouts::{ScalarZnxToRef, VecZnxToMut, VecZnxToRef};
2use crate::{
3 layouts::{ScalarZnx, VecZnx, ZnxInfos, ZnxView, ZnxViewMut},
4 reference::znx::{ZnxSub, ZnxSubABInplace, ZnxZero},
5};
6
7pub fn vec_znx_sub_scalar<R, A, B, ZNXARI>(res: &mut R, res_col: usize, a: &A, a_col: usize, b: &B, b_col: usize, b_limb: usize)
8where
9 R: VecZnxToMut,
10 A: ScalarZnxToRef,
11 B: VecZnxToRef,
12 ZNXARI: ZnxSub + ZnxZero,
13{
14 let a: ScalarZnx<&[u8]> = a.to_ref();
15 let b: VecZnx<&[u8]> = b.to_ref();
16 let mut res: VecZnx<&mut [u8]> = res.to_mut();
17
18 let min_size: usize = b.size().min(res.size());
19
20 #[cfg(debug_assertions)]
21 {
22 assert!(
23 b_limb < min_size,
24 "b_limb: {} > min_size: {}",
25 b_limb,
26 min_size
27 );
28 }
29
30 for j in 0..min_size {
31 if j == b_limb {
32 ZNXARI::znx_sub(res.at_mut(res_col, j), b.at(b_col, j), a.at(a_col, 0));
33 } else {
34 res.at_mut(res_col, j).copy_from_slice(b.at(b_col, j));
35 }
36 }
37
38 for j in min_size..res.size() {
39 ZNXARI::znx_zero(res.at_mut(res_col, j));
40 }
41}
42
43pub fn vec_znx_sub_scalar_inplace<R, A, ZNXARI>(res: &mut R, res_col: usize, res_limb: usize, a: &A, a_col: usize)
44where
45 R: VecZnxToMut,
46 A: ScalarZnxToRef,
47 ZNXARI: ZnxSubABInplace,
48{
49 let a: ScalarZnx<&[u8]> = a.to_ref();
50 let mut res: VecZnx<&mut [u8]> = res.to_mut();
51
52 #[cfg(debug_assertions)]
53 {
54 assert!(res_limb < res.size());
55 }
56
57 ZNXARI::znx_sub_ab_inplace(res.at_mut(res_col, res_limb), a.at(a_col, 0));
58}