Test velocità algoritmi sui numeri primi

di il
15 risposte

15 Risposte - Pagina 2

  • Re: Test velocità algoritmi sui numeri primi

    Guarda mi è venuto in mente di bypassare la pesantezza del realloc con questo algoritmo:
    
    #include <stdio.h>
    
    int controllo(register long long int num, long long int vett[], register long long int tmp){
       register long long int i, nop;
       nop = 0;
    
        for(i=0; i<=tmp; i++){
    		if(num%vett[i] == 0){
    			nop++;
    			if(nop != 0){
    				goto RITORNO;
    			}
    		}
    	}
    	RITORNO:
    	if(nop == 0){
    		return 1;
    	}else{
    		return 2;
    	}
    }
    
    
    int main(){
    
       long long int dim=100000, i, tmp;
       char file[] = "Primes.txt";
    
       long long int vett[dim];
       vett[0] = 2;
       vett[1] = 2;
       vett[2] = 3;
       vett[3] = 5;
       tmp = 3;
    
        //Calcoli
        printf("\n\aATTENZIONE: la durata del calcolo dipende dal limite impostato!\n\tCalcolo in corso, attendere prego...\n");
    
       for(i=6; i<=dim; i++){
          if(controllo(i, vett, tmp) == 1){
             tmp++;
             vett[tmp] = i;
    	  }
       }
       vett[0] = 1;
       vett[tmp+1] = '\0';
    
       //Scrittura risultato
       printf("\nScrittura su file...");
    
       FILE *fp;
       fp = fopen(file, "w");
       for(i=0; i<=tmp; i++){
          fprintf(fp, "%lld\n", vett[i]);
          }
       fclose(fp);
    
       printf("\nNumeri scritti sul file Primes.txt\n\n");
       //system("PAUSE");
    
       return 0;
    }
    
    In poche parole faccio quello che voleva fare quel tizio con il realloc ma non c'è niente da reallocare, lo spazio sul vettore già c'è. Per funzionare funziona, il problema è che è molto più lento della versione che esegue controlli fino alla radice del limite, cioè nella pratica la versione meno ottimizzata fa molti più controlli ma in minor tempo rispetto alla versione ottimizzata dal punto di vista concettuale.
    Quindi quell'algorimo con il realloc, anche con i reallochi eseguiti ogni tanto e che incrementano il vettore non solo di uno spazio per usarlo il meno possibile e notare i miglioramenti del dividere un numero solo per i primi minori, sarebbe sempre più lento dell'eseguire tutti i controlli proprio perchè è l'uso dei vettori anche ad essere pesante.
Devi accedere o registrarti per scrivere nel forum
15 risposte