Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Polestar 3 Performance, test drive: comodità e potenza possono convivere
Polestar 3 Performance, test drive: comodità e potenza possono convivere
Abbiamo passato diversi giorni alla guida di Polestar 3, usata in tutti i contesti. Come auto di tutti i giorni è comodissima, ma se si libera tutta la potenza è stupefacente
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
In occasione del proprio Architecture Deep Dive 2025 Qualcomm ha mostrato in dettaglio l'architettura della propria prossima generazione di SoC destinati ai notebook Windows for ARM di prossima generazione. Snapdragon X2 Elite si candida, con sistemi in commercio nella prima metà del 2026, a portare nuove soluzioni nel mondo dei notebook sottili con grande autonomia
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
DJI Mini 5 Pro porta nella serie Mini il primo sensore CMOS da 1 pollice, unendo qualità d'immagine professionale alla portabilità estrema tipica di tutti i prodotti della famiglia. È un drone C0, quindi in un peso estremamente contenuto e che non richiede patentino, propone un gimbal rotabile a 225 gradi, rilevamento ostacoli anche notturno e autonomia fino a 36 minuti. Caratteristiche che rendono il nuovo drone un riferimento per creator e appassionati
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 23-10-2004, 13:14   #1
andrea
Senior Member
 
L'Avatar di andrea
 
Iscritto dal: Jul 1999
Città: Roma
Messaggi: 614
[C++] Fibonacci tramite prodotto di matrici

Allora appunto stavo cercando di risolvere il problema di fibonacci tramite l'uso del metodo dei quadrati ripetuti applicato alle matrici, il problema e' che dopo aver scritto il mio bell codice che qui allego:

******************************************************
Codice:
#include <iostream>

using namespace std;

unsigned long Fibonacci6(unsigned long [][2], int);
void PotenzaMatrice(unsigned long[][2], int);
void Prodotto(unsigned long [][2], unsigned long[][2]);

unsigned long J[2][2] = {{1,1},{1,0}};
unsigned long app[2][2];

int main() {
 
   int n;
   unsigned long nesimo;
   unsigned long M[2][2]={{1,0},{0,1}};
 
   cout << "Inserisci l'n-esimo numero di fibonacci che vuoi calcolare: ";
   cin >> n;
   nesimo = Fibonacci6(M,n);
   cout << "L'n-esimo numero di fibonacci e': " << nesimo << endl;
       
   system("pause");
   return 0;
}

unsigned long Fibonacci6(unsigned long M[][2], int n) {
   PotenzaMatrice(M,n-1);
   return M[0][0];
}

void PotenzaMatrice(unsigned long M[][2], int n) {
   if (n > 1) {
      PotenzaMatrice(M,n/2);
      Prodotto(M,M);   
      M = app;
   }
   if ((n%2) == 1) {
      Prodotto(M,J);
      M = app;
   }   
}

void Prodotto(unsigned long Mat1[][2], unsigned long Mat2[][2]) {
    for (int i=1; i>=2; i++) 
        for (int j=1; j>=2; j++) {
           app[i][j] = 0;
           for (int k=1; k>=2; k++) {
               app[i][j]=app[i][j]+Mat1[i][k]*Mat2[k][j];
           }    
        }
}
******************************************************

non mi funziona una mazza mi da sempre uno per qualsiasi numero voglio calcolare che sia il 3 il 7 o che. Se qualcuno e' cosi gentile di dargli un occhiata. Purtroppo oltre tutto non so perche' non mi funziona il debugger del dev-c++

Poi un' altra domanda che non ha che vedere direttamente con il codice...teoricamente questo dovrebbe essere l'algoritmo piu' veloce per trovare i numeri di fibonacci o almeno piu' veloce rispetto all'algoritmo ricorsivo ed a quello iterativo...ma perche'?nella moltiplicazione di matrici non perdo molto piu' tempo rispetto soprattutto ad un algoritmo iterativo fatto in questo modo:

Codice:
 algoritmo fibonacci(intero n) -> intero
   a <- 1; b <- 1;
   for i=3 to n do
       c <- a + b;
        a <- b;  b <- c;
return b
__________________
...What you know that you time is close at hand, maybe then you'll begin to understand, life down there is just a strange illusion.

Ultima modifica di andrea : 24-10-2004 alle 11:18.
andrea è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2004, 20:42   #2
SnakePlissken
Member
 
L'Avatar di SnakePlissken
 
Iscritto dal: Aug 2004
Messaggi: 39
Se è la velocità che ti interessa, avevo trovato questa soluzione:

Codice:
   double fibo(register double n)  {
	register double F[3] = {1.0, 1.0, 0.0};
	register long long i;

	if ((n < 0) || (fmod(n, 1.0))
		return(-1);
	if (n <= 2)
		return(1);

	for (i=2; i<(long long)n; i++)
		F[i%3] = F[(i+4)%3] + F[(i+5)%3];

	return(F[(i-1)%3]);
   }
Ciao!
SnakePlissken è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2004, 11:34   #3
andrea
Senior Member
 
L'Avatar di andrea
 
Iscritto dal: Jul 1999
Città: Roma
Messaggi: 614
Intanto grazie per la risposta, dando un occhiata al codice da te scritto, mi sono accorto che in finale non e' altro che l'algoritmo in pseudocodice che avevo scritto prima trasposto in c ed ottimizzato naturalmente. Il fatto e' che quel tipo di algoritmo andandolo a studiare non e' piu' veloce rispetto quello con le matrici...visto che come tempo di esecuzione e' nell'ordine O(n) mentre quello con le matrici e di ordine O(log(N))! Poi naturalmente potrei sbagliare lo studio degli algoritmi pero' sinceramente non mi sembra.
__________________
...What you know that you time is close at hand, maybe then you'll begin to understand, life down there is just a strange illusion.
andrea è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2004, 14:33   #4
Banus
Senior Member
 
L'Avatar di Banus
 
Iscritto dal: Nov 2002
Città: Singularity
Messaggi: 894
Complimenti a SnakePlissken per il codice molto compatto ed elegante

Un algoritmo più efficiente di quello non lo conosco. In che cosa consiste il metodo dei quadrati ripetuti?
Banus è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2004, 15:31   #5
andrea
Senior Member
 
L'Avatar di andrea
 
Iscritto dal: Jul 1999
Città: Roma
Messaggi: 614
Quote:
Originariamente inviato da Banus
Complimenti a SnakePlissken per il codice molto compatto ed elegante
Si per il codice in se e' perfetto

Quote:

Un algoritmo più efficiente di quello non lo conosco. In che cosa consiste il metodo dei quadrati ripetuti?
L'idea di base e' la seguente: per calcolare ad esempio 3^8 si puo' moltiplicare 3 per 8 volte (3*3*3*3*3*3*3*3=6561) oppure ricorrere a quadrati ripetuti (ovvero, 3^2=9 9^2=3^4=81 81^2=3^8=6561). Con il metodo dei quadrati ripetuti si effettua un numero molto minore di moltiplicazioni. Con un po' di attenzione lo stesso metodo si puo' applicare a esponenti che non sono potenze di due e puo' anche essere adattato appunto a matrici.

nel seguente pseudo codice appunto e' applicato al'uso di matrici, per effettuare la serie di fibonacci:

Codice:
algoritmo fib(int n) -> n
   M <- [1,0;0,1] (matrice identita')
   PotenzaDiMatrice(M,N-1)
   return M[0][0]

procedura PotenzaDiMatrice(matrice M, int n/2)
   if ( n > 1) then
      PotenzaDiMatrice(M,n/2)
      M <- M * M

   if ( n e' dispari) then M <- M * [1,1;1,0]
In questo algoritmo tutto il tempo e' speso nella procedura potenza di matrice che calcola ricorsivamente la potenza n-esima della matrice M. Poi andando a studiare la relazione di ricorrenza dell'algoritmo appunto si arriva al risultato di O(log(n)) che appunto e' minore dell' O(n) che uno troverebbe studiando l'agoritmo del codice postato prima(Poi puo' darsi che ho sbagliato a studiarlo ma non mi sembra) quindi risulta che l'algoritmo delle matrice per trovare la serie di fibonacci e' piu' veloce di quello dell'algoritmo che usa il codice di SnakePlisSken.
__________________
...What you know that you time is close at hand, maybe then you'll begin to understand, life down there is just a strange illusion.
andrea è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2004, 16:15   #6
pela
Member
 
Iscritto dal: Jul 2003
Città: pisa
Messaggi: 141
esiste anche una formula per calcolarli, non so quanto sia efficiente (ci sono le potenze):
Codice:
Fn = 1/sqrt(5)*(((1+sqrt(5))/2)^(n+1)-((1-sqrt(5))/2)^(n+1))
le espressioni con la radice possono essere anche precalcolate, per non influire sulla velocità di esecuzione
pela è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2004, 16:33   #7
andrea
Senior Member
 
L'Avatar di andrea
 
Iscritto dal: Jul 1999
Città: Roma
Messaggi: 614
Quote:
Originariamente inviato da pela
esiste anche una formula per calcolarli, non so quanto sia efficiente (ci sono le potenze):
Codice:
Fn = 1/sqrt(5)*(((1+sqrt(5))/2)^(n+1)-((1-sqrt(5))/2)^(n+1))
le espressioni con la radice possono essere anche precalcolate, per non influire sulla velocità di esecuzione
Si la formula tramite la sezione aurea 1.618 appunto (1+sqrt(5))/2 pero' non conviene sopratutto poi per il problema degli arrotondamenti usando un accuratezza di tre cifre decimali appunto 1.618 gia' al 18° numero di fibonacci arrotondando si ottiene un numero non corretto.
__________________
...What you know that you time is close at hand, maybe then you'll begin to understand, life down there is just a strange illusion.
andrea è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2004, 16:55   #8
Banus
Senior Member
 
L'Avatar di Banus
 
Iscritto dal: Nov 2002
Città: Singularity
Messaggi: 894
Le formule approssimate ovviamente hanno complessità costante ma si paga con poca accuratezza... O(log(n)) mi pare un risultato soddisfacente per la soluzione esatta

Ho controllato il codice del primo post e ho visto che è sbagliata la funzione che calcola il prodotto fra matrici:

for (int i=1; i>=2; i++)

se ci ragioni un attimo la condizione non è mai vera. Forse volevi scrivere:

for (int i=1; i<=2; i++)

ma dal momento che le matrici sono di dimensione fissa e piccole (2x2) ti conviene codificarle con un vettore scrivendo esplicitamente la formula del prodotto per ciascun elemento. Dovrebbe essere anche più veloce, dal momento che non ha indici da incrementare.
Il resto del programma mi sembra corretto.

Ultima modifica di Banus : 24-10-2004 alle 16:59.
Banus è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2004, 17:02   #9
andrea
Senior Member
 
L'Avatar di andrea
 
Iscritto dal: Jul 1999
Città: Roma
Messaggi: 614
Quote:
Originariamente inviato da Banus

Ho controllato il codice del primo post e ho visto che è sbagliata la funzione che calcola il prodotto fra matrici:

for (int i=1; i>=2; i++)

se ci ragioni un attimo la condizione non è mai vire. Forse volevi scrivere:

for (int i=1; i<=2; i++)
ehm piccola svista

Quote:
ma dal momento che le matrici sono di dimensione fissa e piccole (2x2) ti conviene codificarle con un vettore scrivendo esplicitamente la formula del prodotto per ciascun elemento. Dovrebbe essere anche più veloce, dal momento che non ha indici da incrementare.
Il resto del programma mi sembra corretto.
Si concordo, nel modo in cui lo ho fatto mi era risultato piu' veloce scriverlo ma per una matrice 2x2 non ha molto senso
__________________
...What you know that you time is close at hand, maybe then you'll begin to understand, life down there is just a strange illusion.
andrea è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2004, 22:01   #10
SnakePlissken
Member
 
L'Avatar di SnakePlissken
 
Iscritto dal: Aug 2004
Messaggi: 39
Re: [C++] Fibonacci tramite prodotto di matrici

Quote:
Originariamente inviato da andrea
Purtroppo oltre tutto non so perche' non mi funziona il debugger del dev-c++
Probabilmente hai la beta 5 che è ancora in fase di sviluppo.


Quote:
Poi un' altra domanda che non ha che vedere direttamente con il codice...teoricamente questo dovrebbe essere l'algoritmo piu' veloce per trovare i numeri di fibonacci o almeno piu' veloce rispetto all'algoritmo ricorsivo ed a quello iterativo...ma perche'?nella moltiplicazione di matrici non perdo molto piu' tempo rispetto soprattutto ad un algoritmo iterativo fatto in questo modo:

Codice:
 algoritmo fibonacci(intero n) -> intero
   a <- 1; b <- 1;
   for i=3 to n do
       c <- a + b;
        a <- b;  b <- c;
return b
Oops... è vero, questo e il mio sono la stessa cosa. Scusa ma avevo fatto di fretta senza leggere bene il tuo messaggio .
Anzi devo riconoscere che il tuo, tradotto "letteralmente", è pure più veloce del mio perché non fa uso di matrici e si risparmia tutte quelle operazioni per determinare gli indici
Proprio per questo non capisco come quello che usa la moltiplicazione delle matrici (che ammetto che non conoscevo) possa essere più veloce. Quello che hai codificato in pseudo-codice si riduce ad operazioni di addizione e assegnamento e sarà per questo senz'altro più veloce. Tutto questo credo sia proprio dal punto di vista operativo, in termini di velocità oggettiva.
Purtroppo non ho un compilatore montato su questo PC. Prova a fare un confronto "sperimentale" tra le prestazione tra le due versioni e facci sapere. Anche quello mio comunque (che a questo punto sembra essere la meno efficiente delle tre... ) mi sembra che riuscisse nei calcoli con una certa facilità...

Quote:
esiste anche una formula per calcolarli, non so quanto sia efficiente (ci sono le potenze):

Codice:
Fn = 1/sqrt(5)*(((1+sqrt(5))/2)^(n+1)-((1-sqrt(5))/2)^(n+1))
le espressioni con la radice possono essere anche precalcolate, per non influire sulla velocità di esecuzione
In fondo precalcolando le operazioni, come avete già osservato, la precisione scende di molto, e forse anche ad una precisione di 15 cifre propria dei double il risultato non sarebbe del tutto affidabile. Ma non era elevato ad n e non a (n+1)?


Ma poi cos'è tutta sta mania di velocità ?!?
Il mio calcola il massimo numero calcolabile che rientra nei double (fibo(1476)) in un batter d'occhio!
(che rozzezza di spirito sto ragionamento... ! perdono!)
Voglio dire che comunque a livello operativo le differenze sono quasi impercettibili tra queste versioni.

Ciauz!

Ultima modifica di SnakePlissken : 24-10-2004 alle 22:06.
SnakePlissken è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2004, 22:47   #11
Banus
Senior Member
 
L'Avatar di Banus
 
Iscritto dal: Nov 2002
Città: Singularity
Messaggi: 894
Il metodo con le matrici è sicuramente più veloce del metodo iterativo perchè log(n) cresce molto più lentamente.

http://en.wikipedia.org/wiki/Fibonacci_number

Più che la velocità si cerca l'accuratezza nei calcoli. L'algoritmo con le matrici trova il risultato in meno passaggi.
Banus è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Polestar 3 Performance, test drive: comodità e potenza possono convivere Polestar 3 Performance, test drive: comodit&agra...
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026 Qualcomm Snapdragon X2 Elite: l'architettura del...
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice Recensione DJI Mini 5 Pro: il drone C0 ultra-leg...
ASUS Expertbook PM3: il notebook robusto per le aziende ASUS Expertbook PM3: il notebook robusto per le ...
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo Test ride con Gowow Ori: elettrico e off-road va...
ESA: rilevati 40 mila asteroidi vicino a...
La batteria salva fabbriche di EQORE ott...
SpaceX Starship: iniziati i test della t...
Datacenter IA nello spazio entro 5 anni,...
Telescopio spaziale James Webb: rilevato...
Ericsson Mobility Report: nel 2025 il 5G...
PLAI DEMO DAY: si chiude il secondo cicl...
Google rilascia Nano Banana Pro: il nuov...
ChatGPT si rinnova ancora: disponibile l...
Ring lancia super sconti di Black Friday...
Black Friday 2025: 450 euro di sconto su...
Tutte le offerte Blink in un unico posto...
OpenAI e Foxconn uniscono le forze per r...
Ricarica delle auto elettriche in 3 minu...
Lucid presenta Gravity Touring, il SUV e...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 00:06.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v