sabato 24 novembre 2012

Semplice programma per calcolare i numeri primi II

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