27/11/13 14:13
Fharamir
Salve gente,
Ho terminato poco fa un programma che elenca i numeri primi da 19 in poi.
Volevo verificare la sua efficienza mettendolo a confronto con un altro programma molto simile trovato su questo sito.
Il risultato è stato che il programma trovato su questo sito ha battuto 12 a 1 il mio...
Bene, dato che adoro migliorare i miei algoritmi sono andato nello specifico del secondo sorgente a cercare il segreto che custodisce...
Purtroppo la ricerca è stata vana, per questo mi rivolgo a voi.
Il mio codice [scritto in C#] inizia a verificare da 19, tutti i numeri dispari.
Li memorizza in una List
E utilizza quelli memorizzati per verificare i successivi. (controlla solo con i numeri primi).
Termina quindi il controllo del numero se supera la radice quadrata del numero da verificare.
Ho aggiunto in più un "pre-controllo" per escludere i divisori più bassi e più facilmente riconoscibili (2, 3, 5, 7, 9, 11, 13, 17)
(riporto solo la parte di codice essenziale)
L'altro codice invece [scritto in C] verifica ogni numero (pari compresi),
verifica ogni divisore (numeri non primi compresi)
e anche questo termina il calcolo al raggiungimento della radice quadrata del numero da verificare...
Io non credo che una differenza così grande sia dovuta al linguaggio usato (C# e C)
Forse c'è qualcosa che rallenta molto l'esecuzione del mio, ma non saprei dire cosa...
Secondo voi cosa può essere la causa della differenza?
Grazie
Ho terminato poco fa un programma che elenca i numeri primi da 19 in poi.
Volevo verificare la sua efficienza mettendolo a confronto con un altro programma molto simile trovato su questo sito.
Il risultato è stato che il programma trovato su questo sito ha battuto 12 a 1 il mio...
Bene, dato che adoro migliorare i miei algoritmi sono andato nello specifico del secondo sorgente a cercare il segreto che custodisce...
Purtroppo la ricerca è stata vana, per questo mi rivolgo a voi.
Il mio codice [scritto in C#] inizia a verificare da 19, tutti i numeri dispari.
Li memorizza in una List
E utilizza quelli memorizzati per verificare i successivi. (controlla solo con i numeri primi).
Termina quindi il controllo del numero se supera la radice quadrata del numero da verificare.
Ho aggiunto in più un "pre-controllo" per escludere i divisori più bassi e più facilmente riconoscibili (2, 3, 5, 7, 9, 11, 13, 17)
List<UInt64> primi = new List<UInt64>(Load()); do { while (!Console.KeyAvailable) { num += 2; P = true; stop = ((UInt64)Math.Sqrt(num)); if (!LastIsFive(num)) if (Sommacifre(num) % 3 != 0) if (ScomponiSette(num) % 7 != 0) if (ScomponiUndici(num) % 11 != 0) if (ScomponiTredici(num) % 13 != 0) if (ScomponiDiciassette(num) % 17 != 0) foreach (UInt64 Primo in primi) { if ((num % Primo) == 0) { P = false; break; } if (Primo >= stop) { break; } } else P = false; else P = false; else P = false; else P = false; else P = false; else P = false; if (P) { primi.Add(num); Console.WriteLine(num); SW.WriteLine(num); }
(riporto solo la parte di codice essenziale)
L'altro codice invece [scritto in C] verifica ogni numero (pari compresi),
verifica ogni divisore (numeri non primi compresi)
e anche questo termina il calcolo al raggiungimento della radice quadrata del numero da verificare...
Io non credo che una differenza così grande sia dovuta al linguaggio usato (C# e C)
Forse c'è qualcosa che rallenta molto l'esecuzione del mio, ma non saprei dire cosa...
Secondo voi cosa può essere la causa della differenza?
Grazie
aaa