public (BigInteger P, BigInteger Q) GeneratePair() { var randomGen = new Random(Environment.TickCount); var iterationCounter = 0; while (iterationCounter < settings.MaxIteration) { // Select prime randomly var prime = primesList.ElementAt(randomGen.Next(0, primesList.Count - 1)); var checkingNumber = prime; foreach (var num in settings.NumbersInFactorization) { checkingNumber *= num; } if (settings.NumbersInFactorization.All(num => num != 2)) { checkingNumber *= 2; } var accumulatingValue = settings.AccumulatingValue == BigInteger.Zero ? new BigInteger(2) : settings.AccumulatingValue; do { checkingNumber *= accumulatingValue; } while (checkingNumber.GetBitLength() < settings.KeyLengthNumber); if (Utils.MillerRabinTest(checkingNumber + 1)) { if (settings.ShowIterations) { Console.WriteLine("Iteration #{0} | Prime is {1}", iterationCounter, checkingNumber + 1); } return(checkingNumber + 1, prime); } if (settings.ShowIterations) { Console.WriteLine("Iteration #{0} | Prime not found", iterationCounter); } iterationCounter++; } return(0, 0); }
private void DoFindPrimeNumbers(BigInteger from, BigInteger to) { for (var i = from; i < to; i++) { if (Utils.MillerRabinTest(i)) { primesList.Add(i); } if (primesList.Count >= 15000) { break; } } }