arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/poulpy-hal/src/reference/znx/rotate.rs
poulpy-hal/src/reference/znx/rotate.rsRaw
 1use crate::reference::znx::{ZnxCopy, ZnxNegate};
 2
 3pub fn znx_rotate<ZNXARI: ZnxNegate + ZnxCopy>(p: i64, res: &mut [i64], src: &[i64]) {
 4    #[cfg(debug_assertions)]
 5    {
 6        assert_eq!(res.len(), src.len());
 7    }
 8
 9    let n: usize = res.len();
10
11    let mp_2n: usize = (p & (2 * n as i64 - 1)) as usize; // -p % 2n
12    let mp_1n: usize = mp_2n & (n - 1); // -p % n
13    let mp_1n_neg: usize = n - mp_1n; //  p % n
14    let neg_first: bool = mp_2n < n;
15
16    let (dst1, dst2) = res.split_at_mut(mp_1n);
17    let (src1, src2) = src.split_at(mp_1n_neg);
18
19    if neg_first {
20        ZNXARI::znx_negate(dst1, src2);
21        ZNXARI::znx_copy(dst2, src1);
22    } else {
23        ZNXARI::znx_copy(dst1, src2);
24        ZNXARI::znx_negate(dst2, src1);
25    }
26}