18template <u
int64_t base, u
int64_t num_rotated_bits>
21 const auto t0 = numeric::map_into_sparse_form<base>(
key[0]);
23 if constexpr (num_rotated_bits > 0) {
31template <u
int64_t base, u
int64_t bits_per_slice, u
int64_t num_rotated_bits>
37 auto table_size = (1U << bits_per_slice);
40 for (uint64_t i = 0; i < table_size; ++i) {
41 const uint64_t source = i;
42 const auto target = numeric::map_into_sparse_form<base>(source);
46 if constexpr (num_rotated_bits > 0) {
48 numeric::map_into_sparse_form<base>(
numeric::rotate32((uint32_t)source, num_rotated_bits));
58 for (
size_t i = 0; i < bits_per_slice; ++i) {
59 sparse_step_size *= base;
68template <
size_t base, const u
int64_t* base_table>
71 uint64_t accumulator = 0;
72 uint64_t input =
key[0];
75 uint64_t
slice = input % base;
76 uint64_t bit = base_table[
static_cast<size_t>(
slice)];
77 accumulator += (bit << count);
85template <
size_t base, u
int64_t num_bits, const u
int64_t* base_table>
98 auto table_size =
numeric::pow64(
static_cast<uint64_t
>(base), num_bits);
102 for (
size_t i = 0; i < table_size; ++i) {
103 const auto& limbs = accumulator.
get_limbs();
105 for (
size_t j = 0; j < num_bits; ++j) {
106 const size_t table_idx =
static_cast<size_t>(limbs[j]);
107 key += ((base_table[table_idx]) <<
static_cast<uint64_t
>(j));
113 accumulator += to_add;
uint64_t get_sparse_value() const
const std::array< uint64_t, num_bits > & get_limbs() const
constexpr uint64_t pow64(const uint64_t input, const uint64_t exponent)
constexpr uint32_t rotate32(const uint32_t value, const uint32_t rotation)
BasicTable generate_sparse_table_with_rotation(BasicTableId id, const size_t table_index)
std::array< bb::fr, 2 > get_sparse_table_with_rotation_values(const std::array< uint64_t, 2 > key)
std::array< bb::fr, 2 > get_sparse_normalization_values(const std::array< uint64_t, 2 > key)
BasicTable generate_sparse_normalization_table(BasicTableId id, const size_t table_index)
field< Bn254FrParams > fr
C slice(C const &container, size_t start)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
A basic table from which we can perform lookups (for example, an xor table)
bb::fr column_2_step_size
bb::fr column_1_step_size
std::vector< bb::fr > column_3
std::vector< bb::fr > column_2
std::array< bb::fr, 2 >(* get_values_from_key)(const std::array< uint64_t, 2 >)
std::vector< bb::fr > column_1
bb::fr column_3_step_size