15template <
typename Builder>
30 const auto [lo_v, hi_v] = decompose_into_lo_hi_u256(
value);
44template <
typename Builder>
48 const auto [lo_v, hi_v] = decompose_into_lo_hi_u256(value_u256);
67template <
typename Builder>
70 const size_t num_bits = 256;
76 lo, hi, num_bits,
true,
false
98 lo, hi, NUM_BITS,
true,
true
137 constexpr uint64_t NUM_LIMB_BITS = BigScalarField::NUM_LIMB_BITS;
141 const auto [value_lo, value_hi] = decompose_into_lo_hi_u256(
value);
165 if (limb0_max > BigScalarField::DEFAULT_MAXIMUM_LIMB) {
169 const auto limb0_max_bits =
static_cast<size_t>(limb0_max.
get_msb() + 1);
170 auto [limb0_lo, limb0_hi] = limb0.
no_wrap_split_at(NUM_LIMB_BITS, limb0_max_bits);
175 uint256_t limb0_hi_max = limb0_max >> NUM_LIMB_BITS;
176 limb1_max += limb0_hi_max;
184 const size_t lo_bits_in_limb_1 = LO_BITS - NUM_LIMB_BITS;
185 const auto limb1_max_bits =
static_cast<size_t>(limb1_max.
get_msb() + 1);
186 auto [limb1_lo, limb1_hi] = limb1.
no_wrap_split_at(lo_bits_in_limb_1, limb1_max_bits);
193 lo = limb0 + (limb1_lo * BigScalarField::shift_1);
198 hi = limb1_hi.add_two(limb2 * limb_2_shift, limb3 * limb_3_shift);
207 return (lo.is_constant() && hi.is_constant());
221 if (!_skip_primality_test) {
#define BB_ASSERT_GT(left, right,...)
#define BB_ASSERT_LT(left, right,...)
constexpr uint256_t slice(uint64_t start, uint64_t end) const
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...
Represents a member of the Grumpkin curve scalar field (i.e. BN254 base field).
typename Curve::ScalarField ScalarField
static cycle_scalar from_u256_witness(Builder *context, const uint256_t &bitstring)
Construct a cycle scalar from a uint256_t witness bitstring.
ScalarField get_value() const
cycle_scalar(const field_t &_lo, const field_t &_hi, const size_t bits, const bool skip_primality_test, const bool use_bn254_scalar_field_for_primality_test)
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 appropriate field modulus.
static cycle_scalar create_from_bn254_scalar(const field_t &_in)
Construct a cycle scalar (grumpkin scalar field element) from a bn254 scalar field element.
OriginTag get_origin_tag() const
static constexpr uint256_t modulus
static field_t from_witness(Builder *ctx, const bb::fr &input)
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
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.