protogalaxy-poc/src/utils.rs
src/utils.rsRaw
1use ark_ff::fields::PrimeField;
2use ark_std::cfg_iter;
3
4pub fn vec_add<F: PrimeField>(a: &Vec<F>, b: &[F]) -> Vec<F> {
5 let mut r: Vec<F> = vec![F::zero(); a.len()];
6 for i in 0..a.len() {
7 r[i] = a[i] + b[i];
8 }
9 r
10}
11
12pub fn vec_sub<F: PrimeField>(a: &Vec<F>, b: &Vec<F>) -> Vec<F> {
13 let mut r: Vec<F> = vec![F::zero(); a.len()];
14 for i in 0..a.len() {
15 r[i] = a[i] - b[i];
16 }
17 r
18}
19
20pub fn vec_scalar_mul<F: PrimeField>(vec: &[F], c: &F) -> Vec<F> {
21 let mut result = vec![F::zero(); vec.len()];
22 for (i, a) in vec.iter().enumerate() {
23 result[i] = *a * c;
24 }
25 result
26}
27pub fn is_zero_vec<F: PrimeField>(vec: &[F]) -> bool {
28 for e in vec {
29 if !e.is_zero() {
30 return false;
31 }
32 }
33 true
34}
35
36#[allow(clippy::needless_range_loop)]
37pub fn mat_vec_mul<F: PrimeField>(M: &Vec<Vec<F>>, z: &[F]) -> Vec<F> {
38 // TODO assert len
39 let mut r: Vec<F> = vec![F::zero(); M.len()];
40 for i in 0..M.len() {
41 for j in 0..M[i].len() {
42 r[i] += M[i][j] * z[j];
43 }
44 }
45 r
46}
47
48pub fn hadamard<F: PrimeField>(a: &Vec<F>, b: &Vec<F>) -> Vec<F> {
49 cfg_iter!(a).zip(b).map(|(a, b)| *a * b).collect()
50}
51
52// returns (b, b^2, b^4, ..., b^{2^{t-1}}) TODO find better name
53pub fn powers_of_beta<F: PrimeField>(b: F, t: usize) -> Vec<F> {
54 let mut r = vec![F::zero(); t];
55 r[0] = b;
56 for i in 1..t {
57 r[i] = r[i - 1].square();
58 }
59 r
60}
61pub fn all_powers<F: PrimeField>(a: F, n: usize) -> Vec<F> {
62 let mut r = vec![F::zero(); n];
63 // TODO more efficiently
64 for i in 0..n {
65 r[i] = a.pow([i as u64]);
66 }
67 r
68}
69
70pub fn bit_decompose(input: u64, n: usize) -> Vec<bool> {
71 let mut res = Vec::with_capacity(n);
72 let mut i = input;
73 for _ in 0..n {
74 res.push(i & 1 == 1);
75 i >>= 1;
76 }
77 res
78}