コード例 #1
0
        /// <summary>
        /// Miller-Rabin test
        /// </summary>
        /// <param name="n">number to check</param>
        /// <param name="k">number of checks</param>
        /// <returns>true - probably prime, false - not prime</returns>
        public static bool MillerRabin(BigInteger n, BigInteger k)
        {
            BigInteger s  = 0;
            BigInteger s2 = 1;
            int        r;
            BigInteger a, d, i, prime;
            Random     rand = new Random();

            if (n < 4)
            {
                return(true);
            }
            if (n % 2 == 0)
            {
                return(false);
            }

            // calculate s and d
            while ((s2 & (n - 1)) == 0)
            {
                s   += 1;
                s2 <<= 1;
            }
            d = n / s2;

            // try k times
            for (i = 0; i < k; i++)
            {
                a = NumberConverter.BitsArraystoString(ng.GetNumber(128)) + 1;
                if (power_modulo_fast(a, d, n) != 1)
                {
                    prime = 0;
                    for (r = 0; r <= s - 1; r++)
                    {
                        if (power_modulo_fast(a, powerOf2[r] * d, n) == n - 1)
                        {
                            prime = 1;
                            break;
                        }
                    }
                    if (prime == 0)
                    {
                        return(false);
                    }
                }
            }

            return(true);
        }
コード例 #2
0
        public static int[] GenerateMessage()
        {
            NumberGenerator ngg = new NumberGenerator();

            return(ngg.GetNumber(128));
        }