arnaucube
arnaucube/hyperplonkPublic Self-hosted repository
hyperplonk/arithmetic/src/multilinear_polynomial.rs
arithmetic/src/multilinear_polynomial.rsRaw
 1use ark_ff::PrimeField;
 2use ark_std::{end_timer, rand::RngCore, start_timer};
 3use std::rc::Rc;
 4
 5pub use ark_poly::DenseMultilinearExtension;
 6
 7// Build a randomize list of mle-s whose sum is zero.
 8pub fn random_zero_mle_list<F: PrimeField, R: RngCore>(
 9    nv: usize,
10    degree: usize,
11    rng: &mut R,
12) -> Vec<Rc<DenseMultilinearExtension<F>>> {
13    let start = start_timer!(|| "sample random zero mle list");
14
15    let mut multiplicands = Vec::with_capacity(degree);
16    for _ in 0..degree {
17        multiplicands.push(Vec::with_capacity(1 << nv))
18    }
19    for _ in 0..(1 << nv) {
20        multiplicands[0].push(F::zero());
21        for e in multiplicands.iter_mut().skip(1) {
22            e.push(F::rand(rng));
23        }
24    }
25
26    let list = multiplicands
27        .into_iter()
28        .map(|x| Rc::new(DenseMultilinearExtension::from_evaluations_vec(nv, x)))
29        .collect();
30
31    end_timer!(start);
32    list
33}