Для больших простых чисел, используемых в криптографии, обычно используется модифицированная форма просеивания: произвольно выбранный диапазон нечетных чисел желаемого размера просеивается по ряду относительно малых нечетных простых чисел (обычно все простые числа меньше, чем 65000). Оставшиеся простые простые числа тестируются в случайном порядке с помощью стандартного теста прочности, такого как тест примитивности Миллера-Рабина для вероятных простых чисел.
Итак, вы можете сделать что-то вроде этого:
var p = Enumerable.Range(0, numberOfCandidates)
.Select(i => RandomOddNumber(bits))
.Where(x => !primesLessThan65000.Contains(x))
.Where(x => PrimalityTest(x))
.FirstOrDefault();