diff --git a/barretenberg/cpp/src/barretenberg/flavor/prover_polynomials.hpp b/barretenberg/cpp/src/barretenberg/flavor/prover_polynomials.hpp index 959b0e99469e..6af015c231b3 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/prover_polynomials.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/prover_polynomials.hpp @@ -31,7 +31,7 @@ class ProverPolynomialsBase : public AllEntitiesBase { ProverPolynomialsBase(ProverPolynomialsBase&& o) noexcept = default; ProverPolynomialsBase& operator=(ProverPolynomialsBase&& o) noexcept = default; ~ProverPolynomialsBase() = default; - [[nodiscard]] size_t get_polynomial_size() const { return this->q_c.size(); } + [[nodiscard]] size_t get_polynomial_size() const { return this->q_c.virtual_size(); } [[nodiscard]] AllValuesType get_row(size_t row_idx) const { AllValuesType result; diff --git a/barretenberg/cpp/src/barretenberg/hypernova/hypernova_prover.cpp b/barretenberg/cpp/src/barretenberg/hypernova/hypernova_prover.cpp index 89d8552e9605..a0ab9bd02309 100644 --- a/barretenberg/cpp/src/barretenberg/hypernova/hypernova_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/hypernova/hypernova_prover.cpp @@ -81,6 +81,24 @@ Polynomial HypernovaFoldingProver::batch_polynomials BB_ASSERT_EQ( challenges.size(), N, "The number of challenges provided does not match the number of polynomials to batch."); + // Ensure the first polynomial has enough backing to accumulate all others (they may have different backing sizes + // and/or start indices). add_scaled requires destination start_index <= source start_index. + size_t min_start = polynomials_to_batch[0].start_index(); + size_t max_end = polynomials_to_batch[0].end_index(); + for (size_t idx = 1; idx < N; idx++) { + min_start = std::min(min_start, polynomials_to_batch[idx].start_index()); + max_end = std::max(max_end, polynomials_to_batch[idx].end_index()); + } + + if (min_start < polynomials_to_batch[0].start_index() || max_end > polynomials_to_batch[0].end_index()) { + Polynomial result(max_end - min_start, full_batched_size, min_start); + result += polynomials_to_batch[0]; + for (size_t idx = 1; idx < N; idx++) { + result.add_scaled(polynomials_to_batch[idx], challenges[idx]); + } + return result; + } + for (size_t idx = 1; idx < N; idx++) { polynomials_to_batch[0].add_scaled(polynomials_to_batch[idx], challenges[idx]); } diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/prover_instance.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/prover_instance.cpp index 24e922ad6807..bdbefac3fac6 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/prover_instance.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/prover_instance.cpp @@ -176,9 +176,9 @@ template void ProverInstance_::allocate_selectors(cons selector = Polynomial(block.size(), dyadic_size(), block.trace_offset()); } - // Set the other non-gate selector polynomials (e.g. q_l, q_r, q_m etc.) to full size + // Set the other non-gate selector polynomials (e.g. q_l, q_r, q_m etc.) to active trace size for (auto& selector : polynomials.get_non_gate_selectors()) { - selector = Polynomial(dyadic_size()); + selector = Polynomial(trace_active_range_size(), dyadic_size()); } }