28#include <gtest/gtest.h>
36uint256_t from_decimal(
const std::string& dec_str)
39 for (
char c : dec_str) {
40 result = result * 10 +
static_cast<uint64_t
>(c -
'0');
50struct Bn254FqTestConfig {
55 static constexpr const char* expected_modulus_decimal =
56 "21888242871839275222246405745257275088696311157297823662689037894645226208583";
57 static constexpr bool has_cube_root =
true;
58 static constexpr bool has_primitive_root =
false;
61struct Bn254FrTestConfig {
66 static constexpr const char* expected_modulus_decimal =
67 "21888242871839275222246405745257275088548364400416034343698204186575808495617";
68 static constexpr bool has_cube_root =
true;
69 static constexpr bool has_primitive_root =
true;
72struct Secp256k1FqTestConfig {
77 static constexpr const char* expected_modulus_decimal =
78 "115792089237316195423570985008687907853269984665640564039457584007908834671663";
79 static constexpr bool has_cube_root =
true;
80 static constexpr bool has_primitive_root =
false;
83struct Secp256k1FrTestConfig {
88 static constexpr const char* expected_modulus_decimal =
89 "115792089237316195423570985008687907852837564279074904382605163141518161494337";
90 static constexpr bool has_cube_root =
true;
91 static constexpr bool has_primitive_root =
false;
94struct Secp256r1FqTestConfig {
99 static constexpr const char* expected_modulus_decimal =
100 "115792089210356248762697446949407573530086143415290314195533631308867097853951";
101 static constexpr bool has_cube_root =
false;
102 static constexpr bool has_primitive_root =
false;
105struct Secp256r1FrTestConfig {
110 static constexpr const char* expected_modulus_decimal =
111 "115792089210356248762697446949407573529996955224135760342422259061068512044369";
112 static constexpr bool has_cube_root =
false;
113 static constexpr bool has_primitive_root =
false;
129 using Params =
typename TypeParam::Params;
130 uint256_t expected = from_decimal(TypeParam::expected_modulus_decimal);
131 uint256_t actual{ Params::modulus_0, Params::modulus_1, Params::modulus_2, Params::modulus_3 };
132 EXPECT_EQ(expected, actual);
138 using Params =
typename TypeParam::Params;
139 uint256_t mod{ Params::modulus_0, Params::modulus_1, Params::modulus_2, Params::modulus_3 };
142 uint256_t actual{ Params::r_squared_0, Params::r_squared_1, Params::r_squared_2, Params::r_squared_3 };
143 EXPECT_EQ(expected.
lo, actual);
149 using Params =
typename TypeParam::Params;
150 uint256_t mod{ Params::modulus_0, Params::modulus_1, Params::modulus_2, Params::modulus_3 };
153 uint64_t expected = neg_mod.
invmod(two_64).
lo.data[0];
154 EXPECT_EQ(Params::r_inv, expected);
160 using Params =
typename TypeParam::Params;
161 uint256_t mod{ Params::modulus_0, Params::modulus_1, Params::modulus_2, Params::modulus_3 };
164 EXPECT_EQ(expected.
data[0], Params::r_inv_0);
165 EXPECT_EQ(expected.
data[1], Params::r_inv_1);
166 EXPECT_EQ(expected.
data[2], Params::r_inv_2);
167 EXPECT_EQ(expected.
data[3], Params::r_inv_3);
173 if constexpr (!TypeParam::has_cube_root) {
174 GTEST_SKIP() <<
"Cube root of unity is not defined for this field";
176 using Field =
typename TypeParam::Field;
177 Field beta = Field::cube_root_of_unity();
178 EXPECT_EQ(beta * beta * beta, Field::one());
179 EXPECT_NE(beta, Field::one());
186 if constexpr (!TypeParam::has_primitive_root) {
187 GTEST_SKIP() <<
"Primitive root of unity is not used for this field";
189 using Field =
typename TypeParam::Field;
190 size_t order = Field::primitive_root_log_size();
191 Field root = Field::get_root_of_unity(order);
193 for (
size_t i = 0; i < order; i++) {
194 EXPECT_NE(root, Field::one());
198 EXPECT_EQ(root, Field::one());
205 using Params =
typename TypeParam::Params;
206 using Field =
typename TypeParam::Field;
207 uint256_t mod{ Params::modulus_0, Params::modulus_1, Params::modulus_2, Params::modulus_3 };
208 Field coset_gen = Field::coset_generator();
209 EXPECT_NE(coset_gen.pow((mod - 1) / 2), Field::one());
220 using Params =
typename TypeParam::Params;
221 uint256_t mod{ Params::modulus_0, Params::modulus_1, Params::modulus_2, Params::modulus_3 };
222 constexpr std::array<uint64_t, 9> wasm_limbs = { Params::modulus_wasm_0, Params::modulus_wasm_1,
223 Params::modulus_wasm_2, Params::modulus_wasm_3,
224 Params::modulus_wasm_4, Params::modulus_wasm_5,
225 Params::modulus_wasm_6, Params::modulus_wasm_7,
226 Params::modulus_wasm_8 };
228 for (
size_t i = 0; i < 9; i++) {
229 wasm_modulus +=
uint512_t(wasm_limbs[i]) << (29UL * i);
230 EXPECT_LT(wasm_limbs[i], uint64_t(1) << 29);
232 EXPECT_EQ(wasm_modulus.
lo, mod);
239 using Params =
typename TypeParam::Params;
240 uint256_t mod{ Params::modulus_0, Params::modulus_1, Params::modulus_2, Params::modulus_3 };
243 uint512_t expected = (R_wasm_mod * R_wasm_mod) % mod;
245 Params::r_squared_wasm_0, Params::r_squared_wasm_1, Params::r_squared_wasm_2, Params::r_squared_wasm_3
247 EXPECT_EQ(expected.
lo, actual);
255 using Params =
typename TypeParam::Params;
256 uint256_t mod{ Params::modulus_0, Params::modulus_1, Params::modulus_2, Params::modulus_3 };
257 constexpr std::array<uint64_t, 9> r_inv_wasm_limbs = {
258 Params::r_inv_wasm_0, Params::r_inv_wasm_1, Params::r_inv_wasm_2, Params::r_inv_wasm_3, Params::r_inv_wasm_4,
259 Params::r_inv_wasm_5, Params::r_inv_wasm_6, Params::r_inv_wasm_7, Params::r_inv_wasm_8
262 for (
size_t i = 0; i < 9; i++) {
263 r_inv_wasm +=
uint512_t(r_inv_wasm_limbs[i]) << (29UL * i);
264 EXPECT_LT(r_inv_wasm_limbs[i], uint64_t(1) << 29);
268 EXPECT_EQ(r_inv_wasm, expected);
276 if constexpr (!TypeParam::has_cube_root) {
277 GTEST_SKIP() <<
"Cube root is not used for this field";
279 using Params =
typename TypeParam::Params;
280 uint256_t mod{ Params::modulus_0, Params::modulus_1, Params::modulus_2, Params::modulus_3 };
282 Params::cube_root_0, Params::cube_root_1, Params::cube_root_2, Params::cube_root_3
285 Params::cube_root_wasm_0, Params::cube_root_wasm_1, Params::cube_root_wasm_2, Params::cube_root_wasm_3
289 EXPECT_EQ(expected.
lo, cube_root_wasm);
296 if constexpr (!TypeParam::has_primitive_root) {
297 GTEST_SKIP() <<
"Primitive root is not used for this field";
299 using Params =
typename TypeParam::Params;
300 uint256_t mod{ Params::modulus_0, Params::modulus_1, Params::modulus_2, Params::modulus_3 };
302 Params::primitive_root_0, Params::primitive_root_1, Params::primitive_root_2, Params::primitive_root_3
304 uint256_t primitive_root_wasm{ Params::primitive_root_wasm_0,
305 Params::primitive_root_wasm_1,
306 Params::primitive_root_wasm_2,
307 Params::primitive_root_wasm_3 };
310 EXPECT_EQ(expected.
lo, primitive_root_wasm);
317 using Params =
typename TypeParam::Params;
318 uint256_t mod{ Params::modulus_0, Params::modulus_1, Params::modulus_2, Params::modulus_3 };
320 Params::coset_generator_0, Params::coset_generator_1, Params::coset_generator_2, Params::coset_generator_3
322 uint256_t coset_generator_wasm{ Params::coset_generator_wasm_0,
323 Params::coset_generator_wasm_1,
324 Params::coset_generator_wasm_2,
325 Params::coset_generator_wasm_3 };
328 EXPECT_EQ(expected,
static_cast<uint512_t>(coset_generator_wasm));
337 PrimitiveRootOfUnity,
339 WasmModulusConsistency,
342 WasmCubeRootConsistency,
343 WasmPrimitiveRootConsistency,
344 CosetGeneratorConsistency);
348 Secp256k1FqTestConfig,
349 Secp256k1FrTestConfig,
350 Secp256r1FqTestConfig,
351 Secp256r1FrTestConfig>;
Parameters defining the base field of the BN254 curve.
Parameters defining the scalar field of the BN254 curve.
uintx invmod(const uintx &modulus) const
INSTANTIATE_TYPED_TEST_SUITE_P(AllFields, FieldConstantsTest, FieldTestTypes)
TYPED_TEST_P(FieldConstantsTest, Modulus)
TYPED_TEST_SUITE_P(FieldConstantsTest)
::testing::Types< Bn254FqTestConfig, Bn254FrTestConfig, Secp256k1FqTestConfig, Secp256k1FrTestConfig, Secp256r1FqTestConfig, Secp256r1FrTestConfig > FieldTestTypes
REGISTER_TYPED_TEST_SUITE_P(FieldConstantsTest, Modulus, RSquared, RInv, PowMinus64, CubeRootOfUnity, PrimitiveRootOfUnity, CosetGenerator, WasmModulusConsistency, WasmRSquared, WasmPowMinus29, WasmCubeRootConsistency, WasmPrimitiveRootConsistency, CosetGeneratorConsistency)
uintx< uint256_t > uint512_t
Entry point for Barretenberg command-line interface.
field< Bn254FqParams > fq
field< Bn254FrParams > fr
Parameters defining the base field of the secp256k1 curve.
Parameters defining the scalar field of the secp256k1 curve.
Parameters defining the base field of the secp256r1 curve.
Parameters defining the scalar field of the secp256r1 curve.