Sto codificando i grandi numeri interi in una matrice di size_t
. Ho già le altre operazioni in funzione (aggiungi, sottrarre, moltiplicare); così come la divisione di una singola cifra. Ma mi piacerebbe abbinare la complessità temporale dei miei algoritmi di moltiplicazione se possibile (attualmente Toom-Cook).Quale algoritmo dovrei usare per una divisione intera di grandi prestazioni?
Ho notato che ci sono algoritmi di tempo lineare per prendere varie nozioni di inversione moltiplicativa del mio dividendo. Ciò significa che potrei teoricamente ottenere una divisione nella stessa complessità temporale della mia moltiplicazione, perché l'operazione lineare-temporale è comunque "insignificante" al confronto.
La mia domanda è, come faccio a farlo? Che tipo di inversione moltiplicativa è la migliore nella pratica? Modulo 64^digitcount
? Quando moltiplico l'inversione moltiplicativa del mio divisore, posso sottrarre il calcolo della parte dei dati che verrebbe buttata via a causa del troncamento di interi? Qualcuno può fornire uno pseudocodice C o C++ o fornire una spiegazione precisa di come dovrebbe essere fatto?
Oppure esiste un algoritmo di divisione dedicato che è persino migliore rispetto all'approccio basato su inverso?
Modifica: ho individuato l'approccio "inverso" sopra menzionato. Nella pagina 312 di "Art of Computer Programming, Volume 2: Algoritmi seminali", Knuth fornisce "Algorithm R" che è un reciproco ad alta precisione. Dice che la sua complessità temporale è inferiore a quella della moltiplicazione. Tuttavia, non è banale convertirlo in C e testarlo, e non è chiaro quanta memoria di overhead, ecc., Sarà consumata fino a quando non la codifico, il che richiederebbe un po 'di tempo. Lo posterò se nessuno mi picchia.
Conoscete la complessità asintotica di questi metodi? In termini di numero di cifre passato nella funzione? Per confrontare con O (n^2) della moltiplicazione del tavolo, ecc. – VoidStar
'O (n * log (n))' sembra troppo veloce, è più veloce della moltiplicazione più veloce. Sospetto che per qualche motivo risulti un po 'più lento, ma ti risponderò se riesco a capire perché. – VoidStar
ha spostato i commenti per rispondere, ha aggiunto l'esempio di divisione lunga binaria con alcune informazioni ... – Spektre