arnaucube
arnaucube/protogalaxy-pocPublic Self-hosted repository
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}