neg method

PallasFp neg()

Implementation

PallasFp neg() {
  // Compute modulus - self
  var r0 = BigintUtils.sbb(
    PallasFPConst.modulus.limbs[0],
    limbs[0],
    BigInt.zero,
  );
  var d0 = r0[0];
  var borrow = r0[1];

  var r1 = BigintUtils.sbb(PallasFPConst.modulus.limbs[1], limbs[1], borrow);
  var d1 = r1[0];
  borrow = r1[1];

  var r2 = BigintUtils.sbb(PallasFPConst.modulus.limbs[2], limbs[2], borrow);
  var d2 = r2[0];
  borrow = r2[1];

  var r3 = BigintUtils.sbb(PallasFPConst.modulus.limbs[3], limbs[3], borrow);
  var d3 = r3[0];
  // final borrow ignored (same as Rust)

  // mask = 0xffff...ffff if self != 0
  // mask = 0x0000...0000 if self == 0
  final BigInt orAll = limbs[0] | limbs[1] | limbs[2] | limbs[3];

  // ((orAll == 0) ? 1 : 0) - 1  →  0 or -1
  BigInt mask =
      ((orAll == BigInt.zero ? BigInt.one : BigInt.zero) - BigInt.one).toU64;

  return PallasFp([d0 & mask, d1 & mask, d2 & mask, d3 & mask]);
}