13template <
typename Builder>
19 const size_t hi_bits =
static_cast<size_t>(field_modulus.
get_msb()) + 1 - lo_bits;
46template <
typename Builder>
49 const bool skip_range_constraints)
52 static constexpr size_t max_bits = native::modulus.get_msb() + 1;
53 ASSERT(lo_bits < max_bits);
62 if (
field.is_constant()) {
76 lo.set_origin_tag(
field.get_origin_tag());
77 hi.set_origin_tag(
field.get_origin_tag());
83 if (!skip_range_constraints) {
84 lo.create_range_constraint(lo_bits);
86 const size_t hi_bits = 254 - lo_bits;
87 hi.create_range_constraint(hi_bits);
102 const size_t lo_bits,
106 const size_t lo_bits,
#define 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(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.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
General class for prime fields see Prime field documentation["field documentation"] for general imple...