public static void Square(uint[] x, uint[] z) { uint[] tt = Nat192.CreateExt(); Nat192.Square(x, tt); Reduce(tt, z); }
public static void Multiply(uint[] x, uint[] y, uint[] z) { uint[] tt = Nat192.CreateExt(); Nat192.Mul(x, y, tt); Reduce(tt, z); }
public static void Reduce(uint[] xx, uint[] z) { ulong xx06 = xx[6], xx07 = xx[7], xx08 = xx[8]; ulong xx09 = xx[9], xx10 = xx[10], xx11 = xx[11]; ulong t0 = xx06 + xx10; ulong t1 = xx07 + xx11; ulong cc = 0; cc += (ulong)xx[0] + t0; uint z0 = (uint)cc; cc >>= 32; cc += (ulong)xx[1] + t1; z[1] = (uint)cc; cc >>= 32; t0 += xx08; t1 += xx09; cc += (ulong)xx[2] + t0; ulong z2 = (uint)cc; cc >>= 32; cc += (ulong)xx[3] + t1; z[3] = (uint)cc; cc >>= 32; t0 -= xx06; t1 -= xx07; cc += (ulong)xx[4] + t0; z[4] = (uint)cc; cc >>= 32; cc += (ulong)xx[5] + t1; z[5] = (uint)cc; cc >>= 32; z2 += cc; cc += z0; z[0] = (uint)cc; cc >>= 32; if (cc != 0) { cc += z[1]; z[1] = (uint)cc; z2 += cc >> 32; } z[2] = (uint)z2; cc = z2 >> 32; Debug.Assert(cc == 0 || cc == 1); if ((cc != 0 && Nat.IncAt(6, z, 3) != 0) || (z[5] == P5 && Nat192.Gte(z, P))) { AddPInvTo(z); } }