use ark_ff::fields::PrimeField; use ark_std::cfg_iter; pub fn vec_add(a: &[F], b: &[F]) -> Vec { let mut r: Vec = vec![F::zero(); a.len()]; for i in 0..a.len() { r[i] = a[i] + b[i]; } r } pub fn vec_sub(a: &[F], b: &[F]) -> Vec { let mut r: Vec = vec![F::zero(); a.len()]; for i in 0..a.len() { r[i] = a[i] - b[i]; } r } pub fn vec_scalar_mul(vec: &[F], c: &F) -> Vec { let mut result = vec![F::zero(); vec.len()]; for (i, a) in vec.iter().enumerate() { result[i] = *a * c; } result } pub fn is_zero_vec(vec: &[F]) -> bool { for e in vec { if !e.is_zero() { return false; } } true } #[allow(clippy::needless_range_loop)] pub fn mat_vec_mul(M: &Vec>, z: &[F]) -> Vec { // TODO assert len let mut r: Vec = vec![F::zero(); M.len()]; for i in 0..M.len() { for j in 0..M[i].len() { r[i] += M[i][j] * z[j]; } } r } pub fn hadamard(a: &[F], b: &[F]) -> Vec { cfg_iter!(a).zip(b).map(|(a, b)| *a * b).collect() } // returns (b, b^2, b^4, ..., b^{2^{t-1}}) TODO find better name pub fn powers_of_beta(b: F, t: usize) -> Vec { let mut r = vec![F::zero(); t]; r[0] = b; for i in 1..t { r[i] = r[i - 1].square(); } r } pub fn all_powers(a: F, n: usize) -> Vec { let mut r = vec![F::zero(); n]; // TODO more efficiently for i in 0..n { r[i] = a.pow([i as u64]); } r } pub fn bit_decompose(input: u64, n: usize) -> Vec { let mut res = Vec::with_capacity(n); let mut i = input; for _ in 0..n { res.push(i & 1 == 1); i >>= 1; } res }