コード例 #1
0
        public bool Fermat(Int64 n, Int64 accuracy = 100)
        {
            if (n < 1)
            {
                throw new ArgumentException("The number must be natural");
            }

            if (n == 1 || n == 2)
            {
                return(true);
            }

            Random rnd     = new Random();
            bool   isPrime = true;

            for (Int64 i = 0; i < accuracy; ++i)
            {
                Int64 a = rnd.Next(2, (int)n);
                if ((BinaryMath.Gcd(n, a) != 1 && !(BinaryMath.Gcd(n, a) == n)) ||
                    BinaryMath.PowByModulo(a, n - 1, n) != 1)
                {
                    isPrime = false;
                    break;
                }
            }
            return(isPrime);
        }
コード例 #2
0
        public bool SolovayStrassen(Int64 n, Int64 accuracy = 1)
        {
            if (n < 1)
            {
                throw new ArgumentException("The number must be natural");
            }

            if (n == 1 || n == 2)
            {
                return(true);
            }

            Random rnd     = new Random();
            bool   isPrime = true;

            for (Int64 i = 1; i <= accuracy; ++i)
            {
                Int64 a   = rnd.Next(2, (int)n + 1);
                long  lez = SymbolLegendre.Calculate(a, n);
                if (lez == -1)
                {
                    lez += n;
                }

                if (BinaryMath.Gcd(a, n) > 1 || BinaryMath.PowByModulo(a, (n - 1) / 2, n) % n != lez)
                {
                    isPrime = false;
                    break;
                }
            }
            return(isPrime);
        }