62 "ProverEqPolynomial::construct: challenges.size() must be >= log_num_monomials");
65 if (log_num_monomials == 0) {
97 for (
auto u_i : challenge) {
116 std::vector<FF> result;
117 std::vector<FF> denominators;
118 for (
const auto& challenge : challenges) {
119 denominators.push_back((
FF(1) - challenge));
124 for (
const auto& [denom_inverted, challenge] :
zip_view(denominators, challenges)) {
125 result.push_back(denom_inverted * challenge);
156 const size_t d = r.
size();
157 BB_ASSERT_EQ(d, log_num_monomials,
"expect log_num_monomials == r.size()");
158 const size_t N = 1UL << d;
162 std::vector<FF> eq_linear_coeffs(d);
163 std::vector<FF> eq_constant_coeffs(d);
164 for (
size_t i = 0; i < d; ++i) {
165 eq_linear_coeffs[i] = r[i] + r[i] -
FF(1);
166 eq_constant_coeffs[i] =
FF(1) - r[i];
172 current.
at(0) =
FF(1);
175 for (
size_t var_idx = 0; var_idx < d; ++var_idx) {
176 const FF a_i = eq_linear_coeffs[var_idx];
177 const FF b_i = eq_constant_coeffs.at(var_idx);
179 const size_t prev_size = current.
size();
180 const size_t next_size = prev_size << 1;
188 const FF* src = current.
data();
191 for (
size_t j = 0; j < prev_size; ++j) {
194 dst[j + prev_size] = v * (b_i + a_i);
230 for (
size_t i = 0; i <
r.size(); ++i) {
231 a[i] =
r[i] +
r[i] -
FF(1);
239 BB_ASSERT_EQ(u.size(),
r.size(),
"expect u.size() == r.size()");
241 for (
size_t i = 0; i < u.size(); ++i) {
243 acc *= (
b[i] + u[i] *
a[i]);
251 BB_ASSERT_EQ(r_in.size(), u.size(),
"expect r_in.size() == u.size()");
253 for (
size_t i = 0; i < r_in.size(); ++i) {
254 const FF ai = r_in[i] + r_in[i] -
FF(1);
255 const FF bi =
FF(1) - r_in[i];
256 acc *= (bi + u[i] * ai);
#define BB_ASSERT_GTE(left, right,...)
#define BB_ASSERT_EQ(actual, expected,...)
bb::field< bb::Bn254FrParams > FF
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[...
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
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.