sub method
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]);
}