public static void SubtractExt(uint[] xx, uint[] yy, uint[] zz) { int c = Nat.Sub(14, xx, yy, zz); if (c != 0) { if (Nat.SubFrom(PExtInv.Length, PExtInv, zz) != 0) { Nat.DecAt(14, zz, PExtInv.Length); } } }
public static void Square(uint[] x, uint[] zz) { Nat256.Square(x, zz); Nat256.Square(x, 8, zz, 16); uint num = Nat256.AddToEachOther(zz, 8, zz, 16); uint cIn = num + Nat256.AddTo(zz, 0, zz, 8, 0u); num += Nat256.AddTo(zz, 24, zz, 16, cIn); uint[] array = Nat256.Create(); Nat256.Diff(x, 8, x, 0, array, 0); uint[] array2 = Nat256.CreateExt(); Nat256.Square(array, array2); num = (uint)((int)num + Nat.SubFrom(16, array2, 0, zz, 8)); Nat.AddWordAt(32, num, zz, 24); }
public static void Square(uint[] x, uint[] zz) { Nat192.Square(x, zz); Nat192.Square(x, 6, zz, 12); uint num = Nat192.AddToEachOther(zz, 6, zz, 12); uint cIn = num + Nat192.AddTo(zz, 0, zz, 6, 0u); num += Nat192.AddTo(zz, 18, zz, 12, cIn); uint[] array = Nat192.Create(); Nat192.Diff(x, 6, x, 0, array, 0); uint[] array2 = Nat192.CreateExt(); Nat192.Square(array, array2); num += (uint)Nat.SubFrom(12, array2, 0, zz, 6); Nat.AddWordAt(24, num, zz, 18); }
public static void Mul(uint[] x, uint[] y, uint[] zz) { Nat256.Mul(x, y, zz); Nat256.Mul(x, 8, y, 8, zz, 16); uint num = Nat256.AddToEachOther(zz, 8, zz, 16); uint cIn = num + Nat256.AddTo(zz, 0, zz, 8, 0u); num += Nat256.AddTo(zz, 24, zz, 16, cIn); uint[] array = Nat256.Create(); uint[] array2 = Nat256.Create(); bool flag = Nat256.Diff(x, 8, x, 0, array, 0) != Nat256.Diff(y, 8, y, 0, array2, 0); uint[] array3 = Nat256.CreateExt(); Nat256.Mul(array, array2, array3); num = (uint)((int)num + ((!flag) ? Nat.SubFrom(16, array3, 0, zz, 8) : ((int)Nat.AddTo(16, array3, 0, zz, 8)))); Nat.AddWordAt(32, num, zz, 24); }
public static void Mul(uint[] x, uint[] y, uint[] zz) { Nat192.Mul(x, y, zz); Nat192.Mul(x, 6, y, 6, zz, 12); uint num = Nat192.AddToEachOther(zz, 6, zz, 12); uint cIn = num + Nat192.AddTo(zz, 0, zz, 6, 0u); num += Nat192.AddTo(zz, 18, zz, 12, cIn); uint[] array = Nat192.Create(); uint[] array2 = Nat192.Create(); bool flag = Nat192.Diff(x, 6, x, 0, array, 0) != Nat192.Diff(y, 6, y, 0, array2, 0); uint[] array3 = Nat192.CreateExt(); Nat192.Mul(array, array2, array3); num += (uint)(flag ? ((int)Nat.AddTo(12, array3, 0, zz, 6)) : Nat.SubFrom(12, array3, 0, zz, 6)); Nat.AddWordAt(24, num, zz, 18); }
public static void Mul(uint[] x, uint[] y, uint[] zz) { Nat192.Mul(x, y, zz); Nat192.Mul(x, 6, y, 6, zz, 12); uint c18 = Nat192.AddToEachOther(zz, 6, zz, 12); uint c12 = c18 + Nat192.AddTo(zz, 0, zz, 6, 0); c18 += Nat192.AddTo(zz, 18, zz, 12, c12); uint[] dx = Nat192.Create(), dy = Nat192.Create(); bool neg = Nat192.Diff(x, 6, x, 0, dx, 0) != Nat192.Diff(y, 6, y, 0, dy, 0); uint[] tt = Nat192.CreateExt(); Nat192.Mul(dx, dy, tt); c18 += neg ? Nat.AddTo(12, tt, 0, zz, 6) : (uint)Nat.SubFrom(12, tt, 0, zz, 6); Nat.AddWordAt(24, c18, zz, 18); }
public static void Square(uint[] x, uint[] zz) { Nat192.Square(x, zz); Nat192.Square(x, 6, zz, 12); uint c18 = Nat192.AddToEachOther(zz, 6, zz, 12); uint c12 = c18 + Nat192.AddTo(zz, 0, zz, 6, 0); c18 += Nat192.AddTo(zz, 18, zz, 12, c12); uint[] dx = Nat192.Create(); Nat192.Diff(x, 6, x, 0, dx, 0); uint[] m = Nat192.CreateExt(); Nat192.Square(dx, m); c18 += (uint)Nat.SubFrom(12, m, 0, zz, 6); Nat.AddWordAt(24, c18, zz, 18); }
public static void Mul(uint[] x, uint[] y, uint[] zz) { Nat256.Mul(x, y, zz); Nat256.Mul(x, 8, y, 8, zz, 16); uint c24 = Nat256.AddToEachOther(zz, 8, zz, 16); uint c16 = c24 + Nat256.AddTo(zz, 0, zz, 8, 0); c24 += Nat256.AddTo(zz, 24, zz, 16, c16); uint[] dx = Nat256.Create(), dy = Nat256.Create(); bool neg = Nat256.Diff(x, 8, x, 0, dx, 0) != Nat256.Diff(y, 8, y, 0, dy, 0); uint[] tt = Nat256.CreateExt(); Nat256.Mul(dx, dy, tt); c24 += neg ? Nat.AddTo(16, tt, 0, zz, 8) : (uint)Nat.SubFrom(16, tt, 0, zz, 8); Nat.AddWordAt(32, c24, zz, 24); }
public static void Square(uint[] x, uint[] zz) { Nat256.Square(x, zz); Nat256.Square(x, 8, zz, 16); uint c24 = Nat256.AddToEachOther(zz, 8, zz, 16); uint c16 = c24 + Nat256.AddTo(zz, 0, zz, 8, 0); c24 += Nat256.AddTo(zz, 24, zz, 16, c16); uint[] dx = Nat256.Create(); Nat256.Diff(x, 8, x, 0, dx, 0); uint[] m = Nat256.CreateExt(); Nat256.Square(dx, m); c24 += (uint)Nat.SubFrom(16, m, 0, zz, 8); Nat.AddWordAt(32, c24, zz, 24); }
public static void Invert(uint[] p, uint[] x, uint[] z) { int num = p.Length; if (Nat.IsZero(num, x)) { throw new ArgumentException("cannot be 0", "x"); } if (Nat.IsOne(num, x)) { Array.Copy(x, 0, z, 0, num); return; } uint[] array = Nat.Copy(num, x); uint[] array2 = Nat.Create(num); array2[0] = 1u; int xc = 0; if ((array[0] & 1) == 0) { InversionStep(p, array, num, array2, ref xc); } if (Nat.IsOne(num, array)) { InversionResult(p, xc, array2, z); return; } uint[] array3 = Nat.Copy(num, p); uint[] array4 = Nat.Create(num); int xc2 = 0; int num2 = num; while (true) { if (array[num2 - 1] == 0 && array3[num2 - 1] == 0) { num2--; } else if (Nat.Gte(num, array, array3)) { Nat.SubFrom(num, array3, array); xc += Nat.SubFrom(num, array4, array2) - xc2; InversionStep(p, array, num2, array2, ref xc); if (Nat.IsOne(num, array)) { InversionResult(p, xc, array2, z); return; } } else { Nat.SubFrom(num, array, array3); xc2 += Nat.SubFrom(num, array2, array4) - xc; InversionStep(p, array3, num2, array4, ref xc2); if (Nat.IsOne(num, array3)) { break; } } } InversionResult(p, xc2, array4, z); }