67 "ProverEqPolynomial::construct: challenges.size() must be >= log_num_monomials");
70 if (log_num_monomials == 0) {
102 for (
auto u_i : challenge) {
122 std::vector<FF> denominators;
123 denominators.reserve(challenges.size());
124 result.reserve(challenges.size());
125 for (
const auto& challenge : challenges) {
126 denominators.push_back((
FF(1) - challenge));
131 for (
const auto& [denom_inverted, challenge] :
zip_view(denominators, challenges)) {
132 result.push_back(denom_inverted * challenge);
163 const size_t d = r.
size();
164 BB_ASSERT_EQ(d, log_num_monomials,
"expect log_num_monomials == r.size()");
165 const size_t N = 1UL << d;
169 std::vector<FF> eq_linear_coeffs(d);
170 std::vector<FF> eq_constant_coeffs(d);
171 for (
size_t i = 0; i < d; ++i) {
172 eq_linear_coeffs[i] = r[i] + r[i] -
FF(1);
173 eq_constant_coeffs[i] =
FF(1) - r[i];
179 current.
at(0) =
FF(1);
182 for (
size_t var_idx = 0; var_idx < d; ++var_idx) {
183 const FF a_i = eq_linear_coeffs[var_idx];
184 const FF b_i = eq_constant_coeffs.at(var_idx);
186 const size_t prev_size = current.
size();
187 const size_t next_size = prev_size << 1;
195 const FF* src = current.
data();
198 for (
size_t j = 0; j < prev_size; ++j) {
201 dst[j + prev_size] = v * (b_i + a_i);
237 for (
size_t i = 0; i <
r.size(); ++i) {
238 a[i] =
r[i] +
r[i] -
FF(1);
246 BB_ASSERT_EQ(u.size(),
r.size(),
"expect u.size() == r.size()");
248 for (
size_t i = 0; i < u.size(); ++i) {
250 acc *= (
b[i] + u[i] *
a[i]);
258 BB_ASSERT_EQ(r_in.size(), u.size(),
"expect r_in.size() == u.size()");
260 for (
size_t i = 0; i < r_in.size(); ++i) {
261 const FF ai = r_in[i] + r_in[i] -
FF(1);
262 const FF bi =
FF(1) - r_in[i];
263 acc *= (bi + u[i] * ai);
#define BB_ASSERT_GTE(left, right,...)
#define BB_ASSERT_EQ(actual, expected,...)
bb::field< bb::Bn254FrParams > FF
Fr & at(size_t index)
Our mutable accessor, unlike operator[]. We abuse precedent a bit to differentiate at() and operator[...
Prover-side eq(X, r) polynomial over Boolean hypercube.
static FF compute_scaling_factor(std::span< const FF > challenge)
Compute the scaling factor C = ∏_i (1 - r_i) for coordinate transformation.
static std::vector< FF > transform_challenge(std::span< const FF > challenges)
Transform challenges r_i to γ_i = r_i / (1 - r_i) for optimal method.
static Polynomial< FF > construct(std::span< const FF > challenges, size_t log_num_monomials)
Construct eq(X, r) coefficient table over Boolean hypercube {0,1}^d.
static Polynomial< FF > construct_eq_with_edge_cases(std::span< const FF > r, size_t log_num_monomials)
Fallback method: direct construction of eq(X, r) coefficient table for edge cases.
Entry point for Barretenberg command-line interface.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
bb::VectorAffineElementPushSpan< BaseParams > out
static BB_PROFILE Polynomial< FF > compute_beta_products(const std::vector< FF > &betas, const size_t log_num_monomials, const FF &scaling_factor=FF(1))
Given compute for .
Verifier-side polynomial for division-free evaluation of eq(r, u).
void initialize(const std::vector< FF > &r_in)
FF evaluate(std::span< const FF > u) const
VerifierEqPolynomial(const std::vector< FF > &r_in)
static FF eval(std::span< const FF > r_in, std::span< const FF > u)
BB_INLINE constexpr bool is_zero() const noexcept
static void batch_invert(C &coeffs) noexcept
Batch invert a collection of field elements using Montgomery's trick.