Пример #1
0
 public static void Square(uint[] x, uint[] z)
 {
     uint[] tt = Nat192.CreateExt();
     Nat192.Square(x, tt);
     Reduce(tt, z);
 }
Пример #2
0
 public static void Multiply(uint[] x, uint[] y, uint[] z)
 {
     uint[] tt = Nat192.CreateExt();
     Nat192.Mul(x, y, tt);
     Reduce(tt, z);
 }
Пример #3
0
        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);
            }
        }