arnaucube
arnaucube/poulpyPublic Self-hosted repository
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, ZnxSubInplace, 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!(b_limb < min_size, "b_limb: {b_limb} > min_size: {min_size}");
23    }
24
25    for j in 0..min_size {
26        if j == b_limb {
27            ZNXARI::znx_sub(res.at_mut(res_col, j), b.at(b_col, j), a.at(a_col, 0));
28        } else {
29            res.at_mut(res_col, j).copy_from_slice(b.at(b_col, j));
30        }
31    }
32
33    for j in min_size..res.size() {
34        ZNXARI::znx_zero(res.at_mut(res_col, j));
35    }
36}
37
38pub fn vec_znx_sub_scalar_inplace<R, A, ZNXARI>(res: &mut R, res_col: usize, res_limb: usize, a: &A, a_col: usize)
39where
40    R: VecZnxToMut,
41    A: ScalarZnxToRef,
42    ZNXARI: ZnxSubInplace,
43{
44    let a: ScalarZnx<&[u8]> = a.to_ref();
45    let mut res: VecZnx<&mut [u8]> = res.to_mut();
46
47    #[cfg(debug_assertions)]
48    {
49        assert!(res_limb < res.size());
50    }
51
52    ZNXARI::znx_sub_inplace(res.at_mut(res_col, res_limb), a.at(a_col, 0));
53}