2011-11-19 16 views
12

http://en.wikipedia.org/wiki/Binary_GCD_algorithmAlgoritmo binario GCD vs algoritmo di Euclide sui computer moderni

Questa voce di Wikipedia ha un'implicazione molto insoddisfacente: l'algoritmo di Binary GCD era un tempo fino al 60% più efficiente rispetto l'algoritmo standard Euclide, ma come Verso la fine del 1998, Knuth concluse che c'era un guadagno di efficienza solo del 15% sui suoi computer contemporanei.

Pozzo altri 15 anni è passato ... come fanno questi due algoritmi impilano oggi con i progressi in hardware?

Il GCD binario continua a sovraperformare l'algoritmo euclideo nei linguaggi di basso livello ma rimane indietro a causa della sua complessità nei linguaggi di livello superiore come Java? O è la differenza contraria al computing moderno?

Perché mi interessa che tu possa chiedere? Mi è capitato di dover processare come 100 miliardi di questi oggi :) Ecco un brindisi per vivere in un'epoca di informatica (povero Euclide).

+0

si può avere un punto di riferimento per testarli, in un solo ciclo (ad esempio dimensioni del 1000) creare un elenco di numeri casuali, e allora per ogni coppia di calcolare numero binario e in un altro ciclo calcolare euclid MCD, ciò che è il problema? IMO, Ancora nei computer moderni il binario dovrebbe essere più veloce specialmente con numeri più grandi. –

+0

Potrei, e sarebbe abbastanza rappresentativo di una particolare lingua su un particolare processore su un particolare sistema operativo. Questa è un'operazione numerica abbastanza comune che ero curioso più in generale di quale fosse la soluzione preferita oggi nelle applicazioni ad alte prestazioni. – jkschneider

+0

Se devi fare 100 miliardi oggi, qualsiasi tempo speso a discutere la soluzione più efficiente ti costerà più tempo perso rispetto all'implementazione dell'uno o dell'altro. –

risposta

5

La risposta è "dipende". Dipende da hardware, compilatore, implementazione specifica, qualsiasi cosa ho dimenticato. Sulle macchine con divisione lenta, il GCD binario tende a sovraperformare l'algoritmo Euclideo. L'ho confrontato un paio di anni fa su un Pentium4 in C, Java e alcuni altri linguaggi, in generale in quel benchmark, gcd binario con una tabella di ricerca di 256 elementi batteva l'algoritmo di Euclide con un fattore compreso tra 1,6 e quasi 3. Euclideo si avvicinava quando invece di dividere immediatamente, prima venivano eseguiti alcuni round di sottrazione. Non ricordo le cifre, ma il file binario era ancora molto più veloce.

Se la macchina ha divisione veloce, le cose possono essere diverse, dal momento che l'algoritmo di Euclide ha bisogno di un minor numero di operazioni. Se la differenza di costo tra divisione e sottrazione/spostamento è abbastanza piccola, il binario sarà più lento. Quale è meglio nelle tue circostanze, devi scoprirlo benchmarking te stesso.