pub(crate) fn reversible_lift_53_i32(values: &mut [i32]) {
let n = values.len();
if n < 2 {
return;
}
if n.is_multiple_of(2) {
for i in (1..n - 1).step_by(2) {
values[i] -= floor_div_i32(values[i - 1] + values[i + 1], 2);
}
values[n - 1] -= values[n - 2];
values[0] += floor_div_i32(values[1] + 1, 2);
for i in (2..n).step_by(2) {
values[i] += floor_div_i32(values[i - 1] + values[i + 1] + 2, 4);
}
return;
}
let last_even = n - 1;
for i in (1..n).step_by(2) {
let right = values.get(i + 1).copied().unwrap_or(values[last_even]);
values[i] -= floor_div_i32(values[i - 1] + right, 2);
}
for i in (0..n).step_by(2) {
let left = if i > 0 { values[i - 1] } else { values[1] };
let right = values.get(i + 1).copied().unwrap_or(left);
values[i] += floor_div_i32(left + right + 2, 4);
}
}
pub(crate) fn floor_div_i32(numerator: i32, denominator: i32) -> i32 {
numerator.div_euclid(denominator)
}