3#include "barretenberg/plonk/proof_system/verification_key/verification_key.hpp"
8template <
typename Field,
typename Transcript,
typename program_settings>
9Field compute_kate_batch_evaluation(
typename Transcript::Key* key,
const Transcript& transcript)
26 const auto separator_challenge = transcript.get_challenge_field_element(
"separator", 0);
27 const auto& polynomial_manifest = key->polynomial_manifest;
28 for (
size_t i = 0; i < key->polynomial_manifest.size(); ++i) {
29 const auto& item = polynomial_manifest[i];
31 const std::string poly_label(item.polynomial_label);
33 bool has_shifted_evaluation = item.requires_shifted_evaluation;
35 const auto nu_challenge = transcript.get_challenge_field_element_from_map(
"nu", poly_label);
36 const auto poly_at_zeta = transcript.get_field_element(poly_label);
37 batch_eval += nu_challenge * poly_at_zeta;
39 if (has_shifted_evaluation) {
40 const auto nu_challenge = transcript.get_challenge_field_element_from_map(
"nu", poly_label +
"_omega");
41 const auto poly_at_zeta_omega = transcript.get_field_element(poly_label +
"_omega");
42 batch_eval += separator_challenge * nu_challenge * poly_at_zeta_omega;
46 const auto quotient_eval = transcript.get_field_element(
"t");
47 const auto quotient_challenge = transcript.get_challenge_field_element_from_map(
"nu",
"t");
49 batch_eval += (quotient_eval * quotient_challenge);
53template <
typename Field,
typename Group,
typename Transcript,
typename program_settings>
54void populate_kate_element_map(verification_key* key,
55 const Transcript& transcript,
56 std::map<std::string, Group>& kate_g1_elements,
57 std::map<std::string, Field>& kate_fr_elements)
59 const auto separator_challenge = transcript.get_challenge_field_element(
"separator", 0);
61 const auto& polynomial_manifest = key->polynomial_manifest;
62 for (
size_t i = 0; i < key->polynomial_manifest.size(); ++i) {
63 const auto& item = polynomial_manifest[i];
64 const std::string label(item.commitment_label);
65 const std::string poly_label(item.polynomial_label);
66 switch (item.source) {
67 case PolynomialSource::WITNESS: {
68 const auto element = transcript.get_group_element(label);
69 kate_g1_elements.insert({ label, element });
72 case PolynomialSource::SELECTOR:
73 case PolynomialSource::PERMUTATION: {
74 const auto element = key->commitments.at(label);
75 kate_g1_elements.insert({ label, element });
78 case PolynomialSource::OTHER: {
82 Field kate_fr_scalar(0);
83 if (item.requires_shifted_evaluation) {
84 const auto challenge = transcript.get_challenge_field_element_from_map(
"nu", poly_label +
"_omega");
85 kate_fr_scalar += (separator_challenge * challenge);
88 const auto challenge = transcript.get_challenge_field_element_from_map(
"nu", poly_label);
89 kate_fr_scalar += challenge;
91 kate_fr_elements.insert({ label, kate_fr_scalar });
94 const auto zeta = transcript.get_challenge_field_element(
"z", 0);
95 const auto quotient_nu = transcript.get_challenge_field_element_from_map(
"nu",
"t");
97 Field z_pow_n = zeta.pow(key->circuit_size);
99 for (
size_t i = 0; i < program_settings::program_width; ++i) {
100 std::string quotient_label =
"T_" + std::to_string(i + 1);
101 const auto element = transcript.get_group_element(quotient_label);
103 kate_g1_elements.insert({ quotient_label, element });
104 kate_fr_elements.insert({ quotient_label, quotient_nu * z_power });
Definition: widget.bench.cpp:13