??? Any Suggestions for Speeding This Up ???
I recently made a program that looks for quadratic equations (ax˛+bx+c = N) that, when incremented values of x are inputted, generate a lot of prime numbers. The problem is, when going for 10000 or 100000 different values for x, it has to check each result N for primality, which is slow. Plus, it checks for all combinations of a, b, and c, over a range, which REALLY slows it down.
Any suggestions for speeding up this program at all? Even a little bit will speed it up, because this is on the order of millions or billions of math calculations and loops.
Thanks.
Code:
#include <iostream>
#include <string>
#include <cstdlib>
#include <stdio.h>
#include <math.h>
#include <ctype.h>
using namespace std;
void main(){
short amin;
short amax;
short bmin;
short bmax;
short cmin;
short cmax;
short iterations;
float pmin;
float pmax;
cout << "ax^2 + bx + c" << endl;
cout << " " << endl;
//RANGE FOR A
cout << "Range for a? (integers -32,768 to 32,767)" << endl;
cout << " " << endl;
cout << "min? ";
cin >> amin;
cout << " " << endl;
cout << "max? ";
cin >> amax;
cout << " " << endl;
cout << " " << endl;
//RANGE FOR B
cout << "Range for b? (integers -32,768 to 32,767)" << endl;
cout << " " << endl;
cout << "min? ";
cin >> bmin;
cout << " " << endl;
cout << "max? ";
cin >> bmax;
cout << " " << endl;
cout << " " << endl;
//RANGE FOR C
cout << "Range for c? (integers -32,768 to 32,767)" << endl;
cout << " " << endl;
cout << "min? ";
cin >> cmin;
cout << " " << endl;
cout << "max? ";
cin >> cmax;
cout << " " << endl;
cout << " " << endl;
//ITERATIONS
cout << "How many iterations? (no more than 65,535)" << endl;
cin >> iterations;
cout << " " << endl;
cout << " " << endl;
//PERCENTAGE PRIME
cout << "What percentage should be Prime? (integer 0 to 100)" << endl;
cout << " " << endl;
cout << "min? ";
cin >> pmin;
cout << " " << endl;
cout << "max? ";
cin >> pmax;
cout << " " << endl;
cout << " " << endl;
cout << "Wait..." << endl;
cout << " " << endl;
cout << " " << endl;
float percentmin = pmin/100;
float percentmax = pmax/100;
//START
//Values for A
for (short a = amin; a <= amax; a++)
{
if(a==0) //skips the linears
{
}
else
{
//Values for B
for (short b = bmin; b <= bmax; b++) //CHANGE BACK TO b++
{
//Values for C
for (short c = cmin; c <= cmax; c++) //CHANGE BACK TO c++
{
//keeps track of how many primes result for this quadratic
unsigned short primes = 0;
//keeps track of the total iterations for this quadratic
unsigned short total = 0;
//START of test for increasing values of i
for(short i=0;i<iterations;i++)
{
short flag = 0;
__int64 n = ((a*i*i) + (b*i) + c);
if(n>1)
{
if((n%2)==0) //checks against 2
{
flag = 1;
}
else
{
// checks odds from 3 up to sqrt(n)
for(long m = 3;m<=((long)(sqrt(n)));m+=2)
{
if((n%m)==0)
{
flag = 1;
break;
}
}
}
if(flag==0)
{
primes = primes + 1;
}
total++;
}
else
{
/*cout << " " << endl;
cout << "---------------------------------------" << endl;
cout << n << " was tossed out for being <= 1..." << endl;
cout << "---------------------------------------" << endl;
cout << " " << endl;*/
}
}
double primepercent = ((double) primes) /(iterations);
if((primepercent >= percentmin) && (primepercent <= percentmax))
{
cout << " " << endl;
cout << a << "x^2 + " << b << "x + " << c << endl;
cout << primes << " out of " << total << " were prime." << endl;
//cout << primes << endl;
}
}
}
}
}
}