This commit is contained in:
Charles Chen
2022-12-16 09:18:53 -05:00
parent 366a2674bc
commit 648ea51ff4
18 changed files with 140 additions and 140 deletions

View File

@@ -2,7 +2,7 @@ use arithmetic::{identity_permutation_mles, VPAuxInfo, VirtualPolynomial};
use ark_bls12_381::{Bls12_381, Fr};
use ark_poly::{DenseMultilinearExtension, MultilinearExtension};
use ark_std::test_rng;
use std::{marker::PhantomData, rc::Rc, time::Instant};
use std::{marker::PhantomData, sync::Arc, time::Instant};
use subroutines::{
pcs::{prelude::MultilinearKzgPCS, PolynomialCommitmentScheme},
poly_iop::prelude::{
@@ -144,7 +144,7 @@ fn bench_permutation_check() -> Result<(), PolyIOPErrors> {
10
};
let ws = vec![Rc::new(DenseMultilinearExtension::rand(nv, &mut rng))];
let ws = vec![Arc::new(DenseMultilinearExtension::rand(nv, &mut rng))];
// identity map
let perms = identity_permutation_mles(nv, 1);
@@ -218,8 +218,8 @@ fn bench_prod_check() -> Result<(), PolyIOPErrors> {
let f: DenseMultilinearExtension<Fr> = DenseMultilinearExtension::rand(nv, &mut rng);
let mut g = f.clone();
g.evaluations.reverse();
let fs = vec![Rc::new(f)];
let gs = vec![Rc::new(g)];
let fs = vec![Arc::new(f)];
let gs = vec![Arc::new(g)];
let proof = {
let start = Instant::now();

View File

@@ -1,7 +1,7 @@
use ark_bls12_381::{Bls12_381, Fr};
use ark_ff::UniformRand;
use ark_poly::{DenseMultilinearExtension, MultilinearExtension};
use ark_std::{rc::Rc, test_rng};
use ark_std::{sync::Arc, test_rng};
use std::time::Instant;
use subroutines::pcs::{
prelude::{MultilinearKzgPCS, PCSError, PolynomialCommitmentScheme},
@@ -27,7 +27,7 @@ fn bench_pcs() -> Result<(), PCSError> {
2
};
let poly = Rc::new(DenseMultilinearExtension::rand(nv, &mut rng));
let poly = Arc::new(DenseMultilinearExtension::rand(nv, &mut rng));
let (ck, vk) = uni_params.trim(nv)?;
let point: Vec<_> = (0..nv).map(|_| Fr::rand(&mut rng)).collect();

View File

@@ -17,19 +17,13 @@ use transcript::IOPTranscript;
/// Note that for our usage of PCS, we do not require the hiding property.
pub trait PolynomialCommitmentScheme<E: PairingEngine> {
/// Prover parameters
type ProverParam: Clone;
type ProverParam: Clone + Sync;
/// Verifier parameters
type VerifierParam: Clone + CanonicalSerialize + CanonicalDeserialize;
/// Structured reference string
type SRS: Clone + Debug;
/// Polynomial and its associated types
type Polynomial: Clone
+ Debug
+ Hash
+ PartialEq
+ Eq
+ CanonicalSerialize
+ CanonicalDeserialize;
type Polynomial: Clone + Debug + Hash + PartialEq + Eq;
/// Polynomial input domain
type Point: Clone + Ord + Debug + Sync + Hash + PartialEq + Eq;
/// Polynomial Evaluation

View File

@@ -17,7 +17,7 @@ use arithmetic::{build_eq_x_r_vec, DenseMultilinearExtension, VPAuxInfo, Virtual
use ark_ec::{msm::VariableBaseMSM, PairingEngine, ProjectiveCurve};
use ark_ff::PrimeField;
use ark_std::{end_timer, log2, start_timer, One, Zero};
use std::{marker::PhantomData, rc::Rc};
use std::{marker::PhantomData, sync::Arc};
use transcript::IOPTranscript;
#[derive(Clone, Debug, Default, PartialEq, Eq)]
@@ -53,7 +53,7 @@ where
E: PairingEngine,
PCS: PolynomialCommitmentScheme<
E,
Polynomial = Rc<DenseMultilinearExtension<E::Fr>>,
Polynomial = Arc<DenseMultilinearExtension<E::Fr>>,
Point = Vec<E::Fr>,
Evaluation = E::Fr,
>,
@@ -79,7 +79,7 @@ where
for (j, &f_i_eval) in f_i.iter().enumerate() {
tilde_g_eval[j] = f_i_eval * eq_t_i_list[index];
}
tilde_gs.push(Rc::new(DenseMultilinearExtension::from_evaluations_vec(
tilde_gs.push(Arc::new(DenseMultilinearExtension::from_evaluations_vec(
num_var,
tilde_g_eval,
)));
@@ -90,7 +90,7 @@ where
let mut tilde_eqs = vec![];
for point in points.iter() {
let eq_b_zi = build_eq_x_r_vec(point)?;
tilde_eqs.push(Rc::new(DenseMultilinearExtension::from_evaluations_vec(
tilde_eqs.push(Arc::new(DenseMultilinearExtension::from_evaluations_vec(
num_var, eq_b_zi,
)));
}
@@ -131,7 +131,7 @@ where
g_prime_evals[j] += tilde_g_eval * eq_i_a2;
}
}
let g_prime = Rc::new(DenseMultilinearExtension::from_evaluations_vec(
let g_prime = Arc::new(DenseMultilinearExtension::from_evaluations_vec(
num_var,
g_prime_evals,
));
@@ -169,7 +169,7 @@ where
E: PairingEngine,
PCS: PolynomialCommitmentScheme<
E,
Polynomial = Rc<DenseMultilinearExtension<E::Fr>>,
Polynomial = Arc<DenseMultilinearExtension<E::Fr>>,
Point = Vec<E::Fr>,
Evaluation = E::Fr,
Commitment = Commitment<E>,
@@ -265,7 +265,7 @@ mod tests {
fn test_multi_open_helper<R: RngCore + CryptoRng>(
ml_params: &MultilinearUniversalParams<E>,
polys: &[Rc<DenseMultilinearExtension<Fr>>],
polys: &[Arc<DenseMultilinearExtension<Fr>>],
rng: &mut R,
) -> Result<(), PCSError> {
let merged_nv = get_batched_nv(polys[0].num_vars(), polys.len());
@@ -323,7 +323,7 @@ mod tests {
for num_poly in 5..6 {
for nv in 15..16 {
let polys1: Vec<_> = (0..num_poly)
.map(|_| Rc::new(DenseMultilinearExtension::rand(nv, &mut rng)))
.map(|_| Arc::new(DenseMultilinearExtension::rand(nv, &mut rng)))
.collect();
test_multi_open_helper(&ml_params, &polys1, &mut rng)?;
}

View File

@@ -27,9 +27,9 @@ use ark_std::{
end_timer, format,
marker::PhantomData,
rand::{CryptoRng, RngCore},
rc::Rc,
start_timer,
string::ToString,
sync::Arc,
vec,
vec::Vec,
One, Zero,
@@ -59,7 +59,7 @@ impl<E: PairingEngine> PolynomialCommitmentScheme<E> for MultilinearKzgPCS<E> {
type VerifierParam = MultilinearVerifierParam<E>;
type SRS = MultilinearUniversalParams<E>;
// Polynomial and its associated types
type Polynomial = Rc<DenseMultilinearExtension<E::Fr>>;
type Polynomial = Arc<DenseMultilinearExtension<E::Fr>>;
type Point = Vec<E::Fr>;
type Evaluation = E::Fr;
// Commitments and proofs
@@ -356,7 +356,7 @@ mod tests {
fn test_single_helper<R: RngCore + CryptoRng>(
params: &MultilinearUniversalParams<E>,
poly: &Rc<DenseMultilinearExtension<Fr>>,
poly: &Arc<DenseMultilinearExtension<Fr>>,
rng: &mut R,
) -> Result<(), PCSError> {
let nv = poly.num_vars();
@@ -385,11 +385,11 @@ mod tests {
let params = MultilinearKzgPCS::<E>::gen_srs_for_testing(&mut rng, 10)?;
// normal polynomials
let poly1 = Rc::new(DenseMultilinearExtension::rand(8, &mut rng));
let poly1 = Arc::new(DenseMultilinearExtension::rand(8, &mut rng));
test_single_helper(&params, &poly1, &mut rng)?;
// single-variate polynomials
let poly2 = Rc::new(DenseMultilinearExtension::rand(1, &mut rng));
let poly2 = Arc::new(DenseMultilinearExtension::rand(1, &mut rng));
test_single_helper(&params, &poly2, &mut rng)?;
Ok(())

View File

@@ -8,7 +8,7 @@ use crate::{
use ark_ec::PairingEngine;
use ark_poly::DenseMultilinearExtension;
use ark_std::{end_timer, start_timer};
use std::rc::Rc;
use std::sync::Arc;
use transcript::IOPTranscript;
/// A permutation subclaim consists of
@@ -95,7 +95,7 @@ where
impl<E, PCS> PermutationCheck<E, PCS> for PolyIOP<E::Fr>
where
E: PairingEngine,
PCS: PolynomialCommitmentScheme<E, Polynomial = Rc<DenseMultilinearExtension<E::Fr>>>,
PCS: PolynomialCommitmentScheme<E, Polynomial = Arc<DenseMultilinearExtension<E::Fr>>>,
{
type PermutationCheckSubClaim = PermutationCheckSubClaim<E, PCS, Self>;
type PermutationProof = Self::ProductCheckProof;
@@ -192,19 +192,19 @@ mod test {
use ark_ec::PairingEngine;
use ark_poly::{DenseMultilinearExtension, MultilinearExtension};
use ark_std::test_rng;
use std::{marker::PhantomData, rc::Rc};
use std::{marker::PhantomData, sync::Arc};
type KZG = MultilinearKzgPCS<Bls12_381>;
fn test_permutation_check_helper<E, PCS>(
pcs_param: &PCS::ProverParam,
fxs: &[Rc<DenseMultilinearExtension<E::Fr>>],
gxs: &[Rc<DenseMultilinearExtension<E::Fr>>],
perms: &[Rc<DenseMultilinearExtension<E::Fr>>],
fxs: &[Arc<DenseMultilinearExtension<E::Fr>>],
gxs: &[Arc<DenseMultilinearExtension<E::Fr>>],
perms: &[Arc<DenseMultilinearExtension<E::Fr>>],
) -> Result<(), PolyIOPErrors>
where
E: PairingEngine,
PCS: PolynomialCommitmentScheme<E, Polynomial = Rc<DenseMultilinearExtension<E::Fr>>>,
PCS: PolynomialCommitmentScheme<E, Polynomial = Arc<DenseMultilinearExtension<E::Fr>>>,
{
let nv = fxs[0].num_vars;
// what's AuxInfo used for?
@@ -257,8 +257,8 @@ mod test {
// good path: (w1, w2) is a permutation of (w1, w2) itself under the identify
// map
let ws = vec![
Rc::new(DenseMultilinearExtension::rand(nv, &mut rng)),
Rc::new(DenseMultilinearExtension::rand(nv, &mut rng)),
Arc::new(DenseMultilinearExtension::rand(nv, &mut rng)),
Arc::new(DenseMultilinearExtension::rand(nv, &mut rng)),
];
// perms is the identity map
test_permutation_check_helper::<Bls12_381, KZG>(&pcs_param, &ws, &ws, &id_perms)?;
@@ -267,8 +267,8 @@ mod test {
{
// good path: f = (w1, w2) is a permutation of g = (w2, w1) itself under a map
let mut fs = vec![
Rc::new(DenseMultilinearExtension::rand(nv, &mut rng)),
Rc::new(DenseMultilinearExtension::rand(nv, &mut rng)),
Arc::new(DenseMultilinearExtension::rand(nv, &mut rng)),
Arc::new(DenseMultilinearExtension::rand(nv, &mut rng)),
];
let gs = fs.clone();
fs.reverse();
@@ -281,8 +281,8 @@ mod test {
{
// bad path 1: w is a not permutation of w itself under a random map
let ws = vec![
Rc::new(DenseMultilinearExtension::rand(nv, &mut rng)),
Rc::new(DenseMultilinearExtension::rand(nv, &mut rng)),
Arc::new(DenseMultilinearExtension::rand(nv, &mut rng)),
Arc::new(DenseMultilinearExtension::rand(nv, &mut rng)),
];
// perms is a random map
let perms = random_permutation_mles(nv, 2, &mut rng);
@@ -296,12 +296,12 @@ mod test {
{
// bad path 2: f is a not permutation of g under a identity map
let fs = vec![
Rc::new(DenseMultilinearExtension::rand(nv, &mut rng)),
Rc::new(DenseMultilinearExtension::rand(nv, &mut rng)),
Arc::new(DenseMultilinearExtension::rand(nv, &mut rng)),
Arc::new(DenseMultilinearExtension::rand(nv, &mut rng)),
];
let gs = vec![
Rc::new(DenseMultilinearExtension::rand(nv, &mut rng)),
Rc::new(DenseMultilinearExtension::rand(nv, &mut rng)),
Arc::new(DenseMultilinearExtension::rand(nv, &mut rng)),
Arc::new(DenseMultilinearExtension::rand(nv, &mut rng)),
];
// s_perm is the identity map

View File

@@ -5,7 +5,7 @@ use arithmetic::identity_permutation_mles;
use ark_ff::PrimeField;
use ark_poly::DenseMultilinearExtension;
use ark_std::{end_timer, start_timer};
use std::rc::Rc;
use std::sync::Arc;
/// Returns the evaluations of two list of MLEs:
/// - numerators = (a1, ..., ak)
@@ -24,13 +24,13 @@ use std::rc::Rc;
pub(super) fn computer_nums_and_denoms<F: PrimeField>(
beta: &F,
gamma: &F,
fxs: &[Rc<DenseMultilinearExtension<F>>],
gxs: &[Rc<DenseMultilinearExtension<F>>],
perms: &[Rc<DenseMultilinearExtension<F>>],
fxs: &[Arc<DenseMultilinearExtension<F>>],
gxs: &[Arc<DenseMultilinearExtension<F>>],
perms: &[Arc<DenseMultilinearExtension<F>>],
) -> Result<
(
Vec<Rc<DenseMultilinearExtension<F>>>,
Vec<Rc<DenseMultilinearExtension<F>>>,
Vec<Arc<DenseMultilinearExtension<F>>>,
Vec<Arc<DenseMultilinearExtension<F>>>,
),
PolyIOPErrors,
> {
@@ -54,11 +54,11 @@ pub(super) fn computer_nums_and_denoms<F: PrimeField>(
numerator_evals.push(numerator);
denominator_evals.push(denominator);
}
numerators.push(Rc::new(DenseMultilinearExtension::from_evaluations_vec(
numerators.push(Arc::new(DenseMultilinearExtension::from_evaluations_vec(
num_vars,
numerator_evals,
)));
denominators.push(Rc::new(DenseMultilinearExtension::from_evaluations_vec(
denominators.push(Arc::new(DenseMultilinearExtension::from_evaluations_vec(
num_vars,
denominator_evals,
)));

View File

@@ -14,7 +14,7 @@ use ark_ec::PairingEngine;
use ark_ff::{One, PrimeField, Zero};
use ark_poly::DenseMultilinearExtension;
use ark_std::{end_timer, start_timer};
use std::rc::Rc;
use std::sync::Arc;
use transcript::IOPTranscript;
mod util;
@@ -142,7 +142,7 @@ pub struct ProductCheckProof<
impl<E, PCS> ProductCheck<E, PCS> for PolyIOP<E::Fr>
where
E: PairingEngine,
PCS: PolynomialCommitmentScheme<E, Polynomial = Rc<DenseMultilinearExtension<E::Fr>>>,
PCS: PolynomialCommitmentScheme<E, Polynomial = Arc<DenseMultilinearExtension<E::Fr>>>,
{
type ProductCheckSubClaim = ProductCheckSubClaim<E::Fr, Self>;
type ProductCheckProof = ProductCheckProof<E, PCS, Self>;
@@ -257,12 +257,12 @@ mod test {
use ark_ec::PairingEngine;
use ark_poly::{DenseMultilinearExtension, MultilinearExtension};
use ark_std::test_rng;
use std::{marker::PhantomData, rc::Rc};
use std::{marker::PhantomData, sync::Arc};
fn check_frac_poly<E>(
frac_poly: &Rc<DenseMultilinearExtension<E::Fr>>,
fs: &[Rc<DenseMultilinearExtension<E::Fr>>],
gs: &[Rc<DenseMultilinearExtension<E::Fr>>],
frac_poly: &Arc<DenseMultilinearExtension<E::Fr>>,
fs: &[Arc<DenseMultilinearExtension<E::Fr>>],
gs: &[Arc<DenseMultilinearExtension<E::Fr>>],
) where
E: PairingEngine,
{
@@ -285,14 +285,14 @@ mod test {
// fs and gs are guaranteed to have the same product
// fs and hs doesn't have the same product
fn test_product_check_helper<E, PCS>(
fs: &[Rc<DenseMultilinearExtension<E::Fr>>],
gs: &[Rc<DenseMultilinearExtension<E::Fr>>],
hs: &[Rc<DenseMultilinearExtension<E::Fr>>],
fs: &[Arc<DenseMultilinearExtension<E::Fr>>],
gs: &[Arc<DenseMultilinearExtension<E::Fr>>],
hs: &[Arc<DenseMultilinearExtension<E::Fr>>],
pcs_param: &PCS::ProverParam,
) -> Result<(), PolyIOPErrors>
where
E: PairingEngine,
PCS: PolynomialCommitmentScheme<E, Polynomial = Rc<DenseMultilinearExtension<E::Fr>>>,
PCS: PolynomialCommitmentScheme<E, Polynomial = Arc<DenseMultilinearExtension<E::Fr>>>,
{
let mut transcript = <PolyIOP<E::Fr> as ProductCheck<E, PCS>>::init_transcript();
transcript.append_message(b"testing", b"initializing transcript for testing")?;
@@ -352,11 +352,11 @@ mod test {
let f2: DenseMultilinearExtension<Fr> = DenseMultilinearExtension::rand(nv, &mut rng);
let mut g2 = f2.clone();
g2.evaluations.reverse();
let fs = vec![Rc::new(f1), Rc::new(f2)];
let gs = vec![Rc::new(g2), Rc::new(g1)];
let fs = vec![Arc::new(f1), Arc::new(f2)];
let gs = vec![Arc::new(g2), Arc::new(g1)];
let mut hs = vec![];
for _ in 0..fs.len() {
hs.push(Rc::new(DenseMultilinearExtension::rand(
hs.push(Arc::new(DenseMultilinearExtension::rand(
fs[0].num_vars,
&mut rng,
)));

View File

@@ -5,7 +5,7 @@ use arithmetic::{get_index, VirtualPolynomial};
use ark_ff::PrimeField;
use ark_poly::DenseMultilinearExtension;
use ark_std::{end_timer, start_timer};
use std::rc::Rc;
use std::sync::Arc;
use transcript::IOPTranscript;
/// Compute multilinear fractional polynomial s.t. frac(x) = f1(x) * ... * fk(x)
@@ -14,9 +14,9 @@ use transcript::IOPTranscript;
/// The caller needs to sanity-check that the number of polynomials and
/// variables match in fxs and gxs; and gi(x) has no zero entries.
pub(super) fn compute_frac_poly<F: PrimeField>(
fxs: &[Rc<DenseMultilinearExtension<F>>],
gxs: &[Rc<DenseMultilinearExtension<F>>],
) -> Result<Rc<DenseMultilinearExtension<F>>, PolyIOPErrors> {
fxs: &[Arc<DenseMultilinearExtension<F>>],
gxs: &[Arc<DenseMultilinearExtension<F>>],
) -> Result<Arc<DenseMultilinearExtension<F>>, PolyIOPErrors> {
let start = start_timer!(|| "compute frac(x)");
let mut f_evals = vec![F::one(); 1 << fxs[0].num_vars];
@@ -41,7 +41,7 @@ pub(super) fn compute_frac_poly<F: PrimeField>(
}
end_timer!(start);
Ok(Rc::new(DenseMultilinearExtension::from_evaluations_vec(
Ok(Arc::new(DenseMultilinearExtension::from_evaluations_vec(
fxs[0].num_vars,
f_evals,
)))
@@ -55,8 +55,8 @@ pub(super) fn compute_frac_poly<F: PrimeField>(
/// The caller needs to check num_vars matches in f and g
/// Cost: linear in N.
pub(super) fn compute_product_poly<F: PrimeField>(
frac_poly: &Rc<DenseMultilinearExtension<F>>,
) -> Result<Rc<DenseMultilinearExtension<F>>, PolyIOPErrors> {
frac_poly: &Arc<DenseMultilinearExtension<F>>,
) -> Result<Arc<DenseMultilinearExtension<F>>, PolyIOPErrors> {
let start = start_timer!(|| "compute evaluations of prod polynomial");
let num_vars = frac_poly.num_vars;
let frac_evals = &frac_poly.evaluations;
@@ -96,7 +96,7 @@ pub(super) fn compute_product_poly<F: PrimeField>(
prod_x_evals.push(F::zero());
end_timer!(start);
Ok(Rc::new(DenseMultilinearExtension::from_evaluations_vec(
Ok(Arc::new(DenseMultilinearExtension::from_evaluations_vec(
num_vars,
prod_x_evals,
)))
@@ -111,10 +111,10 @@ pub(super) fn compute_product_poly<F: PrimeField>(
///
/// Cost: O(N)
pub(super) fn prove_zero_check<F: PrimeField>(
fxs: &[Rc<DenseMultilinearExtension<F>>],
gxs: &[Rc<DenseMultilinearExtension<F>>],
frac_poly: &Rc<DenseMultilinearExtension<F>>,
prod_x: &Rc<DenseMultilinearExtension<F>>,
fxs: &[Arc<DenseMultilinearExtension<F>>],
gxs: &[Arc<DenseMultilinearExtension<F>>],
frac_poly: &Arc<DenseMultilinearExtension<F>>,
prod_x: &Arc<DenseMultilinearExtension<F>>,
alpha: &F,
transcript: &mut IOPTranscript<F>,
) -> Result<(IOPProof<F>, VirtualPolynomial<F>), PolyIOPErrors> {
@@ -135,10 +135,10 @@ pub(super) fn prove_zero_check<F: PrimeField>(
p2_evals[x] = prod_x.evaluations[x1];
}
}
let p1 = Rc::new(DenseMultilinearExtension::from_evaluations_vec(
let p1 = Arc::new(DenseMultilinearExtension::from_evaluations_vec(
num_vars, p1_evals,
));
let p2 = Rc::new(DenseMultilinearExtension::from_evaluations_vec(
let p2 = Arc::new(DenseMultilinearExtension::from_evaluations_vec(
num_vars, p2_evals,
));

View File

@@ -9,7 +9,7 @@ use arithmetic::{VPAuxInfo, VirtualPolynomial};
use ark_ff::PrimeField;
use ark_poly::DenseMultilinearExtension;
use ark_std::{end_timer, start_timer};
use std::{fmt::Debug, rc::Rc};
use std::{fmt::Debug, sync::Arc};
use transcript::IOPTranscript;
mod prover;
@@ -127,7 +127,7 @@ impl<F: PrimeField> SumCheck<F> for PolyIOP<F> {
type SumCheckProof = IOPProof<F>;
type VirtualPolynomial = VirtualPolynomial<F>;
type VPAuxInfo = VPAuxInfo<F>;
type MultilinearExtension = Rc<DenseMultilinearExtension<F>>;
type MultilinearExtension = Arc<DenseMultilinearExtension<F>>;
type SumCheckSubClaim = SumCheckSubClaim<F>;
type Transcript = IOPTranscript<F>;
@@ -210,7 +210,7 @@ mod test {
use ark_ff::UniformRand;
use ark_poly::{DenseMultilinearExtension, MultilinearExtension};
use ark_std::test_rng;
use std::rc::Rc;
use std::sync::Arc;
fn test_sumcheck(
nv: usize,
@@ -326,7 +326,7 @@ mod test {
fn test_shared_reference() -> Result<(), PolyIOPErrors> {
let mut rng = test_rng();
let ml_extensions: Vec<_> = (0..5)
.map(|_| Rc::new(DenseMultilinearExtension::<Fr>::rand(8, &mut rng)))
.map(|_| Arc::new(DenseMultilinearExtension::<Fr>::rand(8, &mut rng)))
.collect();
let mut poly = VirtualPolynomial::new(8);
poly.add_mle_list(

View File

@@ -10,7 +10,7 @@ use ark_ff::PrimeField;
use ark_poly::DenseMultilinearExtension;
use ark_std::{end_timer, start_timer, vec::Vec};
use rayon::prelude::IntoParallelIterator;
use std::rc::Rc;
use std::sync::Arc;
#[cfg(feature = "parallel")]
use rayon::iter::{IntoParallelRefMutIterator, ParallelIterator};
@@ -138,7 +138,7 @@ impl<F: PrimeField> SumCheckProver<F> for IOPProverState<F> {
}
} else {
for (t, e) in products_sum.iter_mut().enumerate() {
let t = F::from(t as u64);
let t = F::from(t as u128);
let products = (0..1 << (self.poly.aux_info.num_variables - self.round))
.into_par_iter()
.map(|b| {
@@ -149,6 +149,9 @@ impl<F: PrimeField> SumCheckProver<F> for IOPProverState<F> {
let mut product = *coefficient;
for &f in products.iter().take(num_mles) {
let table = &flattened_ml_extensions[f]; // f's range is checked in init
// TODO: Could be done faster by cashing the results from the
// previous t and adding the diff
// Also possible to use Karatsuba multiplication
product *=
table[b << 1] + (table[(b << 1) + 1] - table[b << 1]) * t;
}
@@ -188,7 +191,7 @@ impl<F: PrimeField> SumCheckProver<F> for IOPProverState<F> {
// update prover's state to the partial evaluated polynomial
self.poly.flattened_ml_extensions = flattened_ml_extensions
.iter()
.map(|x| Rc::new(x.clone()))
.map(|x| Arc::new(x.clone()))
.collect();
// end_timer!(compute_sum);