I am writing a program to generate primes in range 1 upto 10^9 but it seems to be timing out.
It implements the Sieve of Atkin
I have tried optimizing my code using bitsets and pragmas.
Please are there any other ways i can optimize my code. Code below
#include<bitset>
#include<vector>
#include<iostream>
#include<algorithm>
#pragma GCC target ("avx2")
#pragma GCC optimization ("O3")
#pragma GCC optimization ("unroll-loops")
using namespace std;
#define int long long
const int LIM = 1e9;
bitset<100000000> sieve;
void compute(int limit)
{
if (limit > 2)
cout<<"2 ";
if (limit > 3)
cout<<"3 ";
for (int x = 1; x * x < limit; x++) {
for (int y = 1; y * y < limit; y++) {
int n = (4 * x * x) + (y * y);
if (n <= limit && (n % 12 == 1 || n % 12 == 5))
sieve.flip(n);
n = (3 * x * x) + (y * y);
if (n <= limit && n % 12 == 7)
sieve.flip(n);
n = (3 * x * x) - (y * y);
if (x > y && n <= limit && n % 12 == 11)
sieve.flip(n);
}
}
for (int r = 5; r * r < limit; r++) {
if (sieve.test(r)) {
for (int i = r * r; i < limit; i += r * r)
sieve.reset(i);
}
}
for(int i=sieve._Find_first();i< sieve.size();i = sieve._Find_next(i))
{
if(i==0||i==1)continue;
cout<<i<<" ";
}
cout<<endl;
}
signed main()
{
compute(LIM);
return 0;
}
Thanks in advance.
signed main()is much less idiomatic thanint main(). \$\endgroup\$