26template <
typename Builder>
28 const Element& base_point,
const Element& offset_generator,
size_t table_bits)
30 const size_t table_size = 1UL << table_bits;
31 std::vector<Element> hints;
32 hints.emplace_back(offset_generator);
33 for (
size_t i = 1; i < table_size; ++i) {
34 hints.emplace_back(hints[i - 1] + base_point);
50template <
typename Builder>
57 , tag(
OriginTag(base_point.get_origin_tag(), offset_generator.get_origin_tag()))
59 const size_t table_size = 1UL << table_bits;
61 point_table.resize(table_size);
82 if (!hints_available) {
85 BB_ASSERT_LT(i, hints.value().size(),
"Invalid hint index");
95 for (
size_t i = 1; i < table_size; ++i) {
96 point_table[i] = point_table[i - 1].unconditional_add(modded_base_point, get_hint(i - 1));
101 field_t coordinate_check_product = 1;
102 point_table[0] = offset_generator;
103 for (
size_t i = 1; i < table_size; ++i) {
104 const field_t x_diff = point_table[i - 1].x - modded_base_point.
x;
105 coordinate_check_product *= x_diff;
106 point_table[i] = point_table[i - 1].unconditional_add(modded_base_point, get_hint(i - 1));
108 coordinate_check_product.
assert_is_not_zero(
"straus_lookup_table x-coordinate collision");
113 for (
size_t i = 1; i < table_size; ++i) {
121 for (
size_t i = 0; i < table_size; ++i) {
123 if (point_table[i].is_constant()) {
124 const auto element = point_table[i].get_value();
127 std::array<uint32_t, 2> coordinate_indices = { point_table[i].x.get_witness_index(),
128 point_table[i].y.get_witness_index() };
129 context->set_ROM_element_pair(
rom_id, i, coordinate_indices);
150 auto [x_idx, y_idx] = _context->read_ROM_array_pair(rom_id, index.
get_witness_index());
#define BB_ASSERT_LT(left, right,...)
cycle_group represents a group Element of the proving system's embedded curve, i.e....
static cycle_group from_constant_witness(Builder *_context, const AffineElement &_in)
Converts a native AffineElement into a witness, but constrains the witness values to be known constan...
static cycle_group conditional_assign(const bool_t &predicate, const cycle_group &lhs, const cycle_group &rhs)
bool_t is_point_at_infinity() const
AffineElement get_value() const
void assert_equal(const field_t &rhs, std::string const &msg="field_t::assert_equal") const
Copy constraint: constrain that *this field is equal to rhs element.
static field_t from_witness_index(Builder *ctx, uint32_t witness_index)
static field_t conditional_assign(const bool_t< Builder > &predicate, const field_t &lhs, const field_t &rhs)
If predicate == true then return lhs, else return rhs.
OriginTag get_origin_tag() const
bb::fr get_value() const
Given a := *this, compute its value given by a.v * a.mul + a.add.
static field_t from_witness(Builder *ctx, const bb::fr &input)
void set_origin_tag(const OriginTag &new_tag) const
void assert_is_not_zero(std::string const &msg="field_t::assert_is_not_zero") const
Constrain *this to be non-zero by establishing that it has an inverse.
uint32_t get_witness_index() const
Get the witness index of the current field element.
straus_lookup_table computes a lookup table of size 1 << table_bits
typename Curve::Element Element
straus_lookup_table()=default
static std::vector< Element > compute_native_table(const Element &base_point, const Element &offset_generator, size_t table_bits)
Compute the output points generated when computing the Straus lookup table.
cycle_group< Builder > read(const field_t &index)
Given an _index witness, return straus_lookup_table[index]
StrictMock< MockContext > context
std::conditional_t< IsGoblinBigGroup< C, Fq, Fr, G >, element_goblin::goblin_element< C, goblin_field< C >, Fr, G >, element_default::element< C, Fq, Fr, G > > element
element wraps either element_default::element or element_goblin::goblin_element depending on parametr...
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept