5#include "barretenberg/crypto/aes128/aes128.hpp"
6#include "barretenberg/numeric/bitop/pow.hpp"
7#include "barretenberg/numeric/bitop/rotate.hpp"
8#include "barretenberg/numeric/bitop/sparse_form.hpp"
11namespace sparse_tables {
13template <u
int64_t base, u
int64_t num_rotated_bits>
14inline std::array<barretenberg::fr, 2> get_sparse_table_with_rotation_values(
const std::array<uint64_t, 2> key)
16 const auto t0 = numeric::map_into_sparse_form<base>(key[0]);
18 if constexpr (num_rotated_bits > 0) {
19 t1 = numeric::map_into_sparse_form<base>(numeric::rotate32((uint32_t)key[0], num_rotated_bits));
26template <u
int64_t base, u
int64_t bits_per_slice, u
int64_t num_rotated_bits>
27inline BasicTable generate_sparse_table_with_rotation(BasicTableId
id,
const size_t table_index)
31 table.table_index = table_index;
32 table.size = (1U << bits_per_slice);
33 table.use_twin_keys =
false;
35 for (uint64_t i = 0; i < table.size; ++i) {
36 const uint64_t source = i;
37 const auto target = numeric::map_into_sparse_form<base>(source);
41 if constexpr (num_rotated_bits > 0) {
43 numeric::map_into_sparse_form<base>(numeric::rotate32((uint32_t)source, num_rotated_bits));
50 table.get_values_from_key = &get_sparse_table_with_rotation_values<base, num_rotated_bits>;
53 for (
size_t i = 0; i < bits_per_slice; ++i) {
54 sparse_step_size *= base;
63template <
size_t base, const u
int64_t* base_table>
64inline std::array<barretenberg::fr, 2> get_sparse_normalization_values(
const std::array<uint64_t, 2> key)
66 uint64_t accumulator = 0;
67 uint64_t input = key[0];
70 uint64_t slice = input % base;
71 uint64_t bit = base_table[
static_cast<size_t>(slice)];
72 accumulator += (bit << count);
80template <
size_t base, u
int64_t num_bits, const u
int64_t* base_table>
81inline BasicTable generate_sparse_normalization_table(BasicTableId
id,
const size_t table_index)
91 table.table_index = table_index;
92 table.use_twin_keys =
false;
93 table.size = numeric::pow64(
static_cast<uint64_t
>(base), num_bits);
97 for (
size_t i = 0; i < table.size; ++i) {
98 const auto& limbs = accumulator.get_limbs();
100 for (
size_t j = 0; j < num_bits; ++j) {
101 const size_t table_idx =
static_cast<size_t>(limbs[j]);
102 key += ((base_table[table_idx]) <<
static_cast<uint64_t
>(j));
105 table.column_1.emplace_back(accumulator.get_sparse_value());
106 table.column_2.emplace_back(key);
108 accumulator += to_add;
111 table.get_values_from_key = &get_sparse_normalization_values<base, base_table>;
Definition: sparse_form.hpp:99
Definition: uint256.hpp:25