8#include <unordered_set>
18 const size_t n =
size_t{ 1 } << d;
21 const size_t E = std::min(n, ((extent % 2) == 0) ? extent : extent + 1);
22 const size_t target = std::min(2 * d, n);
24 std::unordered_set<size_t> seen;
25 std::vector<size_t> support;
27 const auto add = [&](
size_t i) {
28 if (i < n && seen.insert(i).second) {
40 for (
size_t level = 1; level < d; ++level) {
41 const size_t base = n >> level;
45 for (
size_t i = E - 1; support.size() <
target; --i) {
61 const size_t length = *std::ranges::max_element(support) + 1;
63 for (
size_t s : support) {
78 return build_sparse_masking_poly<FF>(d, extent, dyadic_size);
#define BB_ASSERT_GT(left, right,...)
#define BB_ASSERT_EQ(actual, expected,...)
#define BB_ASSERT_LTE(left, right,...)
static Polynomial random(size_t size, size_t start_index=0)
Fr & at(size_t index)
Our mutable accessor, unlike operator[]. We abuse precedent a bit to differentiate at() and operator[...
Entry point for Barretenberg command-line interface.
Polynomial< FF > build_gemini_masking_poly(size_t d, size_t extent, size_t dyadic_size)
constexpr size_t SPARSE_MASKING_MIN_LOG_N
std::vector< size_t > tail_halving_support(size_t d, size_t extent)
Polynomial< FF > build_sparse_masking_poly(size_t d, size_t extent, size_t dyadic_size)
std::vector< Instruction > target
static field random_element(numeric::RNG *engine=nullptr) noexcept