3#include "./transition_widget.hpp"
65template <
class Field,
class Getters,
typename PolyContainer>
class EllipticKernel {
67 static constexpr size_t num_independent_relations = 4;
69 static constexpr uint8_t quotient_required_challenges = CHALLENGE_BIT_ALPHA;
71 static constexpr uint8_t update_required_challenges = CHALLENGE_BIT_ALPHA;
77 inline static std::set<PolynomialIndex>
const& get_required_polynomial_ids()
79 static const std::set<PolynomialIndex> required_polynomial_ids = {
80 PolynomialIndex::Q_1, PolynomialIndex::Q_3, PolynomialIndex::Q_4,
81 PolynomialIndex::Q_M, PolynomialIndex::Q_ELLIPTIC, PolynomialIndex::W_1,
82 PolynomialIndex::W_2, PolynomialIndex::W_3, PolynomialIndex::W_4
84 return required_polynomial_ids;
101 Getters::template get_value<EvaluationType::NON_SHIFTED, PolynomialIndex::W_2>(polynomials, i);
103 Getters::template get_value<EvaluationType::NON_SHIFTED, PolynomialIndex::W_3>(polynomials, i);
104 const Field& x_2 = Getters::template get_value<EvaluationType::SHIFTED, PolynomialIndex::W_1>(polynomials, i);
105 const Field& y_2 = Getters::template get_value<EvaluationType::SHIFTED, PolynomialIndex::W_4>(polynomials, i);
106 const Field& x_3 = Getters::template get_value<EvaluationType::SHIFTED, PolynomialIndex::W_2>(polynomials, i);
107 const Field& y_3 = Getters::template get_value<EvaluationType::SHIFTED, PolynomialIndex::W_3>(polynomials, i);
108 const Field& q_elliptic =
109 Getters::template get_value<EvaluationType::NON_SHIFTED, PolynomialIndex::Q_ELLIPTIC>(polynomials, i);
112 const Field& q_sign =
113 Getters::template get_value<EvaluationType::NON_SHIFTED, PolynomialIndex::Q_1>(polynomials, i);
117 const Field& q_is_double =
118 Getters::template get_value<EvaluationType::NON_SHIFTED, PolynomialIndex::Q_M>(polynomials, i);
120 Field x_diff = x_2 - x_1;
121 Field y1_sqr = y_1.sqr();
122 Field y2_sqr = y_2.sqr();
123 Field y1y2 = y_1 * y_2 * q_sign;
124 Field x_identity_add = (x_3 + x_2 + x_1) * x_diff.sqr() - y1_sqr - y2_sqr + y1y2 + y1y2;
125 Field y_identity_add = (y_3 + y_1) * x_diff + (x_3 - x_1) * (y_2 * q_sign - y_1);
132 const Field x_pow_4 = (y_1 * y_1 - grumpkin::g1::curve_b) * x_1;
133 Field x_identity_double = (x_3 + x_1 + x_1) * (y_1 + y_1) * (y_1 + y_1) - x_pow_4 * Field(9);
136 const Field x_pow_2 = (x_1 * x_1);
137 Field y_identity_double = x_pow_2 * (x_1 - x_3) * 3 - (y_1 + y_1) * (y_1 + y_3);
140 (q_is_double * (x_identity_double - x_identity_add) + x_identity_add) * challenges.alpha_powers[0];
142 (q_is_double * (y_identity_double - y_identity_add) + y_identity_add) * challenges.alpha_powers[1];
143 Field identity = x_identity + y_identity;
145 quotient += identity * q_elliptic;
151template <
typename Settings>
152using ProverEllipticWidget = widget::TransitionWidget<barretenberg::fr, Settings, widget::EllipticKernel>;
154template <
typename Field,
typename Group,
typename Transcript,
typename Settings>
155using VerifierEllipticWidget = widget::GenericVerifierWidget<Field, Transcript, Settings, widget::EllipticKernel>;
Definition: widget.bench.cpp:13