83 size_t size_override = 0)
93 size_t domain_size = size_override == 0 ? full_polynomials.
get_polynomial_size() : size_override;
98 const size_t active_size = domain_size - gp_start;
112 BB_BENCH_TRACY_NAME(
"GrandProduct::step1_numerator_denominator");
113 const size_t start = thread_data.start[thread_idx];
114 const size_t end = thread_data.end[thread_idx];
115 typename Flavor::AllValues row;
116 for (size_t i = start; i < end; ++i) {
117 const size_t poly_idx = i + gp_start;
119 if constexpr (IsUltraOrMegaHonk<Flavor>) {
120 row = full_polynomials.get_row_for_permutation_arg(poly_idx);
122 row = full_polynomials.get_row(poly_idx);
125 GrandProdRelation::template compute_grand_product_numerator<Accumulator>(row, relation_parameters);
127 GrandProdRelation::template compute_grand_product_denominator<Accumulator>(row, relation_parameters);
146 std::vector<FF> partial_numerators(thread_data.num_threads);
147 std::vector<FF> partial_denominators(thread_data.num_threads);
149 parallel_for(thread_data.num_threads, [&](
size_t thread_idx) {
150 BB_BENCH_TRACY_NAME(
"GrandProduct::step2a_subproducts");
151 const size_t start = thread_data.start[thread_idx];
152 const size_t end = thread_data.end[thread_idx];
153 for (size_t i = start; i < end - 1; ++i) {
154 numerator.at(i + 1) *= numerator[i];
155 denominator.at(i + 1) *= denominator[i];
157 partial_numerators[thread_idx] = numerator[end - 1];
158 partial_denominators[thread_idx] = denominator[end - 1];
164 parallel_for(thread_data.num_threads, [&](
size_t thread_idx) {
165 BB_BENCH_TRACY_NAME(
"GrandProduct::step2b_scale_and_invert");
166 const size_t start = thread_data.start[thread_idx];
167 const size_t end = thread_data.end[thread_idx];
168 if (thread_idx > 0) {
169 FF numerator_scaling = 1;
170 FF denominator_scaling = 1;
172 for (size_t j = 0; j < thread_idx; ++j) {
173 numerator_scaling *= partial_numerators[j];
174 denominator_scaling *= partial_denominators[j];
176 for (size_t i = start; i < end; ++i) {
177 numerator.at(i) = numerator[i] * numerator_scaling;
178 denominator.at(i) = denominator[i] * denominator_scaling;
190 auto& grand_product_polynomial = GrandProdRelation::get_grand_product_polynomial(full_polynomials);
192 BB_ASSERT(grand_product_polynomial.is_shiftable());
201 parallel_for(thread_data.num_threads, [&](
size_t thread_idx) {
202 BB_BENCH_TRACY_NAME(
"GrandProduct::step3_quotient");
203 const size_t start = thread_data.start[thread_idx];
204 const size_t end = thread_data.end[thread_idx];
205 for (size_t i = start; i < end; ++i) {
206 grand_product_polynomial.at(gp_start + i + 1) = numerator[i] * denominator[i];
void compute_grand_products(typename Flavor::ProverPolynomials &full_polynomials, bb::RelationParameters< typename Flavor::FF > &relation_parameters, const size_t size_override=0)
Compute the grand product corresponding to each grand-product relation defined in the Flavor.
void compute_grand_product(typename Flavor::ProverPolynomials &full_polynomials, bb::RelationParameters< typename Flavor::FF > &relation_parameters, size_t size_override=0)
Compute a grand product polynomial, grand_product_polynomial, which for historical reasons is sometim...