13template <
typename Builder>
19 const size_t hi_bits =
static_cast<size_t>(field_modulus.
get_msb()) + 1 - lo_bits;
48template <
typename Builder>
51 const bool skip_range_constraints)
54 static constexpr size_t max_bits = native::modulus.get_msb() + 1;
64 if (
field.is_constant()) {
78 lo.set_origin_tag(
field.get_origin_tag());
79 hi.set_origin_tag(
field.get_origin_tag());
87 if (!skip_range_constraints) {
88 lo.create_range_constraint(lo_bits);
90 const size_t hi_bits = 254 - lo_bits;
91 hi.create_range_constraint(hi_bits);
99 if (!
field.is_constant()) {
101 field.get_context()->update_used_witnesses(
field.witness_index);
114 const size_t lo_bits,
118 const size_t lo_bits,
#define BB_ASSERT(expression,...)
constexpr uint256_t slice(uint64_t start, uint64_t end) const
constexpr uint64_t get_msb() const
static field_t from_witness_index(Builder *ctx, uint32_t witness_index)
void create_range_constraint(size_t num_bits, std::string const &msg="field_t::range_constraint") const
Let x = *this.normalize(), constrain x.v < 2^{num_bits}.
Builder * get_context() const
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)
static void evaluate_linear_identity(const field_t &a, const field_t &b, const field_t &c, const field_t &d, const std::string &msg="field_t::evaluate_linear_identity")
Constrain a + b + c + d to be equal to 0.
void set_origin_tag(const OriginTag &new_tag) const
uint32_t get_witness_index() const
Get the witness index of the current field element.
std::pair< field_t< Builder >, field_t< Builder > > split_unique(const field_t< Builder > &field, const size_t lo_bits, const bool skip_range_constraints)
Split a bn254 scalar field element into unique lo and hi limbs.
void validate_split_in_field_unsafe(const field_t< Builder > &lo, const field_t< Builder > &hi, const size_t lo_bits, const uint256_t &field_modulus)
Validates that lo + hi * 2^lo_bits < field_modulus (assuming range constraints on lo and hi)
void mark_witness_as_used(const field_t< Builder > &field)
Mark a field_t witness as used (for UltraBuilder only).
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept