Ejemplo n.º 1
0
        public static void Reduce32(uint x, uint[] z)
        {
            long cc = 0;

            if (x != 0)
            {
                long xx12 = x;

                cc  += (long)z[0] + xx12;
                z[0] = (uint)cc;
                cc >>= 32;
                cc  += (long)z[1] - xx12;
                z[1] = (uint)cc;
                cc >>= 32;
                if (cc != 0)
                {
                    cc  += (long)z[2];
                    z[2] = (uint)cc;
                    cc >>= 32;
                }
                cc  += (long)z[3] + xx12;
                z[3] = (uint)cc;
                cc >>= 32;
                cc  += (long)z[4] + xx12;
                z[4] = (uint)cc;
                cc >>= 32;

                Debug.Assert(cc == 0 || cc == 1);
            }

            if ((cc != 0 && Nat.IncAt(12, z, 5) != 0) ||
                (z[11] == P11 && Nat.Gte(12, z, P)))
            {
                AddPInvTo(z);
            }
        }
Ejemplo n.º 2
0
        public static void Reduce32(uint x, uint[] z)
        {
            long num = 0L;

            if (x != 0)
            {
                long num2 = x;
                num  += z[0] + num2;
                z[0]  = (uint)num;
                num >>= 32;
                num  += z[1] - num2;
                z[1]  = (uint)num;
                num >>= 32;
                if (num != 0L)
                {
                    num  += z[2];
                    z[2]  = (uint)num;
                    num >>= 32;
                }
                num  += z[3] + num2;
                z[3]  = (uint)num;
                num >>= 32;
                num  += z[4] + num2;
                z[4]  = (uint)num;
                num >>= 32;
            }
            if ((num != 0L && Nat.IncAt(12, z, 5) != 0) || (z[11] == uint.MaxValue && Nat.Gte(12, z, P)))
            {
                AddPInvTo(z);
            }
        }
Ejemplo n.º 3
0
    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);
    }
Ejemplo n.º 4
0
        public static void Reduce32(uint x, uint[] z)
        {
            long num = 0L;

            if (x != 0)
            {
                long num2 = x;
                num  = ((long)((ulong)num)) + (z[0] + num2);
                z[0] = (uint)num;
                num  = num >> 0x20;
                num  = ((long)((ulong)num)) + (z[1] - num2);
                z[1] = (uint)num;
                num  = num >> 0x20;
                if (num != 0L)
                {
                    num += z[2];
                    z[2] = (uint)num;
                    num  = num >> 0x20;
                }
                num  = ((long)((ulong)num)) + (z[3] + num2);
                z[3] = (uint)num;
                num  = num >> 0x20;
                num  = ((long)((ulong)num)) + (z[4] + num2);
                z[4] = (uint)num;
                num  = num >> 0x20;
            }
            if (((num != 0L) && (Nat.IncAt(12, z, 5) != 0)) || ((z[11] == uint.MaxValue) && Nat.Gte(12, z, P)))
            {
                AddPInvTo(z);
            }
        }