31template <
typename Flavor>
34 : interpolation_domain{}
35 , concatenated_polynomial(MASKED_CONCATENATED_WITNESS_LENGTH)
36 , concatenated_lagrange_form(SUBGROUP_SIZE)
37 , challenge_polynomial(SUBGROUP_SIZE)
38 , challenge_polynomial_lagrange(SUBGROUP_SIZE)
39 , grand_sum_polynomial_unmasked(SUBGROUP_SIZE)
40 , grand_sum_polynomial(MASKED_GRAND_SUM_LENGTH)
41 , grand_sum_identity_polynomial(GRAND_SUM_IDENTITY_LENGTH)
42 , grand_sum_identity_quotient(QUOTIENT_LENGTH)
43 , transcript(transcript)
60template <
typename Flavor>
62 const std::vector<FF>& multivariate_challenge,
63 const FF claimed_inner_product,
94template <
typename Flavor>
96 const FF evaluation_challenge_x,
97 const FF batching_challenge_v,
156 compute_grand_sum_polynomial();
159 transcript->send_to_verifier(label_prefix +
"grand_sum_commitment", commitment_key.commit(grand_sum_polynomial));
162 compute_grand_sum_identity_polynomial();
165 compute_grand_sum_identity_quotient();
168 transcript->send_to_verifier(label_prefix +
"quotient_commitment",
169 commitment_key.commit(grand_sum_identity_quotient));
196template <
typename Flavor>
199 std::vector<FF> coeffs_lagrange_basis =
200 compute_challenge_polynomial_coeffs<typename Flavor::Curve>(multivariate_challenge);
202 challenge_polynomial_lagrange =
Polynomial<FF>(coeffs_lagrange_basis);
205 challenge_polynomial =
206 compute_monomial_coefficients(coeffs_lagrange_basis, interpolation_domain, bn_evaluation_domain);
217template <
typename Flavor>
219 const FF batching_challenge_v)
222 std::vector<FF> coeffs_lagrange_basis = compute_eccvm_challenge_coeffs<typename Flavor::Curve>(
223 evaluation_challenge_x, batching_challenge_v, NUM_TRANSLATION_EVALUATIONS, NUM_DISABLED_ROWS_IN_SUMCHECK);
225 challenge_polynomial_lagrange =
Polynomial<FF>(coeffs_lagrange_basis);
228 challenge_polynomial =
Polynomial<FF>(interpolation_domain, coeffs_lagrange_basis, SUBGROUP_SIZE);
249 grand_sum_lagrange_coeffs[0] = 0;
252 for (
size_t idx = 1; idx < SUBGROUP_SIZE; idx++) {
253 size_t prev_idx = idx - 1;
254 grand_sum_lagrange_coeffs[idx] =
255 grand_sum_lagrange_coeffs[prev_idx] +
256 challenge_polynomial_lagrange.at(prev_idx) * concatenated_lagrange_form.at(prev_idx);
260 grand_sum_polynomial_unmasked =
261 compute_monomial_coefficients(grand_sum_lagrange_coeffs, interpolation_domain, bn_evaluation_domain);
266 grand_sum_polynomial += grand_sum_polynomial_unmasked;
270 for (
size_t idx = 0; idx < GRAND_SUM_MASKING_TERM_LENGTH; idx++) {
271 grand_sum_polynomial.at(idx) -= masking_term.value_at(idx);
272 grand_sum_polynomial.at(idx + SUBGROUP_SIZE) += masking_term.value_at(idx);
286 for (
size_t idx = 0; idx < MASKED_GRAND_SUM_LENGTH; idx++) {
287 shifted_grand_sum.
at(idx) = grand_sum_polynomial.at(idx) * interpolation_domain[idx % SUBGROUP_SIZE];
290 const auto& [lagrange_first, lagrange_last] =
291 compute_lagrange_first_and_last(interpolation_domain, bn_evaluation_domain);
294 for (
size_t i = 0; i < MASKED_CONCATENATED_WITNESS_LENGTH; ++i) {
295 for (
size_t j = 0; j < SUBGROUP_SIZE; ++j) {
296 grand_sum_identity_polynomial.at(i + j) -= concatenated_polynomial.at(i) * challenge_polynomial.at(j);
301 for (
size_t idx = 0; idx < MASKED_GRAND_SUM_LENGTH; idx++) {
302 grand_sum_identity_polynomial.at(idx) += shifted_grand_sum.
at(idx) - grand_sum_polynomial.at(idx);
307 for (
size_t idx = GRAND_SUM_IDENTITY_LENGTH - 1; idx > 0; idx--) {
308 grand_sum_identity_polynomial.at(idx) = grand_sum_identity_polynomial.at(idx - 1);
310 grand_sum_identity_polynomial.at(0) =
FF(0);
312 for (
size_t idx = 0; idx < GRAND_SUM_IDENTITY_LENGTH - 1; idx++) {
313 grand_sum_identity_polynomial.at(idx) -=
314 grand_sum_identity_polynomial.at(idx + 1) * interpolation_domain[SUBGROUP_SIZE - 1];
318 for (
size_t i = 0; i < MASKED_GRAND_SUM_LENGTH; ++i) {
319 for (
size_t j = 0; j < SUBGROUP_SIZE; ++j) {
320 grand_sum_identity_polynomial.at(i + j) +=
321 grand_sum_polynomial.at(i) * (lagrange_first.at(j) + lagrange_last.at(j));
325 for (
size_t idx = 0; idx < SUBGROUP_SIZE; idx++) {
326 grand_sum_identity_polynomial.at(idx) -= lagrange_last.at(idx) * claimed_inner_product;
336template <
typename Flavor>
338 Flavor>::compute_lagrange_first_and_last(
const std::array<FF, SUBGROUP_SIZE>& interpolation_domain,
342 std::array<FF, SUBGROUP_SIZE> lagrange_coeffs;
343 lagrange_coeffs[0] =
FF(1);
344 for (
size_t idx = 1; idx < SUBGROUP_SIZE; idx++) {
345 lagrange_coeffs[idx] =
FF(0);
349 compute_monomial_coefficients(lagrange_coeffs, interpolation_domain, bn_evaluation_domain);
352 lagrange_coeffs[0] =
FF(0);
353 lagrange_coeffs[SUBGROUP_SIZE - 1] =
FF(1);
356 compute_monomial_coefficients(lagrange_coeffs, interpolation_domain, bn_evaluation_domain);
358 return { lagrange_first_monomial, lagrange_last_monomial };
367 auto remainder = grand_sum_identity_polynomial;
368 for (
size_t idx = GRAND_SUM_IDENTITY_LENGTH - 1; idx >= SUBGROUP_SIZE; idx--) {
369 grand_sum_identity_quotient.
at(idx - SUBGROUP_SIZE) = remainder.at(idx);
370 remainder.at(idx - SUBGROUP_SIZE) += remainder.at(idx);
382template <
typename Flavor>
385 const std::vector<FF>& multivariate_challenge,
386 const size_t& log_circuit_size)
390 FF claimed_inner_product =
FF{ 0 };
393 claimed_inner_product += univariate.evaluate(multivariate_challenge[idx]);
397 claimed_inner_product *= libra_challenge_inv /
FF(1 << (log_circuit_size - 1));
399 return claimed_inner_product;
410template <
typename Flavor>
414 FF claimed_inner_product{ 0 };
416 for (
size_t idx = 0; idx < SUBGROUP_SIZE; idx++) {
417 claimed_inner_product +=
421 return claimed_inner_product;
430template <
typename Flavor>
433 const std::array<FF, SUBGROUP_SIZE>& interpolation_domain,
436 using FF =
typename Flavor::Curve::ScalarField;
438 return Polynomial<FF>(interpolation_domain, lagrange_coeffs, SUBGROUP_SIZE);
440 std::vector<FF> lagrange_last_ifft(SUBGROUP_SIZE);
441 polynomial_arithmetic::ifft<FF>(lagrange_coeffs.data(), lagrange_last_ifft.data(), bn_evaluation_domain);
454#ifdef STARKNET_GARAGA_FLAVORS
bb::field< bb::Bn254FrParams > FF
CommitmentKey object over a pairing group 𝔾₁.
bb::CommitmentKey< Curve > CommitmentKey
Structured polynomial class that represents the coefficients 'a' of a_0 + a_1 x .....
Fr & at(size_t index)
Our mutable accessor, unlike operator[]. We abuse precedent a bit to differentiate at() and operator[...
A Curve-agnostic ZK protocol to prove inner products of small vectors.
std::shared_ptr< typename Flavor::Transcript > transcript
void compute_eccvm_challenge_polynomial(const FF evaluation_challenge_x, const FF batching_challenge_v)
Compute a (public) challenge polynomial from the evaluation and batching challenges.
typename Curve::ScalarField FF
void compute_challenge_polynomial(const std::vector< FF > &multivariate_challenge)
Computes the challenge polynomial F(X) based on the provided multivariate challenges.
Polynomial< FF > concatenated_polynomial
static Polynomial< FF > compute_monomial_coefficients(std::span< FF > lagrange_coeffs, const std::array< FF, SUBGROUP_SIZE > &interpolation_domain, const EvaluationDomain< FF > &bn_evaluation_domain)
Given a vector of coefficients of a polynomial in the Lagrange basis over , compute its coefficients ...
std::array< FF, SUBGROUP_SIZE > interpolation_domain
void compute_grand_sum_polynomial()
Computes the grand sum polynomial .
static constexpr size_t MASKED_GRAND_SUM_LENGTH
void compute_grand_sum_identity_quotient()
Efficiently compute the quotient of the grand sum identity polynomial by .
static FF compute_claimed_inner_product(ZKSumcheckData< Flavor > &zk_sumcheck_data, const std::vector< FF > &multivariate_challenge, const size_t &log_circuit_size)
For test purposes: Compute the sum of the Libra constant term and Libra univariates evaluated at Sumc...
void compute_grand_sum_identity_polynomial()
Compute , where is the fixed generator of .
Polynomial< FF > concatenated_lagrange_form
SmallSubgroupIPAProver(const std::shared_ptr< typename Flavor::Transcript > &transcript, typename Flavor::CommitmentKey commitment_key)
Flavor::CommitmentKey commitment_key
EvaluationDomain< FF > bn_evaluation_domain
void prove()
Compute the derived witnesses and and commit to them.
FF compute_claimed_translation_inner_product(TranslationData< typename Flavor::Transcript > &translation_data)
For test purposes: compute the batched evaluation of the last NUM_DISABLED_ROWS_IN_SUMCHECK rows of t...
A class designed to accept the ECCVM Transcript Polynomials, concatenate their masking terms in Lagra...
Polynomial concatenated_polynomial_lagrange
Polynomial masked_concatenated_polynomial
std::array< FF, SUBGROUP_SIZE > interpolation_domain
static Univariate get_random()
Entry point for Barretenberg command-line interface.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
This structure is created to contain various polynomials and constants required by ZK Sumcheck.
Polynomial< FF > libra_concatenated_monomial_form
std::vector< Polynomial< FF > > libra_univariates
Polynomial< FF > libra_concatenated_lagrange_form
EvaluationDomain< FF > bn_evaluation_domain
std::array< FF, SUBGROUP_SIZE > interpolation_domain