2#include "barretenberg/common/throw_or_abort.hpp"
8#include "../uint256/uint256.hpp"
12inline std::vector<uint64_t> slice_input(
const uint256_t& input,
const uint64_t base,
const size_t num_slices)
15 std::vector<uint64_t> slices;
17 for (
size_t i = 0; i < num_slices; ++i) {
18 slices.push_back((target % base).data[0]);
23 slices.push_back((target % base).data[0]);
30inline std::vector<uint64_t> slice_input_using_variable_bases(
const uint256_t& input,
31 const std::vector<uint64_t>& bases)
34 std::vector<uint64_t> slices;
35 for (
size_t i = 0; i < bases.size(); ++i) {
36 if (target >= bases[i] && i == bases.size() - 1) {
37 throw_or_abort(format(
"Last key slice greater than ", bases[i]));
39 slices.push_back((target % bases[i]).data[0]);
45template <u
int64_t base, u
int64_t num_slices>
constexpr std::array<uint256_t, num_slices> get_base_powers()
47 std::array<uint256_t, num_slices> output{};
49 for (
size_t i = 1; i < num_slices; ++i) {
50 output[i] = output[i - 1] * base;
55template <u
int64_t base>
constexpr uint256_t map_into_sparse_form(
const uint64_t input)
58 auto converted = input;
60 constexpr auto base_powers = get_base_powers<base, 32>();
61 for (
size_t i = 0; i < 32; ++i) {
62 uint64_t sparse_bit = ((converted >> i) & 1U);
64 out += base_powers[i];
70template <u
int64_t base>
constexpr uint64_t map_from_sparse_form(
const uint256_t& input)
75 constexpr auto bases = get_base_powers<base, 32>();
77 for (uint64_t i = 0; i < 32; ++i) {
78 const auto& base_power = bases[
static_cast<size_t>(31 - i)];
80 for (uint64_t j = 1; j < base + 1; ++j) {
81 const auto threshold = prev_threshold + base_power;
82 if (target < threshold) {
83 bool bit = ((j - 1) & 1);
85 output += (1ULL << (31ULL - i));
88 target -= (prev_threshold);
92 prev_threshold = threshold;
99template <u
int64_t base,
size_t num_bits>
class sparse_int {
104 for (
size_t i = 0; i < num_bits; ++i) {
105 const uint64_t bit = (input >> i) & 1U;
118 for (
size_t i = 0; i < num_bits - 1; ++i) {
119 result.limbs[i] += other.limbs[i];
120 if (result.limbs[i] >= base) {
121 result.limbs[i] -= base;
122 ++result.limbs[i + 1];
125 result.limbs[num_bits - 1] += other.limbs[num_bits - 1];
126 result.limbs[num_bits - 1] %= base;
127 result.value += other.value;
133 *
this = *
this + other;
137 [[nodiscard]] uint64_t get_value()
const {
return value; }
139 [[nodiscard]] uint64_t get_sparse_value()
const
142 for (
size_t i = num_bits - 1; i < num_bits; --i) {
149 const std::array<uint64_t, num_bits>& get_limbs()
const {
return limbs; }
152 std::array<uint64_t, num_bits> limbs;
154 uint64_t sparse_value;
Definition: sparse_form.hpp:99
Definition: uint256.hpp:25
Definition: field2_declarations.hpp:6