Mentre provavo a svolgere degli esercizi che richiedevano la produzione di numeri primi rispettivamente matrice prima e primo permissivo ho utilizzato 2 algoritmi differenti:
-
Algoritmo pensato da me ma ovviamente già conosciuto: controllo per ogni numero che non sia divisibile per ogni numero primo minore della sua radice quadrata.
-
Crivello di Eratostene che si è rivelato essere più efficente.
Algoritmo numero 1:
set <int> primi;
void calcola_primi(int numeromassimo)
{
bool primo=true;
int valore=5;
primi.insert(2);
primi.insert(3);
while(valore<=numeromassimo)
{
primo=true;
for(set<int>::iterator it=primi.begin(); it!=primi.end() && *it<=sqrt(valore);it++)
if(valore%*it==0)
primo=false;
if(primo){
primi.insert(valore);
}
valore+=2;
}
}
Crivello (ringrazio Spippolino01 per il codice )
bool primo[38600];
vector <int> v;
void crivello()
{
for(int i=2; i< 35001; i++)
primo[i] = true;
for(int i=2; i<=sqrt(35001); i++)
{
if(primo[i])
{
for(int j= i+i; j < 35001; j+=i)
{
primo[j]=false;
}
}
}
return;
}
Come detto in precedenza con il crivello è possibile risolvere entrambi i problemi mentre con il primo algoritmo soltanto “matrice prima”, quindi mi sono messo ad anilizzare la complessità
Primo Algoritmo:
$$\sum_{i=0}^n \pi(Sqrt(i))$$
Secondo Algoritmo: con r=sqrt(n)
$$\sum_{i=0}^r n/i$$
Anche se i non assume valori di numeri primi, quindi il range i r= \pi (r)
È corretta?