private static Fq12 millerLoop(final AltBn128Fq12Point p, final AltBn128Fq12Point q) {
    if (p.isInfinity() || q.isInfinity()) {
      return Fq12.one();
    }

    AltBn128Fq12Point r = q;
    Fq12 f = Fq12.one();
    for (int i = LOG_ATE_LOOP_COUNT; i >= 0; --i) {
      f = f.multiply(f).multiply(lineFunc(r, r, p));
      r = r.doub();
      if (ATE_LOOP_COUNT.testBit(i)) {
        f = f.multiply(lineFunc(r, q, p));
        r = r.add(q);
      }
    }

    final AltBn128Fq12Point q1 =
        new AltBn128Fq12Point(
            q.getX().power(FieldElement.FIELD_MODULUS), q.getY().power(FieldElement.FIELD_MODULUS));
    final AltBn128Fq12Point nQ2 =
        new AltBn128Fq12Point(
            q1.getX().power(FieldElement.FIELD_MODULUS),
            q1.getY().negate().power(FieldElement.FIELD_MODULUS));
    f = f.multiply(lineFunc(r, q1, p));
    r = r.add(q1);
    f = f.multiply(lineFunc(r, nQ2, p));

    return f;
  }
Pair fq 12.

@param p the p
@param q the q
@return the fq 12
crypto/algorithms/src/main/java/org/hyperledger/besu/crypto/altbn128/AltBn128Fq12Pairer.java