diff options
| -rw-r--r-- | PrimeCPP.cpp | 130 | 
1 files changed, 130 insertions, 0 deletions
diff --git a/PrimeCPP.cpp b/PrimeCPP.cpp new file mode 100644 index 0000000..7f9bd71 --- /dev/null +++ b/PrimeCPP.cpp @@ -0,0 +1,130 @@ +/* + * + * compile:  clang++ -march=native -mtune=native -Ofast -std=c++17 PrimeCPP.cpp -o Primes_clang++.exe + * + */ + + +#include <chrono> +#include <ctime> +#include <iostream> +#include <fstream> +#include <bitset> +#include <map> +#include <cstring> +#include <cmath> + +using namespace std; +using namespace std::chrono; + +// array of bits initially set all to 1's and then selectively set to false as each composite (non prime number) gets market +class BitArray { +    uint32_t *array; +    size_t arrSize; + +    inline static size_t arraySize(size_t size) { +        return (size >> 5) + ((size & 31) > 0); +    } + +    inline static size_t index(size_t n) { +        return (n >> 5); +    } + +    inline static uint32_t getSubindex(size_t n, uint32_t d) { +        return d & uint32_t(uint32_t(0x01) << (n % 32)); +    } + +    inline void setFalseSubindex(size_t n, uint32_t &d) { +        d &= ~uint32_t(uint32_t(0x01) << (n % (8*sizeof(uint32_t)))); +    } +public: +    explicit BitArray(size_t size) : arrSize(size) { +        array = new uint32_t[arraySize(size)]; +        std::memset(array, 0xFF, (size >> 3) + ((size & 7) > 0)); +    } + +    ~BitArray() {delete [] array;} + +    bool get(size_t n) const { +        return getSubindex(n, array[index(n)]); +    } + +    void set(size_t n) { +        setFalseSubindex(n, array[index(n)]); +    } +}; + +class prime_sieve +{ +  private: + +      long sieveSize = 0; +      long primeCount = 0; +      BitArray Bits; + +   public: + +      prime_sieve(long long n)  +        : Bits(n), sieveSize(n) +      { +      } + +      ~prime_sieve() +      { +      } + +      void runSieve(std::chrono::time_point<std::chrono::steady_clock> tStart) +      { +          int prime = 2; +          int q = (int) sqrt(sieveSize); + +          while (prime <= q) +          { +            for (int num = prime; num < sieveSize; num++) +            { +              if (Bits.get(num)) +              { +                prime = num; +                this->primeCount++; + +                // mark all composites +                for (int comp = prime * 2; comp < sieveSize; comp += prime) +                  Bits.set(comp); +              } +            } +          } + +          auto duration = duration_cast<microseconds>(steady_clock::now() - tStart).count() / 1000000.0; + +          printf("Time: %lf, Limit: %ld, Primes Found: %ld\n", duration, this->sieveSize, this->primeCount); +      } + +      void writeResults(void) +      { +          std::ofstream outfile("primes.txt", std::ios::out); +          if (outfile.is_open()) +          { +            outfile << "2, "; +            int count = (sieveSize >= 2);  // Starting count (2 is prime) +            for (int num = 3; num <= sieveSize; num+=2) +            { +              if (Bits.get(num)) +                outfile << num << ", "; +            } + +            outfile << std::endl; +            outfile.close(); +          } +          else +            std::cout << "Unable to open a file for writing" << std::endl; +      } +}; + +int main() +{ +    auto tStart = steady_clock::now(); + +    prime_sieve sieve(1000000000LL); +    sieve.runSieve(tStart); +    sieve.writeResults(); +}  | 
