Технологии программирования, Решето Эратосфена
Необходимо реализовать алгоритм "Решето Эратосфена" для нахождения всех простых чисел на интервале [0, 4294967295], то есть в рамках
беззнакового 32-битного целого. Помогите, пожалуйста, решить на языке Python
нихрена себе, четыре лярда... а у тебя питон не лопнет от такого решета?
кагбэ если не жалко четырёх гигов, можно использовать модуль array и однобайтовый тип из него, памяти меньше пожрёт, чем обычный список
если не влом заморочиться, можно сжать память в восемь раз, посжимав битики
numpy так вроде бы из коробки умеет, хотя не уверен, не пользовался
а если жалко, то вот
https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes#Segmented_sieve
Пайтон? Да ну, он же медленный для работы с таким количеством информации. А вот С/С++ для этого - самое то! Информацию о всех простых числах на отрезке [0; 4294967295] получить легко - у меня даже на телефоне Самсунг Гэлэкси это происходит за чуть больше чем шесть с половиной минут, а на нормальном "железе" ещё быстрее. А что дальше делать с этой информацией? Код внизу просто заполняет битовый массив информацией о простоте или непростоте всех неотрицательных чисел до 4294967295 включительно, а потом по введённому с консоли числy из рассматриваемого диапазона говорит да, если введено простое число, и нет, если наоборот. Для хранения данных, как уже́ было сказано, надо чуть более полгигабайта. Число 409 в начале скрина - это время работы сита Эратосфена в секундах для данного диапазона чисел.
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
using namespace std;
unsigned long *a, b[32], c[32];
void fal(unsigned long x)
{ a[x >> 5] &= c[x & 31]; }
unsigned bit(unsigned long x)
{ return a[x >> 5] & b[x & 31]; }
int main()
{ unsigned long i, j, k, l, m, n = 4294967295, t;
unsigned long long N; i = 1; b[0] = i; c[0] = ~i;
t = time(NULL); for (j = 1; j < 32; j++) { i <<= 1;
b[j] = i; c[j] = ~i; } m = ceil((n + 1.) / 32);
a = new unsigned long [m]; for (i = 0; i <= m; i++)
a[i] = 4294967295; fal(0); fal(1); i = ceil(sqrt(n));
for (j = 2; j <= i; j++) if (bit(j)) { k = n / j; for (l = 2;
l <= k; l++) fal(l * j); } cout << time(NULL) - t << endl;
for(;;) { cout << "N » "; cin >> N; t = time(NULL);
if (N <= n ) { if (bit(N)) cout << "yes" << endl;
else cout << "no" << endl; continue; } } }

Вон что я не далее как вчера здесь делала:
https://otvet.mail.ru/answer/2008071766
Там решето Эратосфена до ста миллионов. Переделываешь для 4294967295 и будет те щасте, если, конечно, компьютер такой список переварит!
(А мне так эта вчерашняя Ася даже плюсик не поставила: вишь ты - не понравилось ей там что то!)
Если в поиске набрать "Решето Эратосфена python", то в результатах будет тонна сайтов, содержащих сотни различных реализаций задачи