Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Algoritmi - Comparazione Numeri primi
Forum - Algoritmi - Comparazione Numeri primi - Pagina 2

Pagine: [ 1 2 3 4 ] Precedente | Prossimo
Avatar
Fharamir (Normal User)
Rookie


Messaggi: 21
Iscritto: 06/05/2011

Segnala al moderatore
Postato alle 20:21
Mercoledì, 27/11/2013
Ricompilo :D

comunque domani mattina, appena posso provo pierotofy

PM Quote
Avatar
tuttodiMC (Normal User)
Expert


Messaggi: 327
Iscritto: 29/10/2012

Segnala al moderatore
Postato alle 20:48
Mercoledì, 27/11/2013
In questo modo fai uno spreco massiccio di memoria.

Innanzitutto qui:

Codice sorgente - presumibilmente Algoritmi

  1. stop = ((UInt64)Math.Sqrt(num));



non usare l'operatore di casting, che rallenta il programma, ma usa la classe Convert, metodo ToInt64 in questo modo:

Codice sorgente - presumibilmente Algoritmi

  1. stop = Convert.ToInt64(Math.Sqrt(num));



In secondo luogo memorizzare i numeri in una lista ti è utile solo se crei un metodo che restituisce l'insieme di numeri primi, e non se hai intenzione di scriverli immediatamente a video. Infine è molto più semplice prendere un numero dispari e verificare che non sia multiplo di tutti i numeri da 3 a n-1. Io personalmente continuo ad usare questo:

Codice sorgente - presumibilmente C++

  1. public static List<int> NumeriPrimi(long nMax) {
  2.     List<int> res = new List<int>(2, 3, 5, 7, 11, 13, 17);
  3.     for (long i = 19; i <= nMax; i += 2) {
  4.         bool primo = true;
  5.         for (long o = 3; o < i; o++) {
  6.             if (i % o == 0) {
  7.                 primo = false;
  8.             }
  9.         }
  10.         if (primo) {
  11.             res.Add(i);
  12.         }
  13.     }
  14.     return res;
  15. }



Così ho cercato di ottimizzarlo al massimo ma sicuramente ci sono soluzioni migliori. Buona fortuna!!

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 20:51
Mercoledì, 27/11/2013
Testo quotato

Postato originariamente da tuttodiMC:
Codice sorgente - presumibilmente Algoritmi

  1. stop = ((UInt64)Math.Sqrt(num));



non usare l'operatore di casting, che rallenta il programma, ma usa la classe Convert, metodo ToInt64 in questo modo:

Codice sorgente - presumibilmente Algoritmi

  1. stop = Convert.ToInt64(Math.Sqrt(num));





Uh? :noway:

In quale maniera l'operatore di casting rallenterebbe il programma rispetto all'invocazione di un metodo di conversione?


Il mio blog: https://piero.dev
PM Quote
Avatar
Fharamir (Normal User)
Rookie


Messaggi: 21
Iscritto: 06/05/2011

Segnala al moderatore
Postato alle 21:26
Mercoledì, 27/11/2013
@nessuno:
Il tuo sistema può essere usato solo se hai una lista finita di numeri, io non voglio che questo abbia un limite.
Il programma com cui ho comparato, comunque, ha lo stesso funzionamento del mio.


@tuttodiMC
Non sapevo che l'operatore di casting rallentasse così rispetto al convert. Grazie :)
Per quanto riguarda la memorizzazione la uso perché così posso usare i numeri che ho trovato per controllare quelli successivi;
evitando così di usare i numeri non primi come possibili divisori.
Forse però se la memorizzazione toglie molto tempo conviene controllarli tutti indifferentemente...

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6405
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 21:38
Mercoledì, 27/11/2013
Testo quotato

Postato originariamente da Fharamir:

Il tuo sistema può essere usato solo se hai una lista finita di numeri, io non voglio che questo abbia un limite.



Il limite lo hai naturalmente in ogni codice (il tuo, il mio ... non importa) ed è determinato dal tipo di dato usato.

Testo quotato

Il programma com cui ho comparato, comunque, ha lo stesso funzionamento del mio.



Eh? In che senso? Hai solamente contato il numero di linee? Boh ...



Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Fharamir (Normal User)
Rookie


Messaggi: 21
Iscritto: 06/05/2011

Segnala al moderatore
Postato alle 21:50
Mercoledì, 27/11/2013
Il limite è il tipo di dato e la memoria a disposizione, quindi perché aggiungerne un altro?

"Il programma com cui ho comparato, comunque, ha lo stesso funzionamento del mio."

Mi spiace se non mi sono spiegato bene. Intendevo dire che entrambi i programmi partono
da un numero e stampano a video i numeri primi che trovano (e contemporaneamente li scrivono su file).
Sono quindi 2 programmi equivalenti.

Ultima modifica effettuata da Fharamir il 27/11/2013 alle 21:51
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6405
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 21:56
Mercoledì, 27/11/2013
Testo quotato

Postato originariamente da Fharamir:

Il limite è il tipo di dato e la memoria a disposizione, quindi perché aggiungerne un altro?



Forse non mi spiego bene ... è lo *stesso limite* di cui stiamo parlando ... se assegni a n il valore massimo del tipo di dato che utilizzi, hai lo stesso limite nei due codici ...

Testo quotato

Sono quindi 2 programmi equivalenti.



No ... due programmi *non sono equivalenti* solo per il risultato che conseguono.
Esistono programmi con migliaia di linee e che vengono eseguiti in tempi biblici e programmi molto corti che vengono eseguiti molto più velocemente. Solo a parità di linee di codice e di tempo potrai parlare di "programmi equivalenti".

Il concetto è semplice ... perché "riscopri l'acqua calda"? Gli algoritmi (e anche i codici che li implementano) per l'individuazione dei numeri primi sono arcinoti e c'è stata tanta gente che ci ha sbattuto la testa. Che senso ha scrivere "altro codice" che peggiora quelli esistenti? :noway:


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 22:38
Mercoledì, 27/11/2013
Nessuno gli fa notare che le varie funzioni Scomponi* sono almeno O(n) ? con n la lunghezza del numero convertito in stringa? Sai che il metodo ToString non è affatto _gratis_?

E' proprio l'approccio che è sbagliato, serve un'impementazione molto più matematica e molto meno "traduco la teoria a parole poi dalle parole ottengo il codice".

Non so se mi sono spiegato, ma quel codice scala malissimo :)

PM Quote
Pagine: [ 1 2 3 4 ] Precedente | Prossimo