Qual è l'algoritmo più veloce per la moltiplicazione di due numeri a n cifre?


21

Voglio sapere quale algoritmo è il più veloce per la moltiplicazione di due numeri a n cifre? La complessità dello spazio può essere rilassata qui!


1
Sei interessato alla domanda teorica o alla domanda pratica?
Yuval Filmus,

Entrambi, ma più inclini a quello pratico!
Andy,

1
Per la domanda pratica, raccomando di usare GMP. Se sei curioso di sapere cosa usano, guarda la documentazione o il codice sorgente.
Yuval Filmus,

Nessuno sa. Non l'abbiamo ancora trovato.
JeffE,

Risposte:


22

Al momento l'algoritmo di Fürer di Martin Fürer ha una complessità temporale di che utilizza trasformazioni di Fourier su numeri complessi. Il suo algoritmo si basa in realtà sull'algoritmo di Schönhage e Strassen che ha una complessità temporale dinlog(n)2Θ(log*(n))Θ(nlog(n)log(log(n)))

Altri algoritmi che sono più veloci dell'algoritmo di moltiplicazione della scuola elementare sono la moltiplicazione di Karatsuba che ha una complessità temporale di ≈ e l'algoritmo Toom 3 che ha una complessità temporale diO ( n 1.585 ) Θ ( n 1.465 )O(nlog23)O(n1.585)Θ(n1.465)

Si noti che questi sono gli algoritmi veloci. Trovare algoritmo più veloce per la moltiplicazione è un problema aperto in Informatica.

Riferimenti :

  1. Algoritmo di Fürer
  2. Moltiplicazione basata su FFT di grandi numeri
  3. Trasformata di Fourier veloce
  4. Moltiplicazione Toom – Cook
  5. Algoritmo di Schönhage – Strassen
  6. Algoritmo di Karatsuba

Si noti la recente articolo di D. Harvey e J. van der Hoeven (Marzo 2019) descrivono un algoritmo con complessità. O(nlnn)
Hardmath

9

Si noti che gli algoritmi FFT elencati da avi aggiungono una grande costante, rendendoli poco pratici per numeri inferiori a migliaia + bit.

Oltre a tale elenco, ci sono altri algoritmi interessanti e domande aperte:

  • Moltiplicazione del tempo lineare su un modello RAM (con precomputazione)
  • La moltiplicazione per una costante è sublineare ( PDF ) - questo significa un numero sublineare di aggiunte che ottiene per un totale dicomplessità bit. Ciò è essenzialmente equivalente alla lunga moltiplicazione (in cui si sposta / aggiunge in base al numero di1s nel numero inferiore), che èO(n2), ma con unavelocitàO(logn).O(n2logn)1O(n2)O(logn)
  • Sistema di numerazione dei residui e altre rappresentazioni di numeri; la moltiplicazione è tempo quasi lineare. Il rovescio della medaglia è che la moltiplicazione è modulare e {rilevamento di overflow, parità, confronto di magnitudo} sono tutti duri o quasi tanto difficili quanto convertire il numero in rappresentazione binaria o simile e fare il confronto tradizionale; questa conversione è almeno negativa quanto la moltiplicazione tradizionale (al momento, AFAIK).
    • Altre rappresentazioni:
      • 16×32=2log216+log232=24+5=29
        • L'aspetto negativo è che la conversione da e verso la rappresentazione logaritmica può essere dura quanto la moltiplicazione o più difficile, la rappresentazione può anche essere frazionaria / irrazionale / approssimativa ecc. Altre operazioni (addizione?) Sono probabilmente più difficili.
      • 36×48=3251×223141=22324151
      • Il rovescio della medaglia è, richiede fattori o fattorizzazione, un problema molto più difficile della moltiplicazione. Altre operazioni come l'addizione sono probabilmente molto difficili.

1
Credo che un approccio basato sul teorema del residuo / residuo cinese con i moduli giusti possa portare a accelerazioni rispetto alla moltiplicazione tradizionale anche con la conversione indietro; ad un certo punto questo era nel capitolo 4 del TAOCP, almeno come nota a piè di pagina. (Non si avvicina ancora ai metodi basati su FFT, ma è una nota storica interessante)
Steven Stadnicki,

@StevenStadnicki oh cool, allora devo guardarlo; ti capita di conoscere la complessità?
Realz Slaw,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.