invert method

  1. @override
JubJubFr? invert()
override

Implementation

@override
JubJubFr? invert() {
  JubJubFr squareAssignMulti(JubJubFr n, int numTimes) {
    for (int i = 0; i < numTimes; i++) {
      n = n.square();
    }
    return n;
  }

  // Initial computations
  JubJubFr t1 = square();
  JubJubFr t0 = t1.square();
  JubJubFr t3 = t0 * t1;
  JubJubFr t6 = t3 * this;
  JubJubFr t7 = t6 * t1;
  JubJubFr t12 = t7 * t3;
  JubJubFr t13 = t12 * t0;
  JubJubFr t16 = t12 * t3;
  JubJubFr t2 = t13 * t3;
  JubJubFr t15 = t16 * t3;
  JubJubFr t19 = t2 * t0;
  JubJubFr t9 = t15 * t3;
  JubJubFr t18 = t9 * t3;
  JubJubFr t14 = t18 * t1;
  JubJubFr t4 = t18 * t0;
  JubJubFr t8 = t18 * t3;
  JubJubFr t17 = t14 * t3;
  JubJubFr t11 = t8 * t3;
  t1 = t17 * t3;
  JubJubFr t5 = t11 * t3;
  t3 = t5 * t0;
  t0 = t5.square();

  // Sequence of squarings and multiplications
  t0 = squareAssignMulti(t0, 5) * t3;
  t0 = squareAssignMulti(t0, 6) * t8;
  t0 = squareAssignMulti(t0, 7) * t19;
  t0 = squareAssignMulti(t0, 6) * t13;
  t0 = squareAssignMulti(t0, 8) * t14;
  t0 = squareAssignMulti(t0, 6) * t18;
  t0 = squareAssignMulti(t0, 7) * t17;
  t0 = squareAssignMulti(t0, 5) * t16;
  t0 = squareAssignMulti(t0, 3) * this;
  t0 = squareAssignMulti(t0, 11) * t11;
  t0 = squareAssignMulti(t0, 8) * t5;
  t0 = squareAssignMulti(t0, 5) * t15;
  t0 = squareAssignMulti(t0, 8) * this;
  t0 = squareAssignMulti(t0, 12) * t13;
  t0 = squareAssignMulti(t0, 7) * t9;
  t0 = squareAssignMulti(t0, 5) * t15;
  t0 = squareAssignMulti(t0, 14) * t14;
  t0 = squareAssignMulti(t0, 5) * t13;
  t0 = squareAssignMulti(t0, 2) * this;
  t0 = squareAssignMulti(t0, 6) * this;
  t0 = squareAssignMulti(t0, 9) * t7;
  t0 = squareAssignMulti(t0, 6) * t12;
  t0 = squareAssignMulti(t0, 8) * t11;
  t0 = squareAssignMulti(t0, 3) * this;
  t0 = squareAssignMulti(t0, 12) * t9;
  t0 = squareAssignMulti(t0, 11) * t8;
  t0 = squareAssignMulti(t0, 8) * t7;
  t0 = squareAssignMulti(t0, 4) * t6;
  t0 = squareAssignMulti(t0, 10) * t5;
  t0 = squareAssignMulti(t0, 7) * t3;
  t0 = squareAssignMulti(t0, 6) * t4;
  t0 = squareAssignMulti(t0, 7) * t3;
  t0 = squareAssignMulti(t0, 5) * t2;
  t0 = squareAssignMulti(t0, 6) * t2;
  t0 = squareAssignMulti(t0, 7) * t1;

  if (this == JubJubFr.zero()) return null;
  return t0;
}