83 size_t size_override = 0)
93 size_t domain_size = size_override == 0 ? full_polynomials.
get_polynomial_size() : size_override;
107 const size_t start = thread_data.start[thread_idx];
108 const size_t end = thread_data.end[thread_idx];
109 typename Flavor::AllValues row;
110 for (size_t i = start; i < end; ++i) {
112 if constexpr (IsUltraOrMegaHonk<Flavor>) {
113 row = full_polynomials.get_row_for_permutation_arg(i);
115 row = full_polynomials.get_row(i);
118 GrandProdRelation::template compute_grand_product_numerator<Accumulator>(row, relation_parameters);
120 GrandProdRelation::template compute_grand_product_denominator<Accumulator>(row, relation_parameters);
139 std::vector<FF> partial_numerators(thread_data.num_threads);
140 std::vector<FF> partial_denominators(thread_data.num_threads);
142 parallel_for(thread_data.num_threads, [&](
size_t thread_idx) {
143 const size_t start = thread_data.start[thread_idx];
144 const size_t end = thread_data.end[thread_idx];
145 for (size_t i = start; i < end - 1; ++i) {
146 numerator.at(i + 1) *= numerator[i];
147 denominator.at(i + 1) *= denominator[i];
149 partial_numerators[thread_idx] = numerator[end - 1];
150 partial_denominators[thread_idx] = denominator[end - 1];
156 parallel_for(thread_data.num_threads, [&](
size_t thread_idx) {
157 const size_t start = thread_data.start[thread_idx];
158 const size_t end = thread_data.end[thread_idx];
159 if (thread_idx > 0) {
160 FF numerator_scaling = 1;
161 FF denominator_scaling = 1;
163 for (size_t j = 0; j < thread_idx; ++j) {
164 numerator_scaling *= partial_numerators[j];
165 denominator_scaling *= partial_denominators[j];
167 for (size_t i = start; i < end; ++i) {
168 numerator.at(i) = numerator[i] * numerator_scaling;
169 denominator.at(i) = denominator[i] * denominator_scaling;
181 auto& grand_product_polynomial = GrandProdRelation::get_grand_product_polynomial(full_polynomials);
183 BB_ASSERT_EQ(grand_product_polynomial.start_index(), 1U);
185 parallel_for(thread_data.num_threads, [&](
size_t thread_idx) {
186 const size_t start = thread_data.start[thread_idx];
187 const size_t end = thread_data.end[thread_idx];
188 for (size_t i = start; i < end; ++i) {
189 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...