3#include "barretenberg/common/constexpr_utils.hpp"
4#include "barretenberg/numeric/bitop/pow.hpp"
5#include "barretenberg/numeric/bitop/sparse_form.hpp"
7#include "../sparse.hpp"
11namespace keccak_tables {
20 static constexpr uint64_t BASE = 11;
25 static constexpr uint64_t EFFECTIVE_BASE = 2;
26 static constexpr size_t TABLE_BITS = 8;
28 static constexpr uint64_t OUTPUT_NORMALIZATION_TABLE[2]{ 0, 1 };
38 std::array<uint64_t, TABLE_BITS> result;
40 for (
size_t i = 0; i < TABLE_BITS; ++i) {
64 for (
size_t i = 0; i < TABLE_BITS; ++i) {
65 if (counts[i] == EFFECTIVE_BASE - 1) {
74 uint64_t normalized_value = 0;
75 for (
size_t i = 0; i < TABLE_BITS; ++i) {
76 value += counts[i] * scaled_bases[i];
77 normalized_value += (OUTPUT_NORMALIZATION_TABLE[counts[i]]) << i;
79 return { value, normalized_value };
93 table.table_index = table_index;
94 table.use_twin_keys =
false;
95 table.size = numeric::pow64(
static_cast<uint64_t
>(EFFECTIVE_BASE), TABLE_BITS);
97 std::array<size_t, TABLE_BITS> counts{};
98 std::array<uint64_t, 2> column_values{ 0, 0 };
100 for (
size_t i = 0; i < table.size; ++i) {
101 table.column_1.emplace_back(column_values[0]);
102 table.column_2.emplace_back(column_values[1]);
103 table.column_3.emplace_back(0);
107 table.get_values_from_key = &sparse_tables::get_sparse_normalization_values<BASE, OUTPUT_NORMALIZATION_TABLE>;
109 table.column_1_step_size =
barretenberg::fr(numeric::pow64(
static_cast<size_t>(BASE), TABLE_BITS));
111 table.column_3_step_size = 0;
157 constexpr size_t num_tables_per_multitable =
158 64 / TABLE_BITS + (64 % TABLE_BITS == 0 ? 0 : 1);
160 uint64_t column_multiplier = numeric::pow64(BASE, TABLE_BITS);
161 MultiTable table(column_multiplier, (1ULL << TABLE_BITS), 0, num_tables_per_multitable);
164 for (
size_t i = 0; i < num_tables_per_multitable; ++i) {
165 table.slice_sizes.emplace_back(numeric::pow64(BASE, TABLE_BITS));
166 table.lookup_ids.emplace_back(KECCAK_OUTPUT);
167 table.get_table_values.emplace_back(
168 &sparse_tables::get_sparse_normalization_values<BASE, OUTPUT_NORMALIZATION_TABLE>);
Converts a base-11 sparse integer representation into a regular base-2 binary integer....
Definition: keccak_output.hpp:17
static MultiTable get_keccak_output_table(const MultiTableId id=KECCAK_FORMAT_OUTPUT)
Create the KeccakOutput MultiTable used by plookup to generate a sequence of lookups.
Definition: keccak_output.hpp:155
static constexpr std::array< uint64_t, TABLE_BITS > get_scaled_bases()
Precompute an array of base multipliers (11^i for i = [0, ..., TABLE_BITS - 1]) Code is slightly fast...
Definition: keccak_output.hpp:36
static std::array< uint64_t, 2 > get_column_values_for_next_row(std::array< size_t, TABLE_BITS > &counts)
Get column values for next row of plookup table. Used to generate plookup table row values.
Definition: keccak_output.hpp:60
static BasicTable generate_keccak_output_table(BasicTableId id, const size_t table_index)
Generate plookup table that maps a TABLE_BITS-slice of a base-11 integer into a base-2 integer.
Definition: keccak_output.hpp:89
The structure contains the most basic table serving one function (for, example an xor table)
Definition: types.hpp:263
Definition: types.hpp:124