コードの実行速度を向上させるために何ができるかについて誰か提案があるかどうか疑問に思っていました. inclusiveSieve of Atkin
からすべての素数を含むベクトルを返す関数を作成しました[2, max]
。
これが私のコードです。
void atkin_sieve (unsigned int max, std::vector <unsigned int> & primes) {
// Sieve array up to max defaulted to false
// Index's [0, max] correspond to numbers
// Dynamic memory so all values default false
bool* sieve = new bool [max + 1];
// Square root of max number
unsigned int sqrt_max = int (sqrt (max));
// Unsigned integers declared to save time
unsigned int n, x, y;
// TODO - Explain this
for (x = 1; x < sqrt_max; x++) {
for (y = 1; y < sqrt_max; y++) {
n = (4 * x * x) + (y * y);
if (n <= max && (n % 12 == 1 || n % 12 == 5))
sieve [n] = !sieve [n];
n = (3 * x * x) + (y * y);
if (n <= max && (n % 12 == 7))
sieve [n] = !sieve [n];
n = (3 * x * x) - (y * y);
if (x > y && n <= max && (n % 12 == 11))
sieve [n] = !sieve [n];
}
}
// TODO - Explain this
for (x = 5; x < sqrt_max; x++) {
if (sieve [x]) {
n = x * x;
for (y = n; y <= max; y += n)
sieve [y] = false;
}
}
// Push primes 2, 3, and 5
primes.push_back(2);
primes.push_back(3);
primes.push_back(5);
// Start from prime 7, skip even numbers
for (x = 7; x <= max; x += 2) {
// If the number is prime
if (sieve [x])
// Push it into the vector
primes.push_back(x);
}
// Delete the sieve array
delete [] sieve;
}
この関数を最適化するために何ができるかについて、いくつか質問があります。
sieve 配列をブール値の動的配列として初期化して、デフォルトですべて false になるようにしました。このように sieve を動的にする方が高速ですか、それとも通常の配列のままにしておく必要がありますか?
アルゴリズムが処理された後、for ループを使用してベクトルに素数を格納しています。ふるい内のすべての素数を見つけてベクトルに格納するより高速な方法はありますか?
他のヒント、トリック、ヒント、またはコードは大歓迎です。ありがとうございます。