Для относительно небольших чисел x% n до sqrt (x) ужасно быстро и легко кодируется.
Простые улучшения:
только тест 2 и нечетные числа.
тест 2, 3 и кратные 6 + или - 1 (все простые числа, кроме 2 или 3, кратны 6 +/- 1, так что вы, по сути, просто пропускаете все четные числа и все кратные 3
проверка только простых чисел (требуется вычисление или сохранение всех простых чисел до sqrt (x))
Вы можете использовать метод sieve, чтобы быстро создать список всех простых чисел вплоть до некоторого произвольного предела, но он, как правило, требует много памяти. Вы можете использовать трюк, кратный 6, чтобы уменьшить использование памяти до 1/3 бита на число.
Я написал простой простой класс (C #), который использует два битовых поля для кратных 6 + 1 и кратных 6-1, затем выполняет простой поиск ... и если число, которое я проверяю, выходит за пределы сито, затем оно возвращается к проверке на 2, 3 и кратности 6 +/- 1. Я обнаружил, что создание большого сита на самом деле занимает больше времени, чем вычисление простых чисел на лету для большинства задач Эйлера, которые я решил до сих пор. Принцип KISS поражает снова!
Я написал простой класс, который использует сито для предварительного вычисления меньших простых чисел, затем опирается на тестирование на 2, 3 и кратные шесть +/- 1 для тех, которые находятся вне диапазона сита.