feSq2 static method

void feSq2(
  1. FieldElement h,
  2. FieldElement f
)

Implementation

static void feSq2(FieldElement h, FieldElement f) {
  final int f0 = f.h[0];
  final int f1 = f.h[1];
  final int f2 = f.h[2];
  final int f3 = f.h[3];
  final int f4 = f.h[4];
  final int f5 = f.h[5];
  final int f6 = f.h[6];
  final int f7 = f.h[7];
  final int f8 = f.h[8];
  final int f9 = f.h[9];
  final int f0_2 = (2 * f0).toSigned32;
  final int f1_2 = (2 * f1).toSigned32;
  final int f2_2 = (2 * f2).toSigned32;
  final int f3_2 = (2 * f3).toSigned32;
  final int f4_2 = (2 * f4).toSigned32;
  final int f5_2 = (2 * f5).toSigned32;
  final int f6_2 = (2 * f6).toSigned32;
  final int f7_2 = (2 * f7).toSigned32;
  final int f5_38 = (38 * f5).toSigned32; /* 1.959375*2^30 */
  final int f6_19 = (19 * f6).toSigned32; /* 1.959375*2^30 */
  final int f7_38 = (38 * f7).toSigned32; /* 1.959375*2^30 */
  final int f8_19 = (19 * f8).toSigned32; /* 1.959375*2^30 */
  final int f9_38 = (38 * f9).toSigned32; /* 1.959375*2^30 */
  final BigInt f0f0 = f0.toBigInt * f0.toBigInt;

  final BigInt f0f1_2 = f0_2.toBigInt * f1.toBigInt;
  final BigInt f0f2_2 = f0_2.toBigInt * f2.toBigInt;
  final BigInt f0f3_2 = f0_2.toBigInt * f3.toBigInt;
  final BigInt f0f4_2 = f0_2.toBigInt * f4.toBigInt;
  final BigInt f0f5_2 = f0_2.toBigInt * f5.toBigInt;
  final BigInt f0f6_2 = f0_2.toBigInt * f6.toBigInt;
  final BigInt f0f7_2 = f0_2.toBigInt * f7.toBigInt;
  final BigInt f0f8_2 = f0_2.toBigInt * f8.toBigInt;
  final BigInt f0f9_2 = f0_2.toBigInt * f9.toBigInt;
  final BigInt f1f1_2 = f1_2.toBigInt * f1.toBigInt;
  final BigInt f1f2_2 = f1_2.toBigInt * f2.toBigInt;
  final BigInt f1f3_4 = f1_2.toBigInt * f3_2.toBigInt;
  final BigInt f1f4_2 = f1_2.toBigInt * f4.toBigInt;
  final BigInt f1f5_4 = f1_2.toBigInt * f5_2.toBigInt;
  final BigInt f1f6_2 = f1_2.toBigInt * f6.toBigInt;
  final BigInt f1f7_4 = f1_2.toBigInt * f7_2.toBigInt;
  final BigInt f1f8_2 = f1_2.toBigInt * f8.toBigInt;
  final BigInt f1f9_76 = f1_2.toBigInt * f9_38.toBigInt;
  final BigInt f2f2 = f2.toBigInt * f2.toBigInt;
  final BigInt f2f3_2 = f2_2.toBigInt * f3.toBigInt;
  final BigInt f2f4_2 = f2_2.toBigInt * f4.toBigInt;
  final BigInt f2f5_2 = f2_2.toBigInt * f5.toBigInt;
  final BigInt f2f6_2 = f2_2.toBigInt * f6.toBigInt;
  final BigInt f2f7_2 = f2_2.toBigInt * f7.toBigInt;
  final BigInt f2f8_38 = f2_2.toBigInt * f8_19.toBigInt;
  final BigInt f2f9_38 = f2.toBigInt * f9_38.toBigInt;
  final BigInt f3f3_2 = f3_2.toBigInt * f3.toBigInt;
  final BigInt f3f4_2 = f3_2.toBigInt * f4.toBigInt;
  final BigInt f3f5_4 = f3_2.toBigInt * f5_2.toBigInt;
  final BigInt f3f6_2 = f3_2.toBigInt * f6.toBigInt;
  final BigInt f3f7_76 = f3_2.toBigInt * f7_38.toBigInt;
  final BigInt f3f8_38 = f3_2.toBigInt * f8_19.toBigInt;
  final BigInt f3f9_76 = f3_2.toBigInt * f9_38.toBigInt;
  final BigInt f4f4 = f4.toBigInt * f4.toBigInt;
  final BigInt f4f5_2 = f4_2.toBigInt * f5.toBigInt;
  final BigInt f4f6_38 = f4_2.toBigInt * f6_19.toBigInt;
  final BigInt f4f7_38 = f4.toBigInt * f7_38.toBigInt;
  final BigInt f4f8_38 = f4_2.toBigInt * f8_19.toBigInt;
  final BigInt f4f9_38 = f4.toBigInt * f9_38.toBigInt;
  final BigInt f5f5_38 = f5.toBigInt * f5_38.toBigInt;
  final BigInt f5f6_38 = f5_2.toBigInt * f6_19.toBigInt;
  final BigInt f5f7_76 = f5_2.toBigInt * f7_38.toBigInt;
  final BigInt f5f8_38 = f5_2.toBigInt * f8_19.toBigInt;
  final BigInt f5f9_76 = f5_2.toBigInt * f9_38.toBigInt;
  final BigInt f6f6_19 = f6.toBigInt * f6_19.toBigInt;
  final BigInt f6f7_38 = f6.toBigInt * f7_38.toBigInt;
  final BigInt f6f8_38 = f6_2.toBigInt * f8_19.toBigInt;
  final BigInt f6f9_38 = f6.toBigInt * f9_38.toBigInt;
  final BigInt f7f7_38 = f7.toBigInt * f7_38.toBigInt;
  final BigInt f7f8_38 = f7_2.toBigInt * f8_19.toBigInt;
  final BigInt f7f9_76 = f7_2.toBigInt * f9_38.toBigInt;
  final BigInt f8f8_19 = f8.toBigInt * f8_19.toBigInt;
  final BigInt f8f9_38 = f8.toBigInt * f9_38.toBigInt;
  final BigInt f9f9_38 = f9.toBigInt * f9_38.toBigInt;
  BigInt h0 = f0f0 + f1f9_76 + f2f8_38 + f3f7_76 + f4f6_38 + f5f5_38;
  BigInt h1 = f0f1_2 + f2f9_38 + f3f8_38 + f4f7_38 + f5f6_38;
  BigInt h2 = f0f2_2 + f1f1_2 + f3f9_76 + f4f8_38 + f5f7_76 + f6f6_19;
  BigInt h3 = f0f3_2 + f1f2_2 + f4f9_38 + f5f8_38 + f6f7_38;
  BigInt h4 = f0f4_2 + f1f3_4 + f2f2 + f5f9_76 + f6f8_38 + f7f7_38;
  BigInt h5 = f0f5_2 + f1f4_2 + f2f3_2 + f6f9_38 + f7f8_38;
  BigInt h6 = f0f6_2 + f1f5_4 + f2f4_2 + f3f3_2 + f7f9_76 + f8f8_19;
  BigInt h7 = f0f7_2 + f1f6_2 + f2f5_2 + f3f4_2 + f8f9_38;
  BigInt h8 = f0f8_2 + f1f7_4 + f2f6_2 + f3f5_4 + f4f4 + f9f9_38;
  BigInt h9 = f0f9_2 + f1f8_2 + f2f7_2 + f3f6_2 + f4f5_2;
  BigInt carry0;
  BigInt carry1;
  BigInt carry2;
  BigInt carry3;
  BigInt carry4;
  BigInt carry5;
  BigInt carry6;
  BigInt carry7;
  BigInt carry8;
  BigInt carry9;

  h0 += h0;
  h1 += h1;
  h2 += h2;
  h3 += h3;
  h4 += h4;
  h5 += h5;
  h6 += h6;
  h7 += h7;
  h8 += h8;
  h9 += h9;

  carry0 = (h0 + _bitMaskFor25) >> 26;
  h1 += carry0;
  h0 -= carry0 << 26;
  carry4 = (h4 + _bitMaskFor25) >> 26;
  h5 += carry4;
  h4 -= carry4 << 26;

  carry1 = (h1 + _bitMaskFor24) >> 25;
  h2 += carry1;
  h1 -= carry1 << 25;
  carry5 = (h5 + _bitMaskFor24) >> 25;
  h6 += carry5;
  h5 -= carry5 << 25;

  carry2 = (h2 + _bitMaskFor25) >> 26;
  h3 += carry2;
  h2 -= carry2 << 26;
  carry6 = (h6 + _bitMaskFor25) >> 26;
  h7 += carry6;
  h6 -= carry6 << 26;

  carry3 = (h3 + _bitMaskFor24) >> 25;
  h4 += carry3;
  h3 -= carry3 << 25;
  carry7 = (h7 + _bitMaskFor24) >> 25;
  h8 += carry7;
  h7 -= carry7 << 25;

  carry4 = (h4 + _bitMaskFor25) >> 26;
  h5 += carry4;
  h4 -= carry4 << 26;
  carry8 = (h8 + _bitMaskFor25) >> 26;
  h9 += carry8;
  h8 -= carry8 << 26;

  carry9 = (h9 + _bitMaskFor24) >> 25;
  h0 += carry9 * BigInt.from(19);
  h9 -= carry9 << 25;

  carry0 = (h0 + _bitMaskFor25) >> 26;
  h1 += carry0;
  h0 -= carry0 << 26;

  h.h[0] = h0.toSignedInt32;
  h.h[1] = h1.toSignedInt32;
  h.h[2] = h2.toSignedInt32;
  h.h[3] = h3.toSignedInt32;
  h.h[4] = h4.toSignedInt32;
  h.h[5] = h5.toSignedInt32;
  h.h[6] = h6.toSignedInt32;
  h.h[7] = h7.toSignedInt32;
  h.h[8] = h8.toSignedInt32;
  h.h[9] = h9.toSignedInt32;
}