Я реализую Сито Эратосфена, для объяснения этого см. http://en.wikipedia.org/wiki/Сито_Эратосфена а>. Однако я хотел бы адаптировать его для генерации M простых чисел, а не простых чисел от 1 до N. Мой метод сделать это состоит в том, чтобы просто создать достаточно большое N, чтобы все M простых чисел содержались в этом диапазоне. Есть ли у кого-нибудь хорошие эвристики для моделирования роста простых чисел? Если вы хотите опубликовать фрагменты кода, я реализую это на Java и C++.
Алгоритмы динамического сита для простого поколения
Ответы (5)
Чтобы сгенерировать M простых чисел, вам нужно подняться примерно до M log M. См. Приближения для n-го простого числа в этой статье Википедии о теореме о простых числах. Чтобы быть в безопасности, вы можете захотеть переоценить - скажем, N = M (log M + 1).
Отредактировано для добавления: Как отмечает Дэвид Хаммен, это завышение не всегда достаточно хорошо. Статья в Википедии дает M (log M + log log M) в качестве безопасной верхней границы для M >= 6.
Это приближение n-го простого числа взято из Википедии; поэтому вам просто нужно выделить массив m*log(m)+m*log(log(m))
; массива m*log(m)
будет недостаточно.
Другой альтернативой является сегментированное сито. Просеять числа до миллиона. Потом второй миллион. Потом третий. И так далее. Остановитесь, когда у вас будет достаточно.
Нетрудно сбросить сито для следующего сегмента. Подробнее см. в моем блоге.
Почему бы не увеличить сито динамически? Всякий раз, когда вам нужно больше простых чисел, перераспределите память seive и запустите алгоритм sieve прямо над новым пространством, используя простые числа, которые вы ранее нашли.
На ум приходят ленивые вычисления (например, Haskell и другие функциональные языки делают это за вас). Хотя вы пишете на императивном языке, я думаю, вы можете применить эту концепцию.
Рассмотрим операцию удаления оставшихся количественных чисел из набора кандидатов. Фактически, не касаясь реального алгоритма (и, что более важно, не угадывая, сколько чисел вы создадите), выполните эту операцию в ленивом режиме (которую вам придется реализовать, потому что вы говорите на императивном языке), когда и если вы попытаетесь взять наименьшее оставшееся число.