From 5e06c014c80d1558d28e355258c43a8204e06075 Mon Sep 17 00:00:00 2001 From: wborgeaud Date: Wed, 5 May 2021 18:32:24 +0200 Subject: [PATCH] Cleaning --- src/polynomial/commitment.rs | 44 ++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/src/polynomial/commitment.rs b/src/polynomial/commitment.rs index 990826b2..33efe509 100644 --- a/src/polynomial/commitment.rs +++ b/src/polynomial/commitment.rs @@ -73,35 +73,21 @@ impl ListPolynomialCommitment { challenger.observe_hash(&self.merkle_tree.root); let alpha = challenger.get_challenge(); + // Scale polynomials by `alpha`. let scaled_poly = self .polynomials .iter() .rev() .map(|p| p.clone().into()) .fold(Polynomial::empty(), |acc, p| acc.scalar_mul(alpha).add(&p)); + // Scale evaluations by `alpha`. let scaled_evals = evaluations .iter() .map(|e| reduce_with_powers(e, alpha)) .collect::>(); - let pairs = points - .iter() - .zip(&scaled_evals) - .map(|(&x, &e)| (x, e)) - .collect::>(); - debug_assert!(pairs.iter().all(|&(x, e)| scaled_poly.eval(x) == e)); + let quotient = Self::compute_quotient(points, &scaled_evals, &scaled_poly); - let interpolant: Polynomial = interpolant(&pairs).into(); - let denominator = points - .iter() - .fold(Polynomial::from(vec![F::ONE]), |acc, &x| { - acc.mul(&vec![-x, F::ONE].into()) - }); - let numerator = scaled_poly.add(&interpolant.neg()); - let (mut quotient, rem) = numerator.polynomial_division(&denominator); - debug_assert!(rem.is_zero()); - - quotient.pad((quotient.degree() + 1).next_power_of_two()); let lde_quotient = PolynomialCoeffs::from(quotient.clone()).lde(self.fri_config.rate_bits); let lde_quotient_values = lde_quotient .clone() @@ -122,6 +108,30 @@ impl ListPolynomialCommitment { quotient_degree: quotient.len(), } } + + /// Given `points=(x_i)`, `evals=(y_i)` and `poly=P` with `P(x_i)=y_i`, computes the polynomial + /// `Q=(P-I)/Z` where `I` interpolates `(x_i, y_i)` and `Z` is the vanishing polynomial on `(x_i)`. + fn compute_quotient(points: &[F], evals: &[F], poly: &Polynomial) -> Polynomial { + let pairs = points + .iter() + .zip(evals) + .map(|(&x, &e)| (x, e)) + .collect::>(); + debug_assert!(pairs.iter().all(|&(x, e)| poly.eval(x) == e)); + + let interpolant: Polynomial = interpolant(&pairs).into(); + let denominator = points + .iter() + .fold(Polynomial::from(vec![F::ONE]), |acc, &x| { + acc.mul(&vec![-x, F::ONE].into()) + }); + let numerator = poly.add(&interpolant.neg()); + let (mut quotient, rem) = numerator.polynomial_division(&denominator); + debug_assert!(rem.is_zero()); + + quotient.pad((quotient.degree() + 1).next_power_of_two()); + quotient + } } pub struct OpeningProof {