Il giorno mercoledì 23 gennaio 2013 21:40:25 UTC+1, plinius ha scritto:
> Il 23/01/2013 00:16, r ha scritto:
>
> > Il giorno domenica 20 gennaio 2013 16:24:13 UTC+1, plinius ha scritto:
>
> >
>
> > con un piccolo accorgimento si pu� risparmiare quasi la met� del tempo nel caso di numeri primi molto alti ... ad esempio con 999999999999947# risparmia quasi 10 secondi (sulla mia cariola) impiegandone invece quasi 20 con la versione sigillata :-) ... si parla di una sola istruzione in pi�
quale ragionamento?
il risparmio maggiore lo hai proprio coi numeri primi perchè il ricalcolo di Sqr(N) è completamente inutile essendo N costante
>
>
>
> Dunque...
>
> � indubbiamente una buona idea quella di ridurre il limite massimo del
>
> Loop a t=Sqr(N) ogniqualvolta venga trovato un divisore perch�,
>
> ovviamente, questo consente una riduzione del tempo di esecuzione.
>
> L'escamotage per� non potrebbe dare nessun beneficio quando fossimo in
>
> presenza di un numero primo e quindi, non essendoci divisori, la
>
> function non ridimensiona mai t.
>
> Mi sono chiesto allora come mai la scomposizione di 999999999999947 (che
>
> � numero primo) fosse pi� veloce con la tua function e ho scoperto che
>
> dipende dal fatto che ad ogni ciclo la mia function doveva ricalcolare
>
> (pur restandone invariato il valore) Sqr(N)
infatti ... e non ci vedo nulla di strano ... ad ogni loop deve verificare una condizione è normale che vengano ricalcolate le funzioni
>
> Ho perci� inserito un t=Sqr(N) prima dell'inizio del Loop mettendo poi
come ho fatto io appunto ...
>
>
>
> Do While i <= t
>
> ...
>
> Loop
>
>
>
> invece di
>
>
>
> Do While i <= Sqr(N)
>
> ...
>
> Loop
>
> e i tempi di esecuzione sono miracolosamente diventati uguali! :-)
ecco ... probabilmente non l'hai nemmeno guardata la mia ... perchè è esattamente quello che ho fatto ...
>
> Resta comunque validissima la modifica perch�, quando ci sono divisori,
>
> effettivamente d� i suoi benefici, anche se, in quella ipotesi, i tempi
>
> si riducono moltissimo e le differenze di conseguenza diventano meno
>
> vistose.
>
> Per esempio la scomposizione di 999999999999934 = 2 * 499999999999967
>
> (quindi con il solo divisore 2) avviene in un caso in 2,2 secondi e
>
> nell'altro in 1,6 secondi. Ovviamente all'aumentare del numero di
>
> divisori o del loro valore le differenze diventano quasi irrilevanti.
>
l'istruzione va spostata nel posto dove N viene modificata ... se ciò non avvenisse il tempo perso sarebbe di gran lunga superiore a quello appena guadagnato ... in questo caso il tempo che risparmiamo è evidente in particolare per numeri non primi
>
> Quindi, concludendo, appongo volentieri anche il mio il sigillo a Scom2:
accipicchia ... quanti formalismi :-)
saluti
r