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); }
public static int[] GetWitnesses(PrimeType N) { foreach (var aSet in witnesses) { if (N < aSet.Key) { return(aSet.Value); } } throw new ArgumentOutOfRangeException(nameof(N)); }
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)); }
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); }
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); }
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); }
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() + " "); } } }
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); }
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; }
public Factorization(int s, PrimeType d) { this.s = s; this.d = d; }