In questa nuova versione il programma consente di ottimizzare l'analisi dei numeri pseudoprimi velocizzando la routine di controllo mediante il Crivello di Eratostene.
#include <cstdlib>
#include <iostream>
#include <math.h>
using namespace std;
bool crivello(long unsigned int numero);
int main(int argc, char *argv[])
{
long unsigned int y,a;
char risp = 's';
do {
long unsigned int n_primi=0 , p_primi=0, v_primi=0;
cout << "Digita coefficiente a:"; cin >> a;
for (long unsigned int n=1; n<=1000000; n++){
y = (2*n^2 + 2*n*a + a);
//Determina se il modulo possiede le caratteristiche corrette
if ((y%a == 1) || (y%a == (a-1)) || (n%a == 1) || (n%a ==(a- 1))) { cout << " pseudoprimo " << endl; p_primi++;
if (crivello(y)== true) { cout << "numero primo!" << endl; n_primi++; cout << "Numero calcolato:" << y << endl; }
else cout << "non primo" << endl;
}
//else if (crivello(y)== true) {cout << "numero primo!" << endl; cout << "Numero calcolato:" << y << endl; v_primi++;}
}
cout << "Numeri primi trovati:" << n_primi << " pseudo_primi:" << p_primi << endl;
// Numeri primi non determinati dal modulo
//cout << "Numeri primi non pseudoprimi:" << v_primi << endl;
cout << "Vuoi continuare s/n:";
cin >> risp;
}while (risp == 's');
system("PAUSE");
return EXIT_SUCCESS;
}
bool crivello (long unsigned int numero){
//crivello di Eratostene
long double radicale = sqrt(numero); //MCD dispari sino a radice(n)
for (long unsigned int iA =3; iA <= radicale; iA+=2)
{
if (numero%iA ==0) return false;
}
return true;
}
Nessun commento:
Posta un commento