fixed modulus switching rounding

This commit is contained in:
Jean-Philippe Bossuat
2025-07-08 13:48:51 +02:00
parent f7c94cd84a
commit af5bbbb55d

View File

@@ -438,7 +438,7 @@ pub(crate) fn negate_and_mod_switch_2n(n: usize, res: &mut [i64], lwe: &LWECiphe
if basek > log2n { if basek > log2n {
let diff: usize = basek - log2n; let diff: usize = basek - log2n;
res.iter_mut().for_each(|x| { res.iter_mut().for_each(|x| {
*x = div_ceil_signed_by_pow2(x, diff); *x = div_round_by_pow2(x, diff);
}) })
} else { } else {
let rem: usize = basek - (log2n % basek); let rem: usize = basek - (log2n % basek);
@@ -460,21 +460,5 @@ pub(crate) fn negate_and_mod_switch_2n(n: usize, res: &mut [i64], lwe: &LWECiphe
#[inline(always)] #[inline(always)]
fn div_round_by_pow2(x: &i64, k: usize) -> i64 { fn div_round_by_pow2(x: &i64, k: usize) -> i64 {
if x >= &0 { (x + (1 << (k - 1))) >> k
(x + (1 << (k - 1))) >> k
} else {
(x + (-1 << (k - 1))) >> k
}
}
// #[inline(always)]
// fn div_floor_signed_by_pow2(x: &i64, k: usize) -> i64{
// let bias: i64 = (1 << k) - 1;
// (x + ((x >> 63) & bias)) >> k
// }
#[inline(always)]
fn div_ceil_signed_by_pow2(x: &i64, k: usize) -> i64 {
let bias: i64 = (1 << k) - 1;
(x + ((x >> 63) & bias)) >> k
} }