39 using cycle_scalar =
typename TestFixture::cycle_scalar;
40 using ScalarField =
typename TestFixture::ScalarField;
43 auto scalar_val = ScalarField::random_element(&
engine);
44 auto scalar = cycle_scalar::from_witness(&
builder, scalar_val);
46 EXPECT_EQ(scalar.get_value(), scalar_val);
47 EXPECT_FALSE(scalar.is_constant());
48 EXPECT_EQ(scalar.num_bits(), cycle_scalar::NUM_BITS);
53 uint256_t reconstructed = lo_val + (hi_val << cycle_scalar::LO_BITS);
55 EXPECT_EQ(ScalarField(reconstructed), scalar_val);
57 check_circuit_and_gate_count(
builder, 0);
65 using cycle_scalar =
typename TestFixture::cycle_scalar;
66 using ScalarField =
typename TestFixture::ScalarField;
70 auto scalar = cycle_scalar::from_u256_witness(&
builder,
value);
72 EXPECT_EQ(scalar.get_value(), ScalarField(
value));
73 EXPECT_FALSE(scalar.is_constant());
74 EXPECT_EQ(scalar.num_bits(), 256);
79 uint256_t reconstructed = lo_val + (hi_val << cycle_scalar::LO_BITS);
81 EXPECT_EQ(reconstructed,
value);
83 check_circuit_and_gate_count(
builder, 0);
91 using cycle_scalar =
typename TestFixture::cycle_scalar;
92 using ScalarField =
typename TestFixture::ScalarField;
93 using field_t =
typename TestFixture::field_t;
94 using NativeField =
typename TestFixture::NativeField;
97 auto native_val = NativeField::random_element(&
engine);
100 auto scalar = cycle_scalar::create_from_bn254_scalar(field_val);
102 EXPECT_EQ(scalar.get_value(), ScalarField(
uint256_t(native_val)));
103 EXPECT_FALSE(scalar.is_constant());
104 EXPECT_TRUE(scalar.use_bn254_scalar_field_for_primality_test());
109 uint256_t reconstructed = lo_val + (hi_val << cycle_scalar::LO_BITS);
111 EXPECT_EQ(NativeField(reconstructed), field_val.get_value());
113 check_circuit_and_gate_count(
builder, 2762);
121 using cycle_scalar =
typename TestFixture::cycle_scalar;
122 using ScalarField =
typename TestFixture::ScalarField;
123 using BigScalarField =
typename cycle_scalar::BigScalarField;
130 auto big_scalar = BigScalarField::from_witness(&
builder,
value);
131 cycle_scalar scalar(big_scalar);
133 EXPECT_EQ(scalar.get_value(),
value);
134 EXPECT_FALSE(scalar.is_constant());
139 uint256_t reconstructed = lo_val + (hi_val << cycle_scalar::LO_BITS);
140 EXPECT_EQ(ScalarField(reconstructed),
value);
142 check_circuit_and_gate_count(
builder, 3498);
151 cycle_scalar scalar(big_scalar);
153 EXPECT_EQ(scalar.get_value(), ScalarField(
value));
154 EXPECT_TRUE(scalar.is_constant());
159 uint256_t reconstructed = lo_val + (hi_val << cycle_scalar::LO_BITS);
160 EXPECT_EQ(ScalarField(reconstructed),
value);
162 check_circuit_and_gate_count(
builder, 0);
171 using cycle_scalar =
typename TestFixture::cycle_scalar;
172 using ScalarField =
typename TestFixture::ScalarField;
177 auto valid_scalar = ScalarField::random_element(&
engine);
178 auto scalar = cycle_scalar::from_witness(&
builder, valid_scalar);
179 scalar.validate_scalar_is_in_field();
180 EXPECT_FALSE(
builder.failed());
182 check_circuit_and_gate_count(
builder, 2761);
195 using cycle_scalar =
typename TestFixture::cycle_scalar;
196 using field_t =
typename TestFixture::field_t;
197 using NativeField =
typename TestFixture::NativeField;
204 uint256_t moduli_diff = bn254_fq_modulus - bn254_fr_modulus;
205 uint256_t value_between_moduli = bn254_fr_modulus + moduli_diff / 2;
208 uint256_t lo_val = value_between_moduli.
slice(0, cycle_scalar::LO_BITS);
209 uint256_t hi_val = value_between_moduli.
slice(cycle_scalar::LO_BITS, 256);
220 auto scalar = cycle_scalar(lo, hi);
223 EXPECT_FALSE(scalar.use_bn254_scalar_field_for_primality_test());
226 scalar.validate_scalar_is_in_field();
229 EXPECT_FALSE(
builder.failed());
230 check_circuit_and_gate_count(
builder, 2761);
244 auto scalar = cycle_scalar(lo, hi);
248 uint256_t(scalar.lo.get_value()) + (
uint256_t(scalar.hi.get_value()) << cycle_scalar::LO_BITS);
249 EXPECT_EQ(reconstructed, value_between_moduli);
266 using cycle_scalar =
typename TestFixture::cycle_scalar;
267 using ScalarField =
typename TestFixture::ScalarField;
268 using BigScalarField =
typename cycle_scalar::BigScalarField;
273 BigScalarField zero_scalar = BigScalarField::from_witness(&
builder,
uint256_t(0));
274 cycle_scalar scalar(zero_scalar);
276 EXPECT_EQ(scalar.get_value(), ScalarField(0));
277 EXPECT_EQ(scalar.lo.get_value(), 0);
278 EXPECT_EQ(scalar.hi.get_value(), 0);
280 check_circuit_and_gate_count(
builder, 3498);
287 BigScalarField small_scalar = BigScalarField::from_witness(&
builder, small_value);
288 cycle_scalar scalar(small_scalar);
290 EXPECT_EQ(scalar.get_value(), ScalarField(small_value));
291 EXPECT_EQ(scalar.lo.get_value(), small_value);
292 EXPECT_EQ(scalar.hi.get_value(), 0);
294 check_circuit_and_gate_count(
builder, 3498);
301 BigScalarField boundary_scalar = BigScalarField::from_witness(&
builder, limb_boundary);
302 cycle_scalar scalar(boundary_scalar);
304 EXPECT_EQ(scalar.get_value(), ScalarField(limb_boundary));
306 check_circuit_and_gate_count(
builder, 3498);
314 BigScalarField limb0_full_scalar = BigScalarField::from_witness(&
builder, limb0_full);
315 cycle_scalar scalar(limb0_full_scalar);
317 EXPECT_EQ(scalar.get_value(), ScalarField(limb0_full));
319 check_circuit_and_gate_count(
builder, 3498);
326 BigScalarField val_136_scalar = BigScalarField::from_witness(&
builder, val_136);
327 cycle_scalar scalar(val_136_scalar);
329 EXPECT_EQ(scalar.get_value(), ScalarField(val_136));
331 check_circuit_and_gate_count(
builder, 3498);
339 BigScalarField special_scalar = BigScalarField::from_witness(&
builder, special_value);
340 cycle_scalar scalar(special_scalar);
342 EXPECT_EQ(scalar.get_value(), ScalarField(special_value));
344 check_circuit_and_gate_count(
builder, 3498);
355 BigScalarField scalar1 = BigScalarField::from_witness(&
builder, val1);
356 BigScalarField scalar2 = BigScalarField::from_witness(&
builder, val2);
359 BigScalarField
sum = scalar1 + scalar2;
362 EXPECT_GT(
sum.binary_basis_limbs[0].maximum_value, BigScalarField::DEFAULT_MAXIMUM_LIMB);
365 cycle_scalar scalar(
sum);
369 EXPECT_EQ(scalar.get_value(), ScalarField(expected));
372 check_circuit_and_gate_count(
builder, 3555);
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.