Я пытаюсь оптимизировать алгоритм простого поиска.
У меня есть программа, которая находит (считает на самом деле) простые числа ниже некоторого предела.Я знаю, что простое число может быть выражено в форме 6k+1
, 6k-1
, для некоторых k > 0
.
. В настоящее время я использую алгоритм просеивания, чтобы отсортировать не простые числа.Некоторый псевдокод:
int P[100] = {1};
int m = 100;
int n = 2, k, i, j, sqrtm = (int)sqrt(m);
for(k = 2, i = 5; i < sqrtm + 1; i += k, k ^= 6)
if(P[i])
P[i] = 0;
n = n + 1;
for(j = i * i; j < m; j += 2 * i)
P[j] = 0;
for(k = 2, i = 5; i < m + 1; i += k, k ^= 6)
if(P[i])n = n + 1;
print n;
Над кодом, надеюсь, будет напечатано число простых чисел ниже числа m.Я использую некоторые приемы, чтобы ускорить процесс.Например, начиная отсчет не простых чисел с «5», используйте тот факт, что простое число в приведенной выше форме не может быть кратно «2» и «3».6к + 2 чётно.6k + 3 кратно '3', пусть x = 2k, 6k + 3 => 3x + 3 => 3 (x + 1) mod 3 == 0 или 3 (2k + 1) mod 3 == 0.
Здесь возникает мой вопрос.Если я сделаю предварительное сито с некоторыми простыми числами, могу ли я принять другую форму простого числа, чтобы ускорить цикл просеивания?Например, предварительно просеять с 2,3,5,7,11,13,17,19,23,29.Итак, теперь массив P не имеет кратных выше.Может быть, кто-то может предложить мне какую-то форму простого числа, такую, что с предварительным просеиванием цикл можно сделать большими кусками.
Я уже сделал несколько оптимизаций, не связанных с формой простого числа.Как просеивать куски и использовать бит для хранения сита.Все это заставило мою программу работать довольно быстро.
time ./np 1000000000
allocated 119Mb
primes from 2 <= 1000000000 : 50847534
real 0m2.386s
user 0m2.354s
sys 0m0.032s
Я знаю, что могу получить лучшую программу счетчика простых чисел из Интернета.И это будет работать быстрее.Но я просто хочу знать, как далеко я могу пройти сам.И помощь сообщества;)
Подводя итог.Я хочу использовать предварительное просеивание.Я думаю, что это дает мне меньше сравнений плюс меньше внутренних циклов.Я спрашиваю вас, как записать простое число в другой форме, зная факт предварительного просеивания?