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 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); }