0

最近、素数にとても興味を持ち、素数を計算するプログラムを作ってみました。数秒で100万個の素数を計算できるSundaramプログラムのふるいを作ることができました。それはかなり速いと思いますが、もっと良くしたかったのです。私はAtkinのふるいを作成しようと続けました。ウィキペディアから疑似コードをコピーした後、20 分で動作する C++ コードをまとめました。

結局のところ、それは疑似コードであるため、完璧ではないことはわかっていました。少なくとも Sundaram Sieve よりも良い時間を期待していましたが、それは大間違いでした。とても遅いです。何度も見直しましたが、大幅な変更は見当たりません。私のコードを見ると、それが非効率的であること、システムコマンドを使用していたこと、あちこちに散らばっていることを知っていますが、これはプロジェクトでも重要なものでもなく、私のためのものです。

#include <iostream>
#include <fstream>
#include <time.h>
#include <Windows.h>
#include <vector>

using namespace std;

int main(){

float limit;
float slimit;
long int n;
int counter = 0;
int squarenum;
int starttime;
int endtime;
vector <bool> primes;

ofstream save;
save.open("primes.txt");
save.clear();

cout << "Find all primes up to: " << endl;
cin >> limit;

slimit = sqrt(limit);

primes.resize(limit);

starttime = time(0);

// sets all values to false
for (int i = 0; i < limit; i++){

    primes[i] = false;
}


//puts in possible primes
for (int x = 1; x <= slimit; x++){

    for (int y = 1; y <= slimit; y++){


        n = (4*x*x) + (y*y);
        if (n <= limit && (n%12 == 1 || n%12 == 5)){

            primes[n] = !primes[n];
        }

        n = (3*x*x) + (y*y);
        if (n <= limit && n% 12 == 7){

            primes[n] = !primes[n];
        }

        n = (3*x*x) - (y*y);
        if ( x > y && n <= limit && n%12 == 11){

            primes[n] = !primes[n];
        }
    }
}

//square number mark all multiples not prime

for (float i = 5; i < slimit; i++){

    if (primes[i] == true){

        for (long int k = i*i; k < limit; k = k + (i*i)){

            primes[k] = false;
        }
    }
}

endtime = time(0);
cout << endl << "Calculations complete, saving in text document" << endl;


// loads to document
for (int i = 0 ; i < limit ; i++){

    if (primes[i] == true){


        save << counter << ") " << i << endl;
        counter++;
    }
}

save << "Found in " << endtime - starttime << " seconds" << endl;

save.close();

system("primes.txt");

system ("Pause");
return 0;
}
4

2 に答える 2