예제 #1
0
            public bool IsPrime(PrimeType N, int accuracy)
            {
                var NMinus1 = N - 1;

                if ((NMinus1 % 6 != 0) && ((N + 1) % 6 != 0))
                {
                    return(false);
                }

                var factors   = Power2Factorizer.Factorize(NMinus1);
                var witnesses = WitnessProvider.GetRandomWitnesses(N, accuracy);

                for (var i = 0; i < accuracy; i++)
                {
                    var a = witnesses[i];
                    var x = BigInteger.ModPow(a, factors.d, N);
                    if (x == 1 || x == NMinus1)
                    {
                        continue;
                    }
                    for (var r = 1; r < factors.s; r++)
                    {
                        x = BigInteger.ModPow(x, 2, N);
                        if (x == NMinus1)
                        {
                            break;
                        }
                    }
                    if (x != NMinus1)
                    {
                        return(false);
                    }
                }
                return(true);
            }
예제 #2
0
 public static int[] GetWitnesses(PrimeType N)
 {
     foreach (var aSet in witnesses)
     {
         if (N < aSet.Key)
         {
             return(aSet.Value);
         }
     }
     throw new ArgumentOutOfRangeException(nameof(N));
 }
예제 #3
0
            public static Factorization Factorize(PrimeType evenNumber)
            {
                int s = 0;
                var d = evenNumber;

                do
                {
                    s++;
                    d >>= 1;            //d /= 2;
                } while ((d & 1) == 0); //(d % 2 == 0);
                return(new Factorization(s, d));
            }
예제 #4
0
            public static int[] GetRandomWitnesses(PrimeType N, int k)
            {
                var rand = new Random();
                var max  = N - 1 > int.MaxValue ? int.MaxValue : (int)(N - 1);
                var a    = new int[k];

                for (var i = 0; i < k; i++)
                {
                    a[i] = rand.Next(2, max);
                }
                return(a);
            }
예제 #5
0
        public List <int> EratosthenesList(int size)
        {
            List <int> result = new List <int>();

            PrimeType[] types = Eratosthenes(size);
            for (int i = 0, l = types.Length; i < l; i++)
            {
                PrimeType type = types[i];
                if (PrimeType.Prim == type)
                {
                    result.Add(i + 1);
                }
            }
            return(result);
        }
예제 #6
0
            public bool IsPrime(PrimeType N)
            {
                var factors   = Power2Factorizer.Factorize(N - 1);
                var witnesses = WitnessProvider.GetWitnesses(N);

                foreach (var a in witnesses)
                {
                    var rSet = Enumerable.Range(0, factors.s).ToList();
                    if (rSet.All(r =>
                                 BigInteger.ModPow(a, ((PrimeType)Math.Pow(2, r)) * factors.d, N) != N - 1 &&
                                 BigInteger.ModPow(a, factors.d, N) != 1))
                    {
                        return(false);
                    }
                }
                return(true);
            }
예제 #7
0
 private static void PrintResult(PrimeType[] types)
 {
     for (int i = 0, l = types.Length; i < l; i++)
     {
         PrimeType type = types[i];
         int num = i + 1;
         if (0 < i && i % 10 == 0) {
             Console.Write("\r\n");
         }
         if (PrimeType.NotPrim == type)
         {
             Console.Write("_ ");
         }
         else
         {
             Console.Write(num.ToString() + " ");
         }
     }
 }
예제 #8
0
 public PrimeType[] Eratosthenes(int size)
 {
     PrimeType[] result = new PrimeType[size];
     for (int i = 1; i < size; i++)
     {
         int number = i + 1;
         if (number * number <= size)
         {
             for (int j = i + 1; j < size; j++)
             {
                 int nextNumber = j + 1;
                 if (nextNumber % number == 0)
                 {
                     result[j] = PrimeType.NotPrim;
                 }
             }
         }
     }
     return(result);
 }
예제 #9
0
 private static void PrintResult(PrimeType[] types)
 {
     for (int i = 0, l = types.Length; i < l; i++)
     {
         PrimeType type = types[i];
         int       num  = i + 1;
         if (0 < i && i % 10 == 0)
         {
             Console.Write("\r\n");
         }
         if (PrimeType.NotPrim == type)
         {
             Console.Write("_ ");
         }
         else
         {
             Console.Write(num.ToString() + " ");
         }
     }
 }
예제 #10
0
 public PrimeType[] Eratosthenes(int size)
 {
     PrimeType[] result = new PrimeType[size];
     for (int i = 1; i < size; i++)
     {
         int number = i + 1;
         if (number * number <= size)
         {
             for (int j = i + 1; j < size; j++)
             {
                 int nextNumber = j + 1;
                 if (nextNumber % number == 0)
                 {
                     result[j] = PrimeType.NotPrim;
                 }
             }
         }
         
     }
     return result;
 }
예제 #11
0
 public Factorization(int s, PrimeType d)
 {
     this.s = s;
     this.d = d;
 }