Отличный вопрос. Это все еще не доказано в полиномиальное время (полиномиальное количество цифр, здесь 20) - это был проект Finding Primes Polymath, в котором участвовали несколько математиков (включая Полевых Медалистов Теренса Тао и Тима Гауэрса!) пытался придумать алгоритм, но проект, похоже, пока не дал конкретных результатов.
В любом случае, есть несколько вещей, которые вы можете сделать. Один из них, как вы и другие указали, состоит в том, чтобы попробовать каждое число и проверить, является ли оно простым, с помощью быстрого теста на простоту, такого как Миллер-Рабин . По известным теоретико-числовым эвристикам (основанным на теореме о простых числах ), "вероятность" числа около n, являющегося простым, составляет около 1 / ln (n), поэтому при 10 ^ 20, около в каждых 46 числах будут простые числа. Поэтому, если вам нужно k 20-значных чисел, вы запустите тест Миллера-Рабина для примерно 50 тыс. Чисел.
Второй подход, который я думаю может быть быстрее, если вы делаете это для многих А (не задумывался тщательно), состоит в том, чтобы вместо этого использовать сито , как Сито Эратосфена . Если вам нужно k простых чисел, создайте массив из примерно 50 000 чисел (или больше, чтобы быть в безопасности) и просейте их. Вы начнете с предварительно вычисленного списка простых чисел, меньших некоторого числа. (10 10 , чтобы быть совершенно правильным, но, поскольку вы готовы допустить некоторые составные числа, подойдет меньший список простых чисел, например, проверка с помощью первых 50 миллионов простых чисел , убедитесь, что у ваших чисел нет главных факторов ниже 982 451 653, и их не так много.)
Третий подход - найти чью-либо реализацию для этой проблемы. :-) Например, есть веб-страница с заданным номером, находит следующее простое число или находит следующие десять простых чисел . Если вы используете его в Интернете, то вам, вероятно, придется скопировать его вручную, но также доступен исходный код .