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