84 size_t size_override = 0)
94 size_t domain_size = size_override == 0 ? full_polynomials.
get_polynomial_size() : size_override;
108 const size_t start = thread_data.start[thread_idx];
109 const size_t end = thread_data.end[thread_idx];
110 typename Flavor::AllValues row;
111 for (size_t i = start; i < end; ++i) {
113 if constexpr (IsUltraOrMegaHonk<Flavor>) {
114 row = full_polynomials.get_row_for_permutation_arg(i);
116 row = full_polynomials.get_row(i);
119 GrandProdRelation::template compute_grand_product_numerator<Accumulator>(row, relation_parameters);
121 GrandProdRelation::template compute_grand_product_denominator<Accumulator>(row, relation_parameters);
140 std::vector<FF> partial_numerators(thread_data.num_threads);
141 std::vector<FF> partial_denominators(thread_data.num_threads);
143 parallel_for(thread_data.num_threads, [&](
size_t thread_idx) {
144 const size_t start = thread_data.start[thread_idx];
145 const size_t end = thread_data.end[thread_idx];
146 for (size_t i = start; i < end - 1; ++i) {
147 numerator.at(i + 1) *= numerator[i];
148 denominator.at(i + 1) *= denominator[i];
150 partial_numerators[thread_idx] = numerator[end - 1];
151 partial_denominators[thread_idx] = denominator[end - 1];
157 parallel_for(thread_data.num_threads, [&](
size_t thread_idx) {
158 const size_t start = thread_data.start[thread_idx];
159 const size_t end = thread_data.end[thread_idx];
160 if (thread_idx > 0) {
161 FF numerator_scaling = 1;
162 FF denominator_scaling = 1;
164 for (size_t j = 0; j < thread_idx; ++j) {
165 numerator_scaling *= partial_numerators[j];
166 denominator_scaling *= partial_denominators[j];
168 for (size_t i = start; i < end; ++i) {
169 numerator.at(i) = numerator[i] * numerator_scaling;
170 denominator.at(i) = denominator[i] * denominator_scaling;
182 auto& grand_product_polynomial = GrandProdRelation::get_grand_product_polynomial(full_polynomials);
184 BB_ASSERT(grand_product_polynomial.is_shiftable());
186 parallel_for(thread_data.num_threads, [&](
size_t thread_idx) {
187 const size_t start = thread_data.start[thread_idx];
188 const size_t end = thread_data.end[thread_idx];
189 for (size_t i = start; i < end; ++i) {
190 grand_product_polynomial.at(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...