Clearmatics Libff  0.1
C++ library for Finite Fields and Elliptic Curves
bls12_381_pairing.cpp
Go to the documentation of this file.
1 
8 #include <cassert>
14 
15 namespace libff
16 {
17 
19  const bls12_381_ate_G1_precomp &other) const
20 {
21  return (this->PX == other.PX && this->PY == other.PY);
22 }
23 
24 std::ostream &operator<<(
25  std::ostream &out, const bls12_381_ate_G1_precomp &prec_P)
26 {
27  out << prec_P.PX << OUTPUT_SEPARATOR << prec_P.PY;
28 
29  return out;
30 }
31 
32 std::istream &operator>>(std::istream &in, bls12_381_ate_G1_precomp &prec_P)
33 {
34  in >> prec_P.PX;
36  in >> prec_P.PY;
37 
38  return in;
39 }
40 
42  const bls12_381_ate_ell_coeffs &other) const
43 {
44  return (
45  this->ell_0 == other.ell_0 && this->ell_VW == other.ell_VW &&
46  this->ell_VV == other.ell_VV);
47 }
48 
49 std::ostream &operator<<(std::ostream &out, const bls12_381_ate_ell_coeffs &c)
50 {
51  out << c.ell_0 << OUTPUT_SEPARATOR << c.ell_VW << OUTPUT_SEPARATOR
52  << c.ell_VV;
53  return out;
54 }
55 
56 std::istream &operator>>(std::istream &in, bls12_381_ate_ell_coeffs &c)
57 {
58  in >> c.ell_0;
60  in >> c.ell_VW;
62  in >> c.ell_VV;
63 
64  return in;
65 }
66 
68  const bls12_381_ate_G2_precomp &other) const
69 {
70  return (
71  this->QX == other.QX && this->QY == other.QY &&
72  this->coeffs == other.coeffs);
73 }
74 
75 std::ostream &operator<<(
76  std::ostream &out, const bls12_381_ate_G2_precomp &prec_Q)
77 {
78  out << prec_Q.QX << OUTPUT_SEPARATOR << prec_Q.QY << "\n";
79  out << prec_Q.coeffs.size() << "\n";
80  for (const bls12_381_ate_ell_coeffs &c : prec_Q.coeffs) {
81  out << c << OUTPUT_NEWLINE;
82  }
83 
84  return out;
85 }
86 
87 std::istream &operator>>(std::istream &in, bls12_381_ate_G2_precomp &prec_Q)
88 {
89  in >> prec_Q.QX;
91  in >> prec_Q.QY;
92  consume_newline(in);
93 
94  prec_Q.coeffs.clear();
95  size_t s;
96  in >> s;
97 
98  consume_newline(in);
99 
100  prec_Q.coeffs.reserve(s);
101 
102  for (size_t i = 0; i < s; ++i) {
104  in >> c;
106  prec_Q.coeffs.emplace_back(c);
107  }
108 
109  return in;
110 }
111 
112 /* final exponentiations */
113 
115  const bls12_381_Fq12 &elt)
116 {
117  enter_block("Call to bls12_381_final_exponentiation_first_chunk");
118 
119  /*
120  Computes result = elt^((q^6-1)*(q^2+1)).
121  Follows, e.g., Beuchat et al page 9, by computing result as follows:
122  elt^((q^6-1)*(q^2+1)) = (conj(elt) * elt^(-1))^(q^2+1)
123  More precisely:
124  A = conj(elt)
125  B = elt.inverse()
126  C = A * B
127  D = C.Frobenius_map(2)
128  result = D * C
129  */
130 
131  const bls12_381_Fq12 A = bls12_381_Fq12(elt.coeffs[0], -elt.coeffs[1]);
132  const bls12_381_Fq12 B = elt.inverse();
133  const bls12_381_Fq12 C = A * B;
134  const bls12_381_Fq12 D = C.Frobenius_map(2);
135  const bls12_381_Fq12 result = D * C;
136 
137  leave_block("Call to bls12_381_final_exponentiation_first_chunk");
138 
139  return result;
140 }
141 
143 {
144  enter_block("Call to bls12_381_exp_by_z");
145 
148  result = result.unitary_inverse();
149  }
150 
151  leave_block("Call to bls12_381_exp_by_z");
152 
153  return result;
154 }
155 
157  const bls12_381_Fq12 &elt)
158 {
159  enter_block("Call to bls12_381_final_exponentiation_last_chunk");
160 
161  // https://eprint.iacr.org/2016/130.pdf (Algorithm 1 described in Table 1)
162  // elt^(-2)
164  // elt^z
165  const bls12_381_Fq12 B = bls12_381_exp_by_z(elt);
166  // elt^(2z)
167  const bls12_381_Fq12 C = B.cyclotomic_squared();
168  // elt^(z-2)
169  const bls12_381_Fq12 D = A * B;
170  // elt^(z^2-2z)
171  const bls12_381_Fq12 E = bls12_381_exp_by_z(D);
172  // elt^(z^3-2z^2)
173  const bls12_381_Fq12 F = bls12_381_exp_by_z(E);
174  // elt^(z^4-2z^3)
175  const bls12_381_Fq12 G = bls12_381_exp_by_z(F);
176  // elt^(z^4-2z^3+2z)
177  const bls12_381_Fq12 H = G * C;
178  // elt^(z^5-2z^4+2z^2)
179  const bls12_381_Fq12 I = bls12_381_exp_by_z(H);
180  // elt^(-z+2)
181  const bls12_381_Fq12 J = D.unitary_inverse();
182  // elt^(z^5-2z^4+2z^2) * elt^(-z+2)
183  const bls12_381_Fq12 K = J * I;
184  // elt^(z^5-2z^4+2z^2) * elt^(-z+2) * elt
185  const bls12_381_Fq12 L = elt * K;
186  // elt^(-1)
187  const bls12_381_Fq12 M = elt.unitary_inverse();
188  // elt^(z^2-2z) * elt
189  const bls12_381_Fq12 N = E * elt;
190  // (elt^(z^2-2z) * elt)^(q^3)
191  const bls12_381_Fq12 O = N.Frobenius_map(3);
192  // elt^(z^4-2z^3+2z) * elt^(-1)
193  const bls12_381_Fq12 P = H * M;
194  // (elt^(z^4-2z^3+2z) * elt^(-1))^q
195  const bls12_381_Fq12 Q = P.Frobenius_map(1);
196  // elt^(z^3-2z^2) * elt^z
197  const bls12_381_Fq12 R = B * F;
198  // (elt^(z^3-2z^2) * elt^z)^(q^2)
199  const bls12_381_Fq12 S = R.Frobenius_map(2);
200  // (elt^(z^2-2z) * elt)^(q^3) * (elt^(z^3-2z^2) * elt^z)^(q^2)
201  const bls12_381_Fq12 T = S * O;
202  // (elt^(z^2-2z) * elt)^(q^3) * (elt^(z^3-2z^2) * elt^z)^(q^2) *
203  // (elt^(z^4-2z^3+2z) * elt^(-1))^q
204  const bls12_381_Fq12 U = T * Q;
205  // (elt^(z^2-2z) * elt)^(q^3) * (elt^(z^3-2z^2) * elt^z)^(q^2) *
206  // (elt^(z^4-2z^3+2z) * elt^(-1))^q * elt^(z^5-2z^4+2z^2) *
207  // elt^(-z+2) * elt
208  const bls12_381_Fq12 result = U * L;
209 
210  leave_block("Call to bls12_381_final_exponentiation_last_chunk");
211 
212  return result;
213 }
214 
216 {
217  enter_block("Call to bls12_381_final_exponentiation");
218  /* OLD naive version:
219  bls12_381_GT result = elt^bls12_381_final_exponent;
220  */
223 
224  leave_block("Call to bls12_381_final_exponentiation");
225  return result;
226 }
227 
228 /* ate pairing */
229 
231  const bls12_381_Fq two_inv,
232  bls12_381_G2 &current,
234 {
235  const bls12_381_Fq2 X = current.X, Y = current.Y, Z = current.Z;
236 
237  // A = X1 * Y1 / 2
238  const bls12_381_Fq2 A = two_inv * (X * Y);
239  // B = Y1^2
240  const bls12_381_Fq2 B = Y.squared();
241  // C = Z1^2
242  const bls12_381_Fq2 C = Z.squared();
243  // D = 3 * C
244  const bls12_381_Fq2 D = C + C + C;
245  // E = twist_b * D
247  // F = 3 * E
248  const bls12_381_Fq2 F = E + E + E;
249  // G = (B+F)/2
250  const bls12_381_Fq2 G = two_inv * (B + F);
251  // H = (Y1+Z1)^2-(B+C)
252  const bls12_381_Fq2 H = (Y + Z).squared() - (B + C);
253  // I = E-B
254  const bls12_381_Fq2 I = E - B;
255  // J = X1^2
256  const bls12_381_Fq2 J = X.squared();
257  // E_squared = E^2
258  const bls12_381_Fq2 E_squared = E.squared();
259 
260  // X3 = A * (B-F)
261  current.X = A * (B - F);
262  // Y3 = G^2 - 3*E^2
263  current.Y = G.squared() - (E_squared + E_squared + E_squared);
264  // Z3 = B * H
265  current.Z = B * H;
266  // ell_0 = xi * I
267  c.ell_0 = I;
268  // ell_VW = - H (later: * yP)
269  c.ell_VW = -bls12_381_twist * H;
270  // ell_VV = 3*J (later: * xP)
271  c.ell_VV = J + J + J;
272 }
273 
275  const bls12_381_G2 base, bls12_381_G2 &current, bls12_381_ate_ell_coeffs &c)
276 {
277  const bls12_381_Fq2 X1 = current.X, Y1 = current.Y, Z1 = current.Z;
278  const bls12_381_Fq2 &x2 = base.X, &y2 = base.Y;
279 
280  // D = X1 - X2*Z1
281  const bls12_381_Fq2 D = X1 - x2 * Z1;
282  // E = Y1 - Y2*Z1
283  const bls12_381_Fq2 E = Y1 - y2 * Z1;
284  // F = D^2
285  const bls12_381_Fq2 F = D.squared();
286  // G = E^2
287  const bls12_381_Fq2 G = E.squared();
288  // H = D*F
289  const bls12_381_Fq2 H = D * F;
290  // I = X1 * F
291  const bls12_381_Fq2 I = X1 * F;
292  // J = H + Z1*G - (I+I)
293  const bls12_381_Fq2 J = H + Z1 * G - (I + I);
294 
295  // X3 = D*J
296  current.X = D * J;
297  // Y3 = E*(I-J)-(H*Y1)
298  current.Y = E * (I - J) - (H * Y1);
299  // Z3 = Z1*H
300  current.Z = Z1 * H;
301  // ell_0 = xi * (E * X2 - D * Y2)
302  c.ell_0 = E * x2 - D * y2;
303  // ell_VV = - E (later: * xP)
304  c.ell_VV = -E;
305  // ell_VW = D (later: * yP )
306  c.ell_VW = bls12_381_twist * D;
307 }
308 
310 {
311  enter_block("Call to bls12_381_ate_precompute_G1");
312 
313  bls12_381_G1 Pcopy = P;
314  Pcopy.to_affine_coordinates();
315 
317  result.PX = Pcopy.X;
318  result.PY = Pcopy.Y;
319 
320  leave_block("Call to bls12_381_ate_precompute_G1");
321  return result;
322 }
323 
325 {
326  enter_block("Call to bls12_381_ate_precompute_G2");
327 
328  bls12_381_G2 Qcopy(Q);
329  Qcopy.to_affine_coordinates();
330 
331  // could add to global params if needed
332  bls12_381_Fq two_inv = (bls12_381_Fq("2").inverse());
333 
335  result.QX = Qcopy.X;
336  result.QY = Qcopy.Y;
337 
338  bls12_381_G2 R;
339  R.X = Qcopy.X;
340  R.Y = Qcopy.Y;
341  R.Z = bls12_381_Fq2::one();
342 
343  const bigint<bls12_381_Fq::num_limbs> &loop_count =
345  bool found_one = false;
347 
348  for (long i = loop_count.max_bits(); i >= 0; --i) {
349  const bool bit = loop_count.test_bit(i);
350  if (!found_one) {
351  /* this skips the MSB itself */
352  found_one |= bit;
353  continue;
354  }
355 
357  result.coeffs.push_back(c);
358 
359  if (bit) {
361  result.coeffs.push_back(c);
362  }
363  }
364 
365  leave_block("Call to bls12_381_ate_precompute_G2");
366  return result;
367 }
368 
370  const bls12_381_ate_G1_precomp &prec_P,
371  const bls12_381_ate_G2_precomp &prec_Q)
372 {
373  enter_block("Call to bls12_381_ate_miller_loop");
374 
376 
377  bool found_one = false;
378  size_t idx = 0;
379 
380  const bigint<bls12_381_Fq::num_limbs> &loop_count =
383 
384  for (long i = loop_count.max_bits(); i >= 0; --i) {
385  const bool bit = loop_count.test_bit(i);
386  if (!found_one) {
387  /* this skips the MSB itself */
388  found_one |= bit;
389  continue;
390  }
391 
392  /* code below gets executed for all bits (EXCEPT the MSB itself) of
393  bls12_381_param_p (skipping leading zeros) in MSB to LSB
394  order */
395 
396  c = prec_Q.coeffs[idx++];
397  f = f.squared();
398  f = f.mul_by_045(c.ell_0, prec_P.PY * c.ell_VW, prec_P.PX * c.ell_VV);
399 
400  if (bit) {
401  c = prec_Q.coeffs[idx++];
402  f = f.mul_by_045(
403  c.ell_0, prec_P.PY * c.ell_VW, prec_P.PX * c.ell_VV);
404  }
405  }
406 
408  f = f.inverse();
409  }
410 
411  leave_block("Call to bls12_381_ate_miller_loop");
412  return f;
413 }
414 
416  const bls12_381_ate_G1_precomp &prec_P1,
417  const bls12_381_ate_G2_precomp &prec_Q1,
418  const bls12_381_ate_G1_precomp &prec_P2,
419  const bls12_381_ate_G2_precomp &prec_Q2)
420 {
421  enter_block("Call to bls12_381_ate_double_miller_loop");
422 
424 
425  bool found_one = false;
426  size_t idx = 0;
427 
428  const bigint<bls12_381_Fq::num_limbs> &loop_count =
430  for (long i = loop_count.max_bits(); i >= 0; --i) {
431  const bool bit = loop_count.test_bit(i);
432  if (!found_one) {
433  /* this skips the MSB itself */
434  found_one |= bit;
435  continue;
436  }
437 
438  /* code below gets executed for all bits (EXCEPT the MSB itself) of
439  bls12_381_param_p (skipping leading zeros) in MSB to LSB
440  order */
441 
442  bls12_381_ate_ell_coeffs c1 = prec_Q1.coeffs[idx];
443  bls12_381_ate_ell_coeffs c2 = prec_Q2.coeffs[idx];
444  ++idx;
445 
446  f = f.squared();
447 
448  f = f.mul_by_045(
449  c1.ell_0, prec_P1.PY * c1.ell_VW, prec_P1.PX * c1.ell_VV);
450  f = f.mul_by_045(
451  c2.ell_0, prec_P2.PY * c2.ell_VW, prec_P2.PX * c2.ell_VV);
452 
453  if (bit) {
454  bls12_381_ate_ell_coeffs c1 = prec_Q1.coeffs[idx];
455  bls12_381_ate_ell_coeffs c2 = prec_Q2.coeffs[idx];
456  ++idx;
457 
458  f = f.mul_by_045(
459  c1.ell_0, prec_P1.PY * c1.ell_VW, prec_P1.PX * c1.ell_VV);
460  f = f.mul_by_045(
461  c2.ell_0, prec_P2.PY * c2.ell_VW, prec_P2.PX * c2.ell_VV);
462  }
463  }
464 
466  f = f.inverse();
467  }
468 
469  leave_block("Call to bls12_381_ate_double_miller_loop");
470 
471  return f;
472 }
473 
475  const bls12_381_G1 &P, const bls12_381_G2 &Q)
476 {
477  enter_block("Call to bls12_381_ate_pairing");
480  bls12_381_Fq12 result = bls12_381_ate_miller_loop(prec_P, prec_Q);
481  leave_block("Call to bls12_381_ate_pairing");
482  return result;
483 }
484 
486  const bls12_381_G1 &P, const bls12_381_G2 &Q)
487 {
488  enter_block("Call to bls12_381_ate_reduced_pairing");
489  const bls12_381_Fq12 f = bls12_381_ate_pairing(P, Q);
491  leave_block("Call to bls12_381_ate_reduced_pairing");
492  return result;
493 }
494 
495 /* choice of pairing */
496 
498 {
499  return bls12_381_ate_precompute_G1(P);
500 }
501 
503 {
504  return bls12_381_ate_precompute_G2(Q);
505 }
506 
508  const bls12_381_G1_precomp &prec_P, const bls12_381_G2_precomp &prec_Q)
509 {
510  return bls12_381_ate_miller_loop(prec_P, prec_Q);
511 }
512 
514  const bls12_381_G1_precomp &prec_P1,
515  const bls12_381_G2_precomp &prec_Q1,
516  const bls12_381_G1_precomp &prec_P2,
517  const bls12_381_G2_precomp &prec_Q2)
518 {
519  return bls12_381_ate_double_miller_loop(prec_P1, prec_Q1, prec_P2, prec_Q2);
520 }
521 
523 {
524  return bls12_381_ate_pairing(P, Q);
525 }
526 
528  const bls12_381_G1 &P, const bls12_381_G2 &Q)
529 {
530  return bls12_381_ate_reduced_pairing(P, Q);
531 }
532 } // namespace libff
libff::Fp2_model::coeffs
my_Fp coeffs[2]
Definition: fp2.hpp:63
libff::bls12_381_ate_ell_coeffs
Definition: bls12_381_pairing.hpp:33
libff::bls12_381_double_miller_loop
bls12_381_Fq12 bls12_381_double_miller_loop(const bls12_381_G1_precomp &prec_P1, const bls12_381_G2_precomp &prec_Q1, const bls12_381_G1_precomp &prec_P2, const bls12_381_G2_precomp &prec_Q2)
Definition: bls12_381_pairing.cpp:513
libff::bls12_381_ate_G1_precomp::PY
bls12_381_Fq PY
Definition: bls12_381_pairing.hpp:24
libff::bls12_381_ate_is_loop_count_neg
bool bls12_381_ate_is_loop_count_neg
Definition: bls12_381_init.cpp:21
libff::bls12_381_final_exponent_z
bigint< bls12_381_q_limbs > bls12_381_final_exponent_z
Definition: bls12_381_init.cpp:23
libff::bls12_381_ate_pairing
bls12_381_Fq12 bls12_381_ate_pairing(const bls12_381_G1 &P, const bls12_381_G2 &Q)
Definition: bls12_381_pairing.cpp:474
libff::bls12_381_ate_loop_count
bigint< bls12_381_q_limbs > bls12_381_ate_loop_count
Definition: bls12_381_init.cpp:20
libff::bls12_381_ate_reduced_pairing
bls12_381_GT bls12_381_ate_reduced_pairing(const bls12_381_G1 &P, const bls12_381_G2 &Q)
Definition: bls12_381_pairing.cpp:485
libff::enter_block
void enter_block(const std::string &msg, const bool indent)
Definition: profiling.cpp:271
libff::bls12_381_ate_G1_precomp
Definition: bls12_381_pairing.hpp:22
libff::bls12_381_ate_G2_precomp::QX
bls12_381_Fq2 QX
Definition: bls12_381_pairing.hpp:46
libff
Definition: ffi.cpp:8
libff::Fp2_model< bls12_381_q_limbs, bls12_381_modulus_q >::one
static const Fp2_model< n, modulus > & one()
libff::bls12_381_twist_coeff_b
bls12_381_Fq2 bls12_381_twist_coeff_b
Definition: bls12_381_init.cpp:14
libff::bls12_381_Fq
Fp_model< bls12_381_q_limbs, bls12_381_modulus_q > bls12_381_Fq
Definition: bls12_381_init.hpp:31
libff::bls12_381_G1::Y
bls12_381_Fq Y
Definition: bls12_381_g1.hpp:44
libff::bls12_381_final_exponentiation_last_chunk
bls12_381_Fq12 bls12_381_final_exponentiation_last_chunk(const bls12_381_Fq12 &elt)
Definition: bls12_381_pairing.cpp:156
libff::Fp12_2over3over2_model::one
static Fp12_2over3over2_model< n, modulus > one()
libff::operator>>
std::istream & operator>>(std::istream &in, alt_bn128_G1 &g)
Definition: alt_bn128_g1.cpp:446
libff::bls12_381_G1
Definition: bls12_381_g1.hpp:21
libff::bls12_381_G2::Y
bls12_381_Fq2 Y
Definition: bls12_381_g2.hpp:45
libff::bls12_381_ate_G2_precomp::coeffs
std::vector< bls12_381_ate_ell_coeffs > coeffs
Definition: bls12_381_pairing.hpp:48
libff::bls12_381_ate_miller_loop
bls12_381_Fq12 bls12_381_ate_miller_loop(const bls12_381_ate_G1_precomp &prec_P, const bls12_381_ate_G2_precomp &prec_Q)
Definition: bls12_381_pairing.cpp:369
libff::Fp_model::inverse
Fp_model inverse() const
libff::bls12_381_ate_ell_coeffs::ell_0
bls12_381_Fq2 ell_0
Definition: bls12_381_pairing.hpp:34
libff::Fp12_2over3over2_model::squared
Fp12_2over3over2_model squared() const
default is squared_complex
libff::bls12_381_ate_G1_precomp::operator==
bool operator==(const bls12_381_ate_G1_precomp &other) const
Definition: bls12_381_pairing.cpp:18
libff::bls12_381_exp_by_z
bls12_381_Fq12 bls12_381_exp_by_z(const bls12_381_Fq12 &elt)
Definition: bls12_381_pairing.cpp:142
OUTPUT_SEPARATOR
#define OUTPUT_SEPARATOR
Definition: serialization.hpp:69
libff::Fp12_2over3over2_model::Frobenius_map
Fp12_2over3over2_model Frobenius_map(unsigned long power) const
libff::bigint::max_bits
static constexpr size_t max_bits()
The number of bits representable by this bigint type.
Definition: bigint.hpp:51
libff::bls12_381_ate_G2_precomp::QY
bls12_381_Fq2 QY
Definition: bls12_381_pairing.hpp:47
libff::bls12_381_doubling_step_for_miller_loop
void bls12_381_doubling_step_for_miller_loop(const bls12_381_Fq two_inv, bls12_381_G2 &current, bls12_381_ate_ell_coeffs &c)
Definition: bls12_381_pairing.cpp:230
libff::Fp12_2over3over2_model::inverse
Fp12_2over3over2_model inverse() const
libff::bls12_381_mixed_addition_step_for_miller_loop
void bls12_381_mixed_addition_step_for_miller_loop(const bls12_381_G2 base, bls12_381_G2 &current, bls12_381_ate_ell_coeffs &c)
Definition: bls12_381_pairing.cpp:274
libff::bls12_381_ate_G2_precomp::operator==
bool operator==(const bls12_381_ate_G2_precomp &other) const
Definition: bls12_381_pairing.cpp:67
libff::bls12_381_ate_ell_coeffs::operator==
bool operator==(const bls12_381_ate_ell_coeffs &other) const
Definition: bls12_381_pairing.cpp:41
libff::bls12_381_final_exponentiation_first_chunk
bls12_381_Fq12 bls12_381_final_exponentiation_first_chunk(const bls12_381_Fq12 &elt)
Definition: bls12_381_pairing.cpp:114
libff::consume_OUTPUT_SEPARATOR
void consume_OUTPUT_SEPARATOR(std::istream &in)
libff::bls12_381_G1::to_affine_coordinates
void to_affine_coordinates()
Definition: bls12_381_g1.cpp:58
libff::bigint
Definition: bigint.hpp:20
libff::Fp12_2over3over2_model::unitary_inverse
Fp12_2over3over2_model unitary_inverse() const
libff::Fp12_2over3over2_model
Definition: fp12_2over3over2.hpp:20
libff::Fp12_2over3over2_model::cyclotomic_exp
Fp12_2over3over2_model cyclotomic_exp(const bigint< m > &exponent) const
bls12_381_pairing.hpp
libff::bls12_381_ate_precompute_G1
bls12_381_ate_G1_precomp bls12_381_ate_precompute_G1(const bls12_381_G1 &P)
Definition: bls12_381_pairing.cpp:309
libff::bls12_381_pairing
bls12_381_Fq12 bls12_381_pairing(const bls12_381_G1 &P, const bls12_381_G2 &Q)
Definition: bls12_381_pairing.cpp:522
libff::Fp_model< bls12_381_q_limbs, bls12_381_modulus_q >
libff::operator<<
std::ostream & operator<<(std::ostream &out, const alt_bn128_G1 &g)
Definition: alt_bn128_g1.cpp:436
libff::consume_OUTPUT_NEWLINE
void consume_OUTPUT_NEWLINE(std::istream &in)
bls12_381_g2.hpp
libff::bls12_381_reduced_pairing
bls12_381_GT bls12_381_reduced_pairing(const bls12_381_G1 &P, const bls12_381_G2 &Q)
Definition: bls12_381_pairing.cpp:527
libff::bls12_381_ate_G2_precomp
Definition: bls12_381_pairing.hpp:45
bls12_381_init.hpp
libff::bls12_381_ate_ell_coeffs::ell_VW
bls12_381_Fq2 ell_VW
Definition: bls12_381_pairing.hpp:35
libff::bls12_381_precompute_G2
bls12_381_G2_precomp bls12_381_precompute_G2(const bls12_381_G2 &Q)
Definition: bls12_381_pairing.cpp:502
libff::Fp2_model::squared
Fp2_model squared() const
default is squared_complex
libff::Fp2_model
Definition: fp2.hpp:18
profiling.hpp
libff::bls12_381_precompute_G1
bls12_381_G1_precomp bls12_381_precompute_G1(const bls12_381_G1 &P)
Definition: bls12_381_pairing.cpp:497
libff::leave_block
void leave_block(const std::string &msg, const bool indent)
Definition: profiling.cpp:305
libff::bls12_381_ate_precompute_G2
bls12_381_ate_G2_precomp bls12_381_ate_precompute_G2(const bls12_381_G2 &Q)
Definition: bls12_381_pairing.cpp:324
libff::bls12_381_Fq12
Fp12_2over3over2_model< bls12_381_q_limbs, bls12_381_modulus_q > bls12_381_Fq12
Definition: bls12_381_init.hpp:35
libff::Fp12_2over3over2_model::cyclotomic_squared
Fp12_2over3over2_model cyclotomic_squared() const
libff::bls12_381_ate_double_miller_loop
bls12_381_Fq12 bls12_381_ate_double_miller_loop(const bls12_381_ate_G1_precomp &prec_P1, const bls12_381_ate_G2_precomp &prec_Q1, const bls12_381_ate_G1_precomp &prec_P2, const bls12_381_ate_G2_precomp &prec_Q2)
Definition: bls12_381_pairing.cpp:415
libff::Fp12_2over3over2_model::mul_by_045
Fp12_2over3over2_model mul_by_045(const my_Fp2 &ell_0, const my_Fp2 &ell_VW, const my_Fp2 &ell_VV) const
OUTPUT_NEWLINE
#define OUTPUT_NEWLINE
Definition: serialization.hpp:68
libff::bls12_381_twist
bls12_381_Fq2 bls12_381_twist
Definition: bls12_381_init.cpp:13
libff::bls12_381_G2::X
bls12_381_Fq2 X
Definition: bls12_381_g2.hpp:45
libff::bls12_381_G1::X
bls12_381_Fq X
Definition: bls12_381_g1.hpp:44
libff::bls12_381_G2::Z
bls12_381_Fq2 Z
Definition: bls12_381_g2.hpp:45
libff::bigint::test_bit
bool test_bit(const std::size_t bitno) const
libff::bls12_381_ate_G1_precomp::PX
bls12_381_Fq PX
Definition: bls12_381_pairing.hpp:23
libff::bls12_381_miller_loop
bls12_381_Fq12 bls12_381_miller_loop(const bls12_381_G1_precomp &prec_P, const bls12_381_G2_precomp &prec_Q)
Definition: bls12_381_pairing.cpp:507
libff::bls12_381_ate_ell_coeffs::ell_VV
bls12_381_Fq2 ell_VV
Definition: bls12_381_pairing.hpp:36
libff::bls12_381_final_exponent_is_z_neg
bool bls12_381_final_exponent_is_z_neg
Definition: bls12_381_init.cpp:24
libff::Fp12_2over3over2_model::coeffs
my_Fp6 coeffs[2]
Definition: fp12_2over3over2.hpp:62
libff::consume_newline
void consume_newline(std::istream &in)
libff::bls12_381_final_exponentiation
bls12_381_GT bls12_381_final_exponentiation(const bls12_381_Fq12 &elt)
Definition: bls12_381_pairing.cpp:215
libff::bls12_381_G2::to_affine_coordinates
void to_affine_coordinates()
Definition: bls12_381_g2.cpp:75
bls12_381_g1.hpp
libff::bls12_381_G2
Definition: bls12_381_g2.hpp:21