25 const std::vector<FF>& degree_check_challenges,
26 const size_t max_size)
31 reversed_columns.reserve(flattened_columns.size());
32 for (
const auto& poly : flattened_columns) {
33 reversed_columns.emplace_back(poly.reverse());
37 std::vector<FF> scalars;
38 reversed_column_spans.reserve(flattened_columns.size());
39 scalars.reserve(flattened_columns.size());
40 for (
size_t idx = 0; idx < flattened_columns.size(); ++idx) {
41 reversed_column_spans.emplace_back(reversed_columns[idx]);
42 scalars.push_back(degree_check_challenges[idx]);
49 return reversed_batched_poly;
62 size_t N = subtable_cols.size();
63 BB_ASSERT_LTE(N, M,
"BatchMergeProver: more subtables than max_subtables");
65 std::vector<size_t> shift_sizes(N);
66 size_t max_shift_size = 0;
67 for (
size_t i = 0; i < N; ++i) {
68 shift_sizes[i] = subtable_cols[i][0].size();
69 max_shift_size =
std::max(max_shift_size, shift_sizes[i]);
75 for (
size_t idx = 0; idx < N; ++idx) {
76 for (
size_t col = 0; col <
NUM_WIRES; ++col) {
85 for (
size_t idx = N; idx < M; ++idx) {
86 for (
size_t col = 0; col <
NUM_WIRES; ++col) {
97 for (
size_t col = 0; col <
NUM_WIRES; ++col) {
100 max_shift_size =
std::max(max_shift_size, zk_columns[0].size());
107 for (
size_t col = 0; col <
NUM_WIRES; ++col) {
108 flattened_cols.push_back(
std::move(zk_columns[col]));
110 for (
auto& subtable_col : subtable_cols) {
111 for (
size_t col = 0; col <
NUM_WIRES; col++) {
112 flattened_cols.push_back(
std::move(subtable_col[col]));
119 transcript->send_to_verifier(
"NUM_SUBTABLES",
static_cast<uint32_t
>(N));
120 for (
size_t i = 0; i < M; ++i) {
122 static_cast<uint32_t
>(i < N ? shift_sizes[i] : 0));
129 for (
size_t col = 0; col <
NUM_WIRES; ++col) {
137 const FF degree_check_challenge =
transcript->template get_challenge<FF>(
"DEGREE_CHECK_CHALLENGE");
138 const size_t num_degree_check_challenges = (M + 1) *
NUM_WIRES;
139 std::vector<FF> degree_check_challenges = {
FF(1), degree_check_challenge };
140 for (
size_t idx = 2; idx < num_degree_check_challenges; idx++) {
141 degree_check_challenges.push_back(degree_check_challenges.back() * degree_check_challenge);
154 const FF kappa =
transcript->template get_challenge<FF>(
"KAPPA");
155 const FF kappa_inv = kappa.
invert();
161 std::vector<FF> evals;
164 for (
size_t col = 0; col < num_flattened_col_evals; ++col) {
165 evals.push_back(col < num_actual_flattened_cols ? flattened_cols[col].evaluate(kappa) :
FF(0));
170 for (
size_t col = 0; col <
NUM_WIRES; ++col) {
171 evals.push_back(merged_table[col].evaluate(kappa));
176 evals.push_back(degree_check_poly.
evaluate(kappa_inv));
177 transcript->send_to_verifier(
"DEGREE_CHECK_EVAL", evals.back());
186 const size_t num_opening_claims = ((M + 2) *
NUM_WIRES) + 1;
188 opening_claims.reserve(num_opening_claims);
189 for (
size_t idx = 0; idx < num_flattened_col_evals; ++idx) {
190 if (idx >= num_actual_flattened_cols || flattened_cols[idx].size() == 0) {
192 opening_claims.push_back({
Polynomial(1), { kappa,
FF(0) } });
194 opening_claims.push_back({
std::move(flattened_cols[idx]), { kappa, evals[idx] } });
197 for (
size_t idx = 0; idx <
NUM_WIRES; ++idx) {
198 opening_claims.push_back({
std::move(merged_table[idx]), { kappa, evals[((M + 1) *
NUM_WIRES) + idx] } });
200 opening_claims.push_back({
std::move(degree_check_poly), { kappa_inv, evals.back() } });
static void compute_opening_proof(const CK &ck, const ProverOpeningClaim< Curve > &opening_claim, const std::shared_ptr< Transcript > &prover_trancript)
Computes the KZG commitment to an opening proof polynomial at a single evaluation point.
static ProverOpeningClaim< Curve > prove(const CommitmentKey< Curve > &commitment_key, std::span< ProverOpeningClaim< Curve > > opening_claims, const std::shared_ptr< Transcript > &transcript, std::span< ProverOpeningClaim< Curve > > libra_opening_claims={}, std::span< ProverOpeningClaim< Curve > > sumcheck_round_claims={}, const size_t virtual_log_n=0)
Returns a batched opening claim equivalent to a set of opening claims consisting of polynomials,...
void add_scaled_batch(Polynomial< Fr > &dst, std::span< const PolynomialSpan< const Fr > > sources, std::span< const Fr > scalars)
Fused parallel batched add: dst += sum_i scalars[i] * sources[i].