В http://cr.yp.to/primegen.html вы можете найти источники программы, которая использует сито Аткина для генерации простых чисел. Поскольку автор говорит, что может потребоваться несколько месяцев, чтобы ответить на электронное письмо, отправленное ему (я понимаю, что он действительно занятой человек!) Я отправляю этот вопрос.
На странице указано, что «primegen может генерировать простые числа до 1000000000000000». Я пытаюсь понять, почему это так. Конечно, существует ограничение до 2 ^ 64 ~ 2 * 10 ^ 19 (размер длинного целого без знака), потому что так представлены числа. Я точно знаю, что если бы существовал огромный простой промежуток (> 2 ^ 31), то печать чисел не удалась бы. Однако в этом диапазоне я думаю, что нет такого простого разрыва.
Либо автор переоценил границу (а на самом деле она составляет около 10 ^ 19), либо в исходном коде есть место, где арифметическая операция может переполниться, или что-то в этом роде.
Самое смешное, что вы МОЖЕТЕ использовать его для чисел> 10 ^ 15:
./primes 10000000000000000 10000000000000100
10000000000000061
10000000000000069
10000000000000079
10000000000000099
и если вы верите в Wolfram Alpha, это правильно.
Некоторые факты, которые у меня были "переделаны":
- числа просеиваются партиями по 1920 * PRIMEGEN_WORDS = 3 932 160 чисел (см. Функцию primegen_fill в primegen_next.c)
- PRIMEGEN_WORDS контролирует, насколько большим будет одно просеивание - вы можете настроить его в primegen_impl.h, чтобы он соответствовал кешу вашего процессора,
- реализация самого сита находится в файле primegen.c - я полагаю, это правильно; то, что вы получите, это битовая маска простых чисел в pg-> buf (см. функцию primegen_fill)
- Битовая маска анализируется, а простые числа сохраняются в массиве pg-> p.
Не вижу точки, где может произойти переполнение.