Buonasera, avrei una piccola domanda da porvi. Stavo guardando un po di algoritmi per effettuare i prodotti tra valori interi in maniera efficiente, scoprendo come le moltiplicazioni vengano effettivamente svolte dal processore; domanda che mi sono sempre posto ma alla quale non ho mai dato risposta. Quando mi è venuto in mente un algoritmo con complessità proporzionale al numero di bit necessari per rappresentare gli operandi della moltiplicazione (per intenderci con N bit per operando saranno necessarie N operazioni, tutte con complessità O(1)). Si basa sul semplice concetto di andare a riscrivere uno degli operandi sotto forma di somme di potenze di due, così da andare a semplificare la moltiplicazione in una serie di somme di prodotti con potenze di due, e quindi semplici ed efficienti shift aritmetici verso sinistra.
Cioè:
Questa definizione dovrebbe essere corretta visto che ogni numero positivo, che sia pari o dispari, può essere riscritto sotto forma di somme di potenze di due.
Proprio perché b deve essere positivo, viene prima effettuato il complemento a due se negativo e impostato un flag che sarà controllato alla fine dell'algoritmo per complementare il risultato.
Per calcolare le potenze di due in cui è scomponibile il numero l'algoritmo analizza semplicemente la rappresentazione binaria di quest' ultimo, proprio per questo il numero di operazioni richieste equivale al numero di bit cui si compongono gli operandi.
Per esempio:
Mi chiedo quindi se questo algoritmo esiste, e se esiste qual'è il suo nome grazie.
Inoltre vorrei sapere quanto potrebbe essere efficiente una sua implementazione a livello hardware. Teoricamente sono necessari un numero di cicli di clock pari al numero di bit richiesti per rappresentare l'operando scomposto (vengono analizzati i bit a zero anche se ignorati) e dovrebbe essere quindi poco efficiente già con valori a 32bit, o sbaglio?
Grazie.
(avrei dovuto utilizzare il tag MATH per scrivere qualche formula matematica più decorosa, ma non so come si faccia, scusate).
Cioè:
Codice:
a * b = a * (2^k0 + 2^k1 + 2^k3 ... + 2^kn )
Proprio perché b deve essere positivo, viene prima effettuato il complemento a due se negativo e impostato un flag che sarà controllato alla fine dell'algoritmo per complementare il risultato.
Per calcolare le potenze di due in cui è scomponibile il numero l'algoritmo analizza semplicemente la rappresentazione binaria di quest' ultimo, proprio per questo il numero di operazioni richieste equivale al numero di bit cui si compongono gli operandi.
Per esempio:
Codice:
345 * 856 = (345 * 2^3) + (345 * 2^4) + (345 * 2^6) + (345 * 2^8) + (345 * 2^9).
Infatti 856 in binario equivale a: 1 1 0 1 0 1 1 0 0 0 -- bit.
9 8 7 6 5 4 3 2 1 0 -- n. cifra.
Inoltre vorrei sapere quanto potrebbe essere efficiente una sua implementazione a livello hardware. Teoricamente sono necessari un numero di cicli di clock pari al numero di bit richiesti per rappresentare l'operando scomposto (vengono analizzati i bit a zero anche se ignorati) e dovrebbe essere quindi poco efficiente già con valori a 32bit, o sbaglio?
Grazie.
(avrei dovuto utilizzare il tag MATH per scrivere qualche formula matematica più decorosa, ma non so come si faccia, scusate).