2#include "barretenberg/common/slab_allocator.hpp"
3#include "barretenberg/common/throw_or_abort.hpp"
4#include "barretenberg/numeric/bitop/get_msb.hpp"
5#include "barretenberg/polynomials/iterate_over_domain.hpp"
6#include "barretenberg/polynomials/polynomial.hpp"
11 uint32_t subgroup_index = 0;
12 uint8_t column_index = 0;
13 bool is_public_input =
false;
21template <
typename program_settings>
23 const std::vector<uint32_t>& permutation,
26 std::vector<permutation_subgroup_element> subgroup_elements;
27 for (
const auto& permutation_element : permutation) {
28 uint32_t index = permutation_element & (uint32_t)0xffffffU;
29 uint32_t column = permutation_element >> 30U;
32 compute_permutation_lagrange_base_single<program_settings>(output, subgroup_elements, small_domain);
44template <
typename program_settings>
46 const std::vector<permutation_subgroup_element>& permutation,
49 if (output.size() < permutation.size()) {
50 throw_or_abort(
"Permutation polynomial size is insufficient to store permutations.");
58 ASSERT(small_domain.log2_size > 1);
59 const barretenberg::fr* roots = small_domain.get_round_roots()[small_domain.log2_size - 2];
60 const size_t root_size = small_domain.size >> 1UL;
61 const size_t log2_root_size =
static_cast<size_t>(numeric::get_msb(root_size));
63 ITERATE_OVER_DOMAIN_START(small_domain);
71 size_t raw_idx = permutation[i].subgroup_index;
75 const bool negative_idx = raw_idx >= root_size;
81 const size_t idx = raw_idx - (
static_cast<size_t>(negative_idx) << log2_root_size);
87 output[i] = roots[idx].conditionally_subtract_from_double_modulus(
static_cast<uint64_t
>(negative_idx));
94 if (permutation[i].is_public_input) {
98 output[i] *= barretenberg::fr::external_coset_generator();
99 }
else if (permutation[i].is_tag) {
100 output[i] *= barretenberg::fr::tag_coset_generator();
103 const uint32_t column_index = permutation[i].column_index;
104 if (column_index > 0) {
105 output[i] *= barretenberg::fr::coset_generator(column_index - 1);
109 ITERATE_OVER_DOMAIN_END;
Definition: widget.bench.cpp:13
void compute_permutation_lagrange_base_single(barretenberg::polynomial &output, const std::vector< uint32_t > &permutation, const barretenberg::evaluation_domain &small_domain)
Definition: permutation.hpp:22
Definition: permutation.hpp:10