Я написал две рабочие программы C ++, чтобы найти все простые простые числа 203280221 в соответствии с 4294967295, используя сито эратосфен с факторизацией колеса и кучей других оптимизаций. < /p>
Все простые числа, кроме 2, являются нечетными, поэтому нам нужно только проверять нечетные числа, пространство поиска вдвое. Другими словами, все простые простые числа, кроме 2, являются 2-копримами. И это также относится к всем другим простым числам, все простые числа, кроме 3, являются 3-купкими, все простые числа, кроме 5, являются 5-турми и т. Д. Все пары простые простые простые отношения должны быть связаны друг с другом, и начиная с 5 человек все простые промывания должны быть во все 2, так и 3, начиная с 7 все просты В 7 должен быть согласованным с {1, 7, 11, 13, 17, 19, 23, 29} Modulo 30, все простые простые расстройства, начинающиеся в 11
Использование колеса на уровне 3 -го уровня. Пространство поиска сузится до 4/15, колесо 4 -го уровня сужает пространство поиска до 8/35 и колесо 5 до 16/77.
Теперь следующая программа C ++ находит все 203280221 Primes Motion 429967295, A Uint32_T ISITES, 20320202020202020202021 813120884 байт, или 775,4525mib. Программа находит все простые числа uint32_t, а затем записывает их в файл, простые числа преобразуются в одну двоичную последовательность, простые простые числа соединяются с головой в хвост, каждый из них преобразуется в большую эндианскую последовательность. Я понятия не имею, почему он использует 1GIB и немного оперативной памяти, но во время записи для подачи он использует 775mib, как и ожидалось. < /P>
#include
#include
#include
#include
#include
#include
static bools prime_wheel_sieve(uint64_t limit) {
limit++;
bools is_prime(limit, true);
std::array wheel;
is_prime[0] = is_prime[1] = false;
for (auto& [multiple, step] : FOREWHEEL) {
for (uint64_t i = multiple; i < limit; i += step) {
is_prime = false;
}
}
uint32_t k, max_k;
uint64_t multiple;
k = 11;
max_k = std::sqrt(limit);
uint8_t i, j;
i = j = 0;
while (k 16 & 255));
data.push_back(uint8_t(k >> 8 & 255));
data.push_back(uint8_t(k & 255));
}
k += WHEEL;
i++;
i -= (i == 48) * 48;
}
return data;
}
int main()
{
bytes data = prime_bytes(4294967295);
std::ofstream file("D:\\UInt32_Primes.bin", std::ios::binary);
if (!file.good()) {
std::cerr
Скомпилировано с помощью: < /p>
g++ -std=c++20 -march=native -O3 -flto -funroll-loops -fomit-frame-pointer -fstrict-aliasing -o "D:\CliExec\wheel_sieve_test_gcc.exe" "D:\MyScript\prime_sieve_test.cpp"
< /code>
Теперь теперь я с тех пор сильно оптимизировал этот код, я использовал колесо 5 -го уровня во второй версии, я заставил программу запомнить состояние сита и все простые простые числа, я сделал программу только в случае необходимости, если бы я не запомнил все, что у меня были, и минимализированные вычисления, но я хотел, чтобы все запомнили, что я должен был использовать все платы за все люди, которые приходили на все платы за все люди, которые можно было принять все платы за все люди, которые можно было запомнить, я должен был использовать все, что можно было удержать все пта uint32_t. < /p>
#include
#include
#include
#include
#include
using std::vector;
using std::array;
using bools = vector;
Я написал две рабочие программы C ++, чтобы найти все простые простые числа 203280221 в соответствии с 4294967295, используя сито эратосфен с факторизацией колеса и кучей других оптимизаций. < /p> Все простые числа, кроме 2, являются нечетными, поэтому нам нужно только проверять нечетные числа, пространство поиска вдвое. Другими словами, все простые простые числа, кроме 2, являются 2-копримами. И это также относится к всем другим простым числам, все простые числа, кроме 3, являются 3-купкими, все простые числа, кроме 5, являются 5-турми и т. Д. Все пары простые простые простые отношения должны быть связаны друг с другом, и начиная с 5 человек все простые промывания должны быть во все 2, так и 3, начиная с 7 все просты В 7 должен быть согласованным с {1, 7, 11, 13, 17, 19, 23, 29} Modulo 30, все простые простые расстройства, начинающиеся в 11[code]{ 1 , 11 , 13 , 17 , 19 , 23 , 29 , 31 , 37 , 41 , 43 , 47 , 53 , 59 , 61 , 67 , 71 , 73 , 79 , 83 , 89 , 97 , 101, 103, 107, 109, 113, 121, 127, 131, 137, 139, 143, 149, 151, 157, 163, 167, 169, 173, 179, 181, 187, 191, 193, 197, 199, 209 } [/code] Использование колеса на уровне 3 -го уровня. Пространство поиска сузится до 4/15, колесо 4 -го уровня сужает пространство поиска до 8/35 и колесо 5 до 16/77. Теперь следующая программа C ++ находит все 203280221 Primes Motion 429967295, A Uint32_T ISITES, 20320202020202020202021 813120884 байт, или 775,4525mib. Программа находит все простые числа uint32_t, а затем записывает их в файл, простые числа преобразуются в одну двоичную последовательность, простые простые числа соединяются с головой в хвост, каждый из них преобразуется в большую эндианскую последовательность. Я понятия не имею, почему он использует 1GIB и немного оперативной памяти, но во время записи для подачи он использует 775mib, как и ожидалось. < /P> #include #include #include #include #include #include
static bools prime_wheel_sieve(uint64_t limit) { limit++; bools is_prime(limit, true); std::array wheel; is_prime[0] = is_prime[1] = false; for (auto& [multiple, step] : FOREWHEEL) { for (uint64_t i = multiple; i < limit; i += step) { is_prime[i] = false; } } uint32_t k, max_k; uint64_t multiple; k = 11; max_k = std::sqrt(limit); uint8_t i, j; i = j = 0; while (k 16 & 255)); data.push_back(uint8_t(k >> 8 & 255)); data.push_back(uint8_t(k & 255)); } k += WHEEL[i]; i++; i -= (i == 48) * 48; } return data; }
int main() { bytes data = prime_bytes(4294967295); std::ofstream file("D:\\UInt32_Primes.bin", std::ios::binary); if (!file.good()) { std::cerr Скомпилировано с помощью: < /p> g++ -std=c++20 -march=native -O3 -flto -funroll-loops -fomit-frame-pointer -fstrict-aliasing -o "D:\CliExec\wheel_sieve_test_gcc.exe" "D:\MyScript\prime_sieve_test.cpp" < /code> Теперь теперь я с тех пор сильно оптимизировал этот код, я использовал колесо 5 -го уровня во второй версии, я заставил программу запомнить состояние сита и все простые простые числа, я сделал программу только в случае необходимости, если бы я не запомнил все, что у меня были, и минимализированные вычисления, но я хотел, чтобы все запомнили, что я должен был использовать все платы за все люди, которые приходили на все платы за все люди, которые можно было принять все платы за все люди, которые можно было запомнить, я должен был использовать все, что можно было удержать все пта uint32_t. < /p> #include #include #include #include #include
using std::vector; using std::array; using bools = vector;