fix cross-base2k vec_znx_normalize wrong early carry

This commit is contained in:
Pro7ech
2025-11-17 16:45:50 +01:00
parent 2613bf1450
commit 08d3f55af9
13 changed files with 101 additions and 115 deletions

View File

@@ -32,7 +32,7 @@ impl<D: DataRef> VecZnx<D> {
data.iter().for_each(|x| {
avg.add_assign_round(x, Round::Nearest);
max.max_mut(&Float::with_val(53, x.abs_ref()));
max.max_mut(&Float::with_val(prec, x.abs_ref()));
});
avg.div_assign_round(Float::with_val(prec, data.len()), Round::Nearest);
data.iter_mut().for_each(|x| {

View File

@@ -95,9 +95,9 @@ pub fn vec_znx_normalize<R, A, ZNXARI>(
// Get carry for limbs of a that have higher precision than res
for j in (a_min_size..a_size).rev() {
if j == a_size - 1 {
ZNXARI::znx_normalize_first_step_carry_only(res_base2k, 0, a.at(a_col, j), carry);
ZNXARI::znx_normalize_first_step_carry_only(a_base2k, 0, a.at(a_col, j), carry);
} else {
ZNXARI::znx_normalize_middle_step_carry_only(res_base2k, 0, a.at(a_col, j), carry);
ZNXARI::znx_normalize_middle_step_carry_only(a_base2k, 0, a.at(a_col, j), carry);
}
}
@@ -118,6 +118,10 @@ pub fn vec_znx_normalize<R, A, ZNXARI>(
// for the current limb.
let mut res_left: usize = res_base2k;
for j in 0..res_size {
ZNXARI::znx_zero(res.at_mut(res_col, j));
}
for j in (0..a_min_size).rev() {
// Trackers: wow much of a_norm is left to
// be flushed on res.
@@ -196,10 +200,6 @@ pub fn vec_znx_normalize<R, A, ZNXARI>(
}
}
}
for j in res_min_size..res_size {
ZNXARI::znx_zero(res.at_mut(res_col, j));
}
}
}
@@ -380,14 +380,6 @@ fn test_vec_znx_normalize_conv() {
err.sub_assign_round(&data_res[i], Round::Nearest);
err = err.abs();
// println!(
// "want: {} have: {} tmp: {} (want-have): {}",
// data_want[i].to_f64(),
// data_res[i].to_f64(),
// data_tmp[i].to_f64(),
// err.to_f64()
// );
let err_log2: f64 = err
.clone()
.max(&Float::with_val(prec as u32, 1e-60))