8TEST(pairing, ReducedAtePairingCheckAgainstConstants)
11 uint256_t(0x956e256b9db00c13, 0x66d29ac18e1b2bff, 0x5d6f055e34402f6e, 0x5bfcbaaff0feb62),
12 uint256_t(0x564099dc0ef0a96, 0xa97eca7453f67dd2, 0x850e976b207e8c18, 0x20187f89a1d789cd)
15 {
uint256_t(0x3b25f1ad9a7f9cd2, 0xddb8b066d21ce86, 0xf8a4e318abd3cff7, 0x1272ee5f2e7e9dc1),
16 uint256_t(0xc7b14ea54dc1436f, 0x1f9384eb12b6941a, 0x3afe17a00720e8e3, 0x2a171f424ab98d8) },
17 {
uint256_t(0x890d5a50c1d88e96, 0x6ae79a7a2b439172, 0x4c120a629ced363c, 0x295bd556fe685dd),
18 uint256_t(0xa3189c7f120d4738, 0x4416da0df17c8ee, 0x4cc514acc1c2ac45, 0xb17d8f998e4ebe6) }
20 constexpr fq12 expected = {
22 { {
uint256_t(0xd3b91c8dc40a9b8c, 0x5c8a39a470fcb4ea, 0x763e904e585a87e7, 0x2026f0077c50afa4),
23 uint256_t(0xddc69495371e5f38, 0x290bfc6512704e60, 0xc208c0f8e90bd52f, 0x2e82c92370a2f000) },
24 {
uint256_t(0xdcbc2917451b8e12, 0x183016aa113a74eb, 0x9a2ff2a059f7d14d, 0x1166fc0ed488820c),
25 uint256_t(0x3b2c1e19e47214ff, 0x374df83e0ac59c1a, 0x3e1c5ed4fd611cb2, 0x26179258a104da1a) },
26 {
uint256_t(0xc948bdff07912922, 0x3417ba2a42303918, 0x89336b54f20ff8a9, 0xb7eed88572fcac4),
28 uint256_t(0x85524385a79574ba, 0xe7746ad78e659d8e, 0x997e4848cc70eca5, 0x2a9e3f37c50e6c9a) } },
30 { {
uint256_t(0xc7eed1ca5aaa5a82, 0xea8d1f0be1ef0d7, 0xd7d539fd8136038a, 0x27196e24cd6d028e),
31 uint256_t(0xcb7b6528984002e4, 0x1d3221c223e0587, 0xda44f3e957677f97, 0x1e3df34445cc3876) },
32 {
uint256_t(0xf3e958491c2b4c43, 0x1dbafe473f7034b9, 0x129efae93ff9d8c9, 0xdedbf49d35171b9),
33 uint256_t(0x7da7c99cf811a603, 0xfcb99b8309663279, 0x1d80151ef8fcdb59, 0x1b09a01856170269) },
34 {
uint256_t(0xa048b10941003960, 0x73d941c906a24cd0, 0x9c10f82a6bf78e2e, 0x13a41dbdd3d616d),
35 uint256_t(0x31d7525fa8914a4c, 0xe1ed738718e2e8b8, 0x18305c749a9d97a2, 0x20534d878e1e9db0) } }
42 static_assert(result == expected);
45 EXPECT_EQ(result, expected);
121TEST(pairing, ReducedAtePairingConsistencyCheckBatch)
123 size_t num_points = 10;
129 std::vector<fr> scalars(num_points + num_points);
130 for (
size_t i = 0; i < 10; ++i) {
141 for (
size_t i = 0; i < 10; ++i) {
142 P_a[i] = P_a[i] * scalars[i];
143 Q_b[i] = Q_b[i] * scalars[i];
144 P_b[i] = P_b[i] * scalars[i + num_points];
145 Q_a[i] = Q_a[i] * scalars[i + num_points];
151 EXPECT_EQ(result, expected);
154TEST(pairing, ReducedAtePairingPrecomputeConsistencyCheckBatch)
156 size_t num_points = 10;
162 std::vector<fr> scalars(num_points + num_points);
163 for (
size_t i = 0; i < 10; ++i) {
173 for (
size_t i = 0; i < 10; ++i) {
174 P_a[i] = P_a[i] * scalars[i];
175 Q_b[i] = Q_b[i] * scalars[i];
176 P_b[i] = P_b[i] * scalars[i + num_points];
177 Q_a[i] = Q_a[i] * scalars[i + num_points];
179 for (
size_t i = 0; i < 10; ++i) {
188 EXPECT_EQ(result, expected);
226 scalar_current * current_affine.
y,
233 fq2 lambda = current.x - Q.x * current.z;
234 fq2 theta = current.y - Q.y * current.z;
235 fq2 E = lambda.
sqr() * lambda;
236 fq2 F = current.z * theta.
sqr();
237 fq2 G = current.x * lambda.
sqr();
240 EXPECT_EQ(work_point.
x, lambda * H);
241 EXPECT_EQ(work_point.
y, theta * (
G - H) - current.y * E);
242 EXPECT_EQ(work_point.
z, current.z * E);
243 EXPECT_EQ(line.
o, lambda);
244 EXPECT_EQ(line.
w, theta);
245 EXPECT_EQ(line.
vw, theta * Q.x - lambda * Q.y);
248 fq2 gradient = (Q.y - current.y * current.z.invert()) * (Q.x - current.x * current.z.invert()).invert();
249 fq2 multiplier = current.x - current.z * Q.x;
250 EXPECT_EQ(line.
o, multiplier);
251 EXPECT_EQ(line.
w, gradient * multiplier);
252 EXPECT_EQ(line.
vw, (gradient * Q.x * Q.z.
invert() - Q.y * Q.z.
invert()) * multiplier);