Exemplo n.º 1
0
        /// <summary>
        /// Uses the fermat test a given amount of times to test whether or not a supplied interger is probably prime.
        /// </summary>
        /// <param name="b">Value to test primality of</param>
        /// <param name="provider">Random provider used to generate values to test b against</param>
        /// <param name="certainty">How many times the test should be performed. More iterations means higher certainty, but at the cost of performance!</param>
        /// <returns>Whether or not the given value is probably prime or not</returns>
        public static bool IsProbablePrime(BigInteger b, RandomProvider provider, int certainty)
        {
            BigInteger e = b - 1;

            byte[] b1   = b.ToByteArray();
            byte   last = b1[b1.Length - 1];
            int    len  = b1.Length - 1;

            for (int i = 0; i < certainty; ++i)
            {
                byte[] gen = new byte[provider.NextInt(len) + 1];
                provider.GetBytes(gen);
                if (last != 0 && gen.Length == len + 1)
                {
                    gen[gen.Length - 1] %= last;
                }
                else
                {
                    gen[gen.Length - 1] &= 127;
                }

                BigInteger test = new BigInteger(gen);
                if (ModExp(test, e, b) != 1)
                {
                    return(false);
                }
            }
            return(true);
        }