25template <
typename Builder>
45template <
typename Builder>
62 const auto [lo_v, hi_v] = decompose_into_lo_hi_u256(
value);
77template <
typename Builder>
81 const auto [lo_v, hi_v] = decompose_into_lo_hi_u256(value_u256);
128 constexpr uint64_t NUM_LIMB_BITS = BigScalarField::NUM_LIMB_BITS;
132 const auto [value_lo, value_hi] = decompose_into_lo_hi_u256(
value);
156 if (limb0_max > BigScalarField::DEFAULT_MAXIMUM_LIMB) {
160 const auto limb0_max_bits =
static_cast<size_t>(limb0_max.
get_msb() + 1);
161 auto [limb0_lo, limb0_hi] = limb0.
no_wrap_split_at(NUM_LIMB_BITS, limb0_max_bits);
166 uint256_t limb0_hi_max = limb0_max >> NUM_LIMB_BITS;
167 limb1_max += limb0_hi_max;
175 const size_t lo_bits_in_limb_1 = LO_BITS - NUM_LIMB_BITS;
176 const auto limb1_max_bits =
static_cast<size_t>(limb1_max.
get_msb() + 1);
177 auto [limb1_lo, limb1_hi] = limb1.
no_wrap_split_at(lo_bits_in_limb_1, limb1_max_bits);
184 _lo = limb0 + (limb1_lo * BigScalarField::shift_1);
189 _hi = limb1_hi.add_two(limb2 * limb_2_shift, limb3 * limb_3_shift);
195 validate_scalar_is_in_field();
200 return (_lo.is_constant() && _hi.is_constant());
#define BB_ASSERT_GT(left, right,...)
#define BB_ASSERT_LT(left, right,...)
constexpr uint64_t get_msb() const
uint512_t get_value() const
uint512_t get_maximum_value() const
bb::OriginTag get_origin_tag() const
bool is_constant() const
Check if the bigfield is constant, i.e. its prime limb is constant.
std::array< Limb, NUM_LIMBS > binary_basis_limbs
Represents a bigfield element in the binary basis. A bigfield element is represented as a combination...
void self_reduce() const
Reduce the bigfield element modulo the target modulus.
Represents a member of the Grumpkin curve scalar field (i.e. BN254 base field).
typename Curve::ScalarField ScalarField
ScalarField get_value() const
cycle_scalar(const field_t &lo, const field_t &hi, SkipValidation flag)
Private constructor that skips field validation (for internal use only)
static cycle_scalar from_witness(Builder *context, const ScalarField &value)
Construct a cycle scalar from a witness value in the Grumpkin scalar field.
void validate_scalar_is_in_field() const
Validates that the scalar (lo + hi * 2^LO_BITS) is less than the Grumpkin scalar field modulus.
OriginTag get_origin_tag() const
void set_free_witness_tag()
Set the free witness flag for the field element's tag.
std::pair< field_t< Builder >, field_t< Builder > > no_wrap_split_at(const size_t lsb_index, const size_t num_bits=grumpkin::MAX_NO_WRAP_INTEGER_BIT_LENGTH) const
Splits the field element into (lo, hi), where:
StrictMock< MockContext > context
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)