barretenberg
Loading...
Searching...
No Matches
arithmetic_widget.hpp
1#pragma once
2
3#include "./transition_widget.hpp"
4
5namespace proof_system::plonk {
6namespace widget {
7
20template <class Field, class Getters, typename PolyContainer> class ArithmeticKernel {
21 public:
22 static constexpr size_t num_independent_relations = 1;
23 // We state the challenges required for linear/nonlinear terms computation
24 static constexpr uint8_t quotient_required_challenges = CHALLENGE_BIT_ALPHA;
25 // We state the challenges required for updating kate opening scalars
26 static constexpr uint8_t update_required_challenges = CHALLENGE_BIT_ALPHA;
27
28 private:
29 // A structure with various challenges, even though only alpha is used here.
31
32 public:
33 inline static std::set<PolynomialIndex> const& get_required_polynomial_ids()
34 {
35 static const std::set<PolynomialIndex> required_polynomial_ids = { PolynomialIndex::Q_1, PolynomialIndex::Q_2,
36 PolynomialIndex::Q_3, PolynomialIndex::Q_M,
37 PolynomialIndex::Q_C, PolynomialIndex::W_1,
38 PolynomialIndex::W_2, PolynomialIndex::W_3 };
39 return required_polynomial_ids;
40 }
41
52 inline static void accumulate_contribution(PolyContainer& polynomials,
53 const challenge_array& challenges,
54 Field& quotient,
55 const size_t i = 0)
56 {
57 const Field& w_1 =
58 Getters::template get_value<EvaluationType::NON_SHIFTED, PolynomialIndex::W_1>(polynomials, i);
59 const Field& w_2 =
60 Getters::template get_value<EvaluationType::NON_SHIFTED, PolynomialIndex::W_2>(polynomials, i);
61 const Field& w_3 =
62 Getters::template get_value<EvaluationType::NON_SHIFTED, PolynomialIndex::W_3>(polynomials, i);
63
64 const Field& alpha = challenges.alpha_powers[0];
65 const Field& q_1 =
66 Getters::template get_value<EvaluationType::NON_SHIFTED, PolynomialIndex::Q_1>(polynomials, i);
67 const Field& q_2 =
68 Getters::template get_value<EvaluationType::NON_SHIFTED, PolynomialIndex::Q_2>(polynomials, i);
69 const Field& q_3 =
70 Getters::template get_value<EvaluationType::NON_SHIFTED, PolynomialIndex::Q_3>(polynomials, i);
71 const Field& q_m =
72 Getters::template get_value<EvaluationType::NON_SHIFTED, PolynomialIndex::Q_M>(polynomials, i);
73 const Field& q_c =
74 Getters::template get_value<EvaluationType::NON_SHIFTED, PolynomialIndex::Q_C>(polynomials, i);
75
76 Field result = (w_1 * w_2) * q_m;
77 result += w_1 * q_1;
78 result += w_2 * q_2;
79 result += w_3 * q_3;
80 result += q_c;
81 result *= alpha;
82 quotient += result;
83 }
84};
85
86} // namespace widget
87
95template <typename Settings>
97
105template <typename Field, typename Group, typename Transcript, typename Settings>
107
108} // namespace proof_system::plonk
Core class implementing the arithmetic gate in Standard plonk.
Definition: arithmetic_widget.hpp:20
static void accumulate_contribution(PolyContainer &polynomials, const challenge_array &challenges, Field &quotient, const size_t i=0)
Computes the linear terms.
Definition: arithmetic_widget.hpp:52
Definition: transition_widget.hpp:341
Definition: transition_widget.hpp:282
Definition: widget.bench.cpp:13