2#include "barretenberg/numeric/bitop/get_msb.hpp"
3#include "barretenberg/polynomials/iterate_over_domain.hpp"
4#include "barretenberg/polynomials/polynomial.hpp"
7template <
typename program_settings>
9 const std::vector<uint32_t>& permutation,
12 if (output.size() < permutation.size()) {
13 throw_or_abort(
"Permutation polynomial size is insufficient to store permutations.");
21 const barretenberg::fr* roots = small_domain.get_round_roots()[small_domain.log2_size - 2];
22 const size_t root_size = small_domain.size >> 1UL;
23 const size_t log2_root_size =
static_cast<size_t>(numeric::get_msb(root_size));
25 ITERATE_OVER_DOMAIN_START(small_domain);
35 const size_t raw_idx =
static_cast<size_t>(permutation[i] & ~program_settings::permutation_mask);
39 const bool negative_idx = raw_idx >= root_size;
45 const size_t idx = raw_idx - (
static_cast<size_t>(negative_idx) << log2_root_size);
51 output[i] = roots[idx].conditionally_subtract_from_double_modulus(
static_cast<uint64_t
>(negative_idx));
59 const uint32_t column_index =
60 ((permutation[i] & program_settings::permutation_mask) >> program_settings::permutation_shift);
61 if (column_index > 0) {
62 output[i] *= barretenberg::fr::coset_generator(column_index - 1);
64 ITERATE_OVER_DOMAIN_END;
Definition: widget.bench.cpp:13