public static void Add(uint[] x, uint[] y, uint[] z) { Nat256.Add(x, y, z); if (Nat256.Gte(z, P)) { Nat256.AddWord(PInv, z, 0); z[7] &= P7; } }
public static void Twice(uint[] x, uint[] z) { Nat256.ShiftUpBit(x, 0, z); if (Nat256.Gte(z, P)) { Nat256.AddWord(PInv, z, 0); z[7] &= P7; } }
public static uint[] FromBigInteger(BigInteger x) { uint[] z = Nat256.FromBigInteger(x); if (Nat256.Gte(z, P)) { Nat256.AddWord(PInv, z, 0); z[7] &= P7; } return(z); }
public static void AddOne(uint[] x, uint[] z) { Nat256.Copy(x, z); Nat256.Inc(z, 0); if (Nat256.Gte(z, P)) { Nat256.AddWord(PInv, z, 0); z[7] &= P7; } }
public static void Reduce(uint[] xx, uint[] z) { Debug.Assert(xx[15] >> 30 == 0); uint xx07 = xx[7]; Nat.ShiftUpBit(8, xx, 8, xx07, z); uint c = Nat256.MulByWordAddTo(PInv, xx, z) << 1; uint z07 = z[7]; z[7] = z07 & P7; c += (z07 >> 31) - (xx07 >> 31); Nat256.AddWord(c * PInv, z, 0); if (Nat256.Gte(z, P)) { Nat256.AddWord(PInv, z, 0); z[7] &= P7; } }