mul method

VestaFq mul(
  1. VestaFq rhs
)

Implementation

VestaFq mul(VestaFq rhs) {
  // Schoolbook multiplication
  var r0Carry = BigintUtils.mac(
    BigInt.zero,
    limbs[0],
    rhs.limbs[0],
    BigInt.zero,
  );
  var r0 = r0Carry[0];
  var carry = r0Carry[1];

  var r1Carry = BigintUtils.mac(BigInt.zero, limbs[0], rhs.limbs[1], carry);
  var r1 = r1Carry[0];
  carry = r1Carry[1];

  var r2Carry = BigintUtils.mac(BigInt.zero, limbs[0], rhs.limbs[2], carry);
  var r2 = r2Carry[0];
  carry = r2Carry[1];

  var r3Carry = BigintUtils.mac(BigInt.zero, limbs[0], rhs.limbs[3], carry);
  var r3 = r3Carry[0];
  var r4 = r3Carry[1];

  // Second row
  r1Carry = BigintUtils.mac(r1, limbs[1], rhs.limbs[0], BigInt.zero);
  r1 = r1Carry[0];
  carry = r1Carry[1];

  r2Carry = BigintUtils.mac(r2, limbs[1], rhs.limbs[1], carry);
  r2 = r2Carry[0];
  carry = r2Carry[1];

  r3Carry = BigintUtils.mac(r3, limbs[1], rhs.limbs[2], carry);
  r3 = r3Carry[0];
  carry = r3Carry[1];

  var r4Carry = BigintUtils.mac(r4, limbs[1], rhs.limbs[3], carry);
  r4 = r4Carry[0];
  var r5 = r4Carry[1];

  // Third row
  r2Carry = BigintUtils.mac(r2, limbs[2], rhs.limbs[0], BigInt.zero);
  r2 = r2Carry[0];
  carry = r2Carry[1];

  r3Carry = BigintUtils.mac(r3, limbs[2], rhs.limbs[1], carry);
  r3 = r3Carry[0];
  carry = r3Carry[1];

  r4Carry = BigintUtils.mac(r4, limbs[2], rhs.limbs[2], carry);
  r4 = r4Carry[0];
  carry = r4Carry[1];

  var r5Carry = BigintUtils.mac(r5, limbs[2], rhs.limbs[3], carry);
  r5 = r5Carry[0];
  var r6 = r5Carry[1];

  // Fourth row
  r3Carry = BigintUtils.mac(r3, limbs[3], rhs.limbs[0], BigInt.zero);
  r3 = r3Carry[0];
  carry = r3Carry[1];

  r4Carry = BigintUtils.mac(r4, limbs[3], rhs.limbs[1], carry);
  r4 = r4Carry[0];
  carry = r4Carry[1];

  r5Carry = BigintUtils.mac(r5, limbs[3], rhs.limbs[2], carry);
  r5 = r5Carry[0];
  carry = r5Carry[1];

  var r6Carry = BigintUtils.mac(r6, limbs[3], rhs.limbs[3], carry);
  r6 = r6Carry[0];
  var r7 = r6Carry[1];

  return VestaFq.montgomeryReduce(r0, r1, r2, r3, r4, r5, r6, r7);
}