use crate::tower::F2_128;
pub fn batch_inv_128(input: &[F2_128], output: &mut [F2_128]) {
let n = input.len();
assert!(n == output.len(), "length mismatch");
if n == 0 {
return;
}
let mut running = F2_128::ONE;
for i in 0..n {
if input[i].is_zero() {
output[i] = F2_128::ZERO;
} else {
running = running.mul(input[i]);
output[i] = running;
}
}
if running.is_zero() {
for elem in output.iter_mut().take(n) {
*elem = F2_128::ZERO;
}
return;
}
let mut inv_acc = running.inv();
let mut i = n;
while i > 1 {
i -= 1;
if input[i].is_zero() {
output[i] = F2_128::ZERO;
} else {
let prev = if i > 0 { output[i - 1] } else { F2_128::ONE };
output[i] = inv_acc.mul(if prev.is_zero() { F2_128::ONE } else { prev });
inv_acc = inv_acc.mul(input[i]);
}
}
if !input[0].is_zero() {
output[0] = inv_acc;
} else {
output[0] = F2_128::ZERO;
}
}