在C ++中优化素数生成程序

时间:2019-07-12 09:35:44

标签: c++ optimization primes sieve sieve-of-atkin

我正在编写一个程序,以生成范围在1到10 ^ 9之间的质数,但是它似乎超时了。

我尝试使用位集和编译指示优化代码。

请问我还有其他方法可以优化我的代码。下面的代码

#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;
}

谢谢。

0 个答案:

没有答案