sub method

JubJubFr sub(
  1. JubJubFr rhs
)

Implementation

JubJubFr sub(JubJubFr rhs) {
  final x0 = limbs[0];
  final x1 = limbs[1];
  final x2 = limbs[2];
  final x3 = limbs[3];

  final y0 = rhs.limbs[0];
  final y1 = rhs.limbs[1];
  final y2 = rhs.limbs[2];
  final y3 = rhs.limbs[3];

  // ----------- First SBB chain -----------
  List<BigInt> t = BigintUtils.sbb(x0, y0, BigInt.zero);
  BigInt d0 = t[0];
  BigInt borrow = t[1];

  t = BigintUtils.sbb(x1, y1, borrow);
  BigInt d1 = t[0];
  borrow = t[1];

  t = BigintUtils.sbb(x2, y2, borrow);
  BigInt d2 = t[0];
  borrow = t[1];

  t = BigintUtils.sbb(x3, y3, borrow);
  BigInt d3 = t[0];
  borrow = t[1];

  t = BigintUtils.adc(
    d0,
    JubJubFrConst.modulus.limbs[0] & borrow,
    BigInt.zero,
  );
  d0 = t[0];
  BigInt carry = t[1];

  t = BigintUtils.adc(d1, JubJubFrConst.modulus.limbs[1] & borrow, carry);
  d1 = t[0];
  carry = t[1];

  t = BigintUtils.adc(d2, JubJubFrConst.modulus.limbs[2] & borrow, carry);
  d2 = t[0];
  carry = t[1];

  t = BigintUtils.adc(d3, JubJubFrConst.modulus.limbs[3] & borrow, carry);
  d3 = t[0];

  return JubJubFr([d0, d1, d2, d3]);
}