Example #1
0
    private static void InversionStep(uint[] p, uint[] u, int uLen, uint[] x, ref int xc)
    {
        int len = p.Length;
        int num = 0;

        while (u[0] == 0)
        {
            Nat.ShiftDownWord(uLen, u, 0u);
            num += 32;
        }
        int trailingZeroes = GetTrailingZeroes(u[0]);

        if (trailingZeroes > 0)
        {
            Nat.ShiftDownBits(uLen, u, trailingZeroes, 0u);
            num += trailingZeroes;
        }
        for (int i = 0; i < num; i++)
        {
            if ((x[0] & 1) != 0)
            {
                if (xc < 0)
                {
                    xc += (int)Nat.AddTo(len, p, x);
                }
                else
                {
                    xc += Nat.SubFrom(len, p, x);
                }
            }
            Nat.ShiftDownBit(len, x, (uint)xc);
        }
    }
Example #2
0
        private static int Legendre(BigInteger a, BigInteger b)
        {
            //int r = 0, bits = b.IntValue;

            //for (;;)
            //{
            //    int lowestSetBit = a.GetLowestSetBit();
            //    a = a.ShiftRight(lowestSetBit);
            //    r ^= (bits ^ (bits >> 1)) & (lowestSetBit << 1);

            //    int cmp = a.CompareTo(b);
            //    if (cmp == 0)
            //        break;

            //    if (cmp < 0)
            //    {
            //        BigInteger t = a; a = b; b = t;

            //        int oldBits = bits;
            //        bits = b.IntValue;
            //        r ^= oldBits & bits;
            //    }

            //    a = a.Subtract(b);
            //}

            //return BigInteger.One.Equals(b) ? (1 - (r & 2)) : 0;

            int bitLength = b.BitLength;

            uint[] A = Nat.FromBigInteger(bitLength, a);
            uint[] B = Nat.FromBigInteger(bitLength, b);

            int r = 0;

            int len = B.Length;

            for (;;)
            {
                while (A[0] == 0)
                {
                    Nat.ShiftDownWord(len, A, 0);
                }

                int shift = Integers.NumberOfTrailingZeros((int)A[0]);
                if (shift > 0)
                {
                    Nat.ShiftDownBits(len, A, shift, 0);
                    int bits = (int)B[0];
                    r ^= (bits ^ (bits >> 1)) & (shift << 1);
                }

                int cmp = Nat.Compare(len, A, B);
                if (cmp == 0)
                {
                    break;
                }

                if (cmp < 0)
                {
                    r ^= (int)(A[0] & B[0]);
                    uint[] t = A; A = B; B = t;
                }

                while (A[len - 1] == 0)
                {
                    len = len - 1;
                }

                Nat.Sub(len, A, B, A);
            }

            return(Nat.IsOne(len, B) ? (1 - (r & 2)) : 0);
        }