use crate::field::Goldilocks;
pub fn batch_inv(a: &[Goldilocks], result: &mut [Goldilocks]) {
let n = a.len();
assert!(n == result.len());
if n == 0 {
return;
}
result[0] = a[0];
for i in 1..n {
result[i] = result[i - 1] * a[i];
}
let mut inv_all = result[n - 1].inv();
for i in (1..n).rev() {
result[i] = inv_all * result[i - 1];
inv_all = inv_all * a[i];
}
result[0] = inv_all;
}
pub fn batch_inv_safe(a: &[Goldilocks], result: &mut [Goldilocks]) {
let n = a.len();
assert!(n == result.len());
if n == 0 {
return;
}
result[0] = if a[0].is_zero() { Goldilocks::ONE } else { a[0] };
for i in 1..n {
let ai = if a[i].is_zero() { Goldilocks::ONE } else { a[i] };
result[i] = result[i - 1] * ai;
}
let mut inv_all = result[n - 1].inv();
for i in (1..n).rev() {
let ai = if a[i].is_zero() { Goldilocks::ONE } else { a[i] };
result[i] = if a[i].is_zero() {
Goldilocks::ZERO
} else {
inv_all * result[i - 1]
};
inv_all = inv_all * ai;
}
result[0] = if a[0].is_zero() { Goldilocks::ZERO } else { inv_all };
}