Prime Number Generator with unmatched speed.

BevoX 0 Tallied Votes 152 Views Share

Alright no more prime number generators I promise, but I had to fix the last one...
This one uses the Sieve of Eratosthenes algorithm. It can generate prime numbers even faster, than the previous version. 1 million prime number in 2,331 second, ten million prime number in less than 22 seconds.

//PrimeGen_v4 by BevoX 08/02/2009
//#include <new> //uncomment this, or try with new.h if you get compiler errors beacuse of ba.what()
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <fstream>

using namespace std;

class Primes
{
    public : Primes( const unsigned int & );
             ~Primes(){ delete []array; };

             void FindPrime();
             void WriteOut();

    private : unsigned int *array, _size, max_divisor, n, step;
              const unsigned int end;
              ofstream out_file;
};

int main()
{
    unsigned int end_param;

    cout << "PrimeGen_v4 by BevoX" << endl << "Enter the last element: ";
    cin >> end_param;
	// don't try to feed it with negative numbers, it can't handle them

    if( end_param < 2 )
    {
        cout << "Invalid interval!" << endl;
        cin.ignore( 1,'\n' );
        cin.get();
        exit(1);
    }

    cout << " * WORKING.." << endl;

    Primes Alpha( end_param );
    Alpha.FindPrime();
    Alpha.WriteOut();

    cout << " * FINISHED" << endl << "The results can be found in the 'Primes.txt' file." << endl;

    cin.ignore( 1,'\n' );
    cin.get();
    return 0;
}
Primes::Primes( const unsigned int & _end_param ) : end( _end_param ) // constructor
{
    if( ( end % 2) == 0 ) _size = end / 2; // even numbers won't be initialized -> half size
	else _size = ( end / 2) + 1;

	try{ array = new unsigned int [ _size ]; } // allocates memory
    catch( bad_alloc &ba )
    {
        cout << "! ERROR : " << ba.what() << endl;
        cin.ignore( 1,'\n' );
        cin.get();
        exit(1);
    }

    n = 1;

    for( unsigned int i = 0; i < _size; i++ ) //occupies array, with odd numbers
    {
        array[i] = n;
        n += 2;
    }
}
void Primes::FindPrime()
{
    max_divisor = sqrt( (float)end );
    step = 1;

    do
    {
        n = array[ step ];

        for( unsigned int i = step + 1; i < _size; i++ )
        {
            if( array[i] != 0 )
            {
                if( array[i] % n == 0) array[i] = 0;
            }
        }

        step++;

        while( array[ step ] == 0 )
        {
            step++;
        }
    }
    while( n <= max_divisor );

}
void Primes::WriteOut()
{
    out_file.open( "Primes.txt" );

    if( out_file )
    {
        for( unsigned int  j = 0; j < _size; j++ )
        {
            if( array[j] != 0 ) out_file << array[j] << " ";
        }
        out_file.close();
    }
    else
    {
        cout << "! ERROR -- Unable to create FILE !!!" << endl;
        cin.ignore( 1, '\n' );
        cin.get();
        exit(2);
    }
}
Member Avatar for KumarUtkarsh
KumarUtkarsh

Can you tell how to get a perfect prime number worth digits 10^100000
If yes post that alorithm or source code @ [email snipped]

If I had founded that intresented I will offer you a full-Version of mine original software known as KeyPro Q and make you as associate helper.

Sent as fast as you can at mine site. If you were unable to make me happy then sorry.

By KeryPtor Q [email snipped]

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.