Moltiplicazione intera quando un intero è fisso


35

Sia A un intero positivo fisso di dimensione n bit.

Uno è autorizzato a pre-elaborare questo numero intero come appropriato.

Dato un altro numero intero positivo B di dimensione m bit, qual è la complessità della moltiplicazione AB ?

(max(n,m))1+ϵϵ=0


6
Dato , basta costruire una tabella di ricerca con voci. (Ovviamente questo non è quello che volevi, ma penso che dovresti rendere le tue esigenze più specifiche ...)A2n
Jukka Suomela,

9
Penso che la domanda abbia perfettamente senso nel modello di circuito booleano standard.
Noam,

4
Potresti riassumere gli evidenti limiti superiore e inferiore e i migliori risultati di cui sei a conoscenza? Dimostra che ti preoccupi del problema e che ci hai pensato, e dà a tutti gli altri incentivi a pensare al tuo problema.
Robin Kothari,

4
Penso che chi chiede implicitamente significhi che la parte preelaborata deve occupare solo spazio. (Il multimetro a matrice ha quella proprietà.)nO(1)
Ryan Williams,

Mi piacerebbe sapere cosa ti piacerebbe; Mi sento come se potessi affrontare infiniti casi su questo. Questa è la mia prima risposta, quindi sono particolarmente felice di provare a darti quante più informazioni possibile. Se lo desideri, puoi inviarmi un'e-mail a mgroff100@hotmail.com e sarei felice di lavorare con te molto di più.
Matt Groff,

Risposte:


20

Sebbene non sia sempre l'algoritmo più efficiente, questa domanda ha una relazione molto stretta con le catene di addizione; qualsiasi algoritmo per il calcolo di A catena di addizione rapida si traduce in un algoritmo per il calcolo di f(B)=AB per aggiunta ripetuta (ogni aggiunta, ovviamente, essendo un'operazione O(n) ). Al contrario, un algoritmo rapido per calcolare AB per qualsiasi B porta a un algoritmo rapido per calcolare A, ma ovviamente questo algoritmo non deve necessariamente avere la forma di una catena di addizione; tuttavia, sembra un ottimo punto di partenza. Dai un'occhiata a http://en.wikipedia.org/wiki/Addition_chain o dai un'occhiata a vol. 2 di The Art Of Computer Programming per maggiori dettagli.


17

Per espandere l'idea di Steven Stadnicki, possiamo rapidamente costruire un algoritmo ingenuo che fa meglio della moltiplicazione di matrici usando la trasformata discreta di Fourier.

Contiamo il numero di quelli in . Se meno della metà dei bit sono uno, costruiamo un elenco collegato delle loro posizioni. Per moltiplicare, spostiamo semplicemente B a sinistra per ciascuna posizione nell'elenco (moltiplicando per quel bit rappresentato) e aggiungiamo i risultati.AB

Se più della metà dei bit sono uno, facciamo lo stesso come sopra, ma invece utilizziamo gli zeri per popolare l'elenco delle posizioni. L'idea è che sottrarremo questa somma dalla somma che si otterrebbe moltiplicando per tutti. Per ottenere la somma di tutti, spostiamo per il numero di bit in A e sottraiamo B da questo. Quindi possiamo sottrarre la nostra somma ottenuta dall'elenco collegato.BAB

Possiamo chiamarlo l'algoritmo ingenuo dell'elenco collegato. Il suo tempo di esecuzione è nel peggiore dei casi, ma O ( | B | O(n2)nel caso medio, che è più veloce di DFT per i piccoli| A| .O(|B||A|2π)|A|

Per utilizzare l'idea degli elenchi in modo ottimale, utilizziamo divide-and-conquer. Dividiamo a metà e troviamo le dimensioni degli elenchi associati usando l'algoritmo ingenuo. Se sono maggiori di 5, chiamiamo nuovamente l'algoritmo ingenuo a metà maggiore di 5 finché non riusciamo a tagliare tutte le metà a meno di cinque. (Questo perché possiamo ridurre questo a 4 sottrazioni)A

Ancora meglio, miglioriamo il nostro algoritmo di divisione e conquista. Esaminiamo tutte le possibili combinazioni di ramificazione, selezionando avidamente la migliore. Questa preelaborazione richiede approssimativamente lo stesso tempo della moltiplicazione effettiva.

Se ci viene concessa la libertà infinita con la pre-elaborazione, risolviamo l'algoritmo di divisione e conquista ottimizzato per tutti i rami in modo ottimale. Questo richiede tempo nel peggiore dei casi, ma dovrebbe essere ~ ottimale con i metodi della catena di addizione.O(2|A|)

Sto lavorando per calcolare valori più esatti per gli algoritmi di cui sopra.


Ciao Matt: cos'è e | B | ? |A||B|
T ....

è la dimensione di A , sostanzialmente il numero di elementi di A . Ciò equivale a n , ovvero | A | n . Lo stesso per | B | . Tuttavia, questa formula è ancora assicurata quando n è diverso per A e B . |A|AAn|A|n|B|nAB
Matt Groff,

17

Il documento chiamato Moltiplicazione per una costante è sublineare ( PDF ) fornisce un algoritmo per operazioni di spostamento / aggiunta, dovenè la dimensione della costante.O(nlogn)n

In sostanza, funziona cercando i -bits nella costante, spostando e aggiungendo il numero essere moltiplicato solo per quelle 1 bit della costante (come lungo la moltiplicazione per binario, dove un 0 bit nel numero inferiore di essere mezzi moltiplicati all'inizio non viene spostata e aggiunse, mentre un 1 bit significa la parte superiore viene spostato e aggiunto). Tuttavia, questo è ancora O ( n ) , perché nella costante possono esserci O ( n ) 1 bit.1101O(n)O(n) 1

Il documento parla quindi di cambiare la rappresentazione numerica della costante nel sistema numerico a doppia base, dove apparentemente le bitanze non sono più rare, se la conversione viene eseguita correttamente (è un sistema numerico molto ridondante). Calcolano quanto sia scarso; il numero di bit diversi da zero è limitato a meno di O ( n ) , quindi è necessario un numero sublineare di aggiunte. Tuttavia è ancora O ( n m0O(n)operazioni effettive, dovute alcostoO(m)di ogni addizione (dovenè la dimensione della costante emè la dimensione dell'altro numero).O(nmlogn)O(m)nm

Quindi, per rispondere alla tua domanda, sì, c'è un risultato simile alla moltiplicazione matrice-vettore, in quanto ottieni un speedup se è costante; ma ovviamente questo aumento di velocità è solo un'ingenua moltiplicazione lunga e esistono algoritmi di moltiplicazione che sono di gran lunga migliori di O ( n 2lognè possibile ottenere con questo algoritmo.O(n2logn)


@JAS questa è la mia specialità: D.
Realz Slaw,

3
Questo è apparso in ARITH 2007 come dx.doi.org/10.1109/ARITH.2007.24 (per completezza).
András Salamon,

10

Come suggerito da Matt Groff, potresti essere interessato a cercare ispirazione nella community di esercitazioni (o se nella tua situazione è all'interno della larghezza di bit di una CPU corrente). In effetti, il problema della moltiplicazione dei numeri interi per una costante è stato considerato da molti scrittori di compilatori e progettisti di circuiti, sebbene di solito siano interessati a "multipler-less multipler" (moltiplicare usando shift, add e sottrazione). Uno dei primi riferimenti di cui sono a conoscenza è (l'ho imparato dalla sezione 8.4 di Hacker's Delight):n

Bernstein, R. (1986), Moltiplicazione per costanti intere. Software: pratica ed esperienza, 16: 641–652. doi: 10.1002 / spe.4380160704

Qui è possibile trovare lavori più moderni di Vincent Lefèvre (assicurati di vedere i suoi lavori di follow-up), e nota anche un progetto CMU sulla sintesi efficiente dei circuiti (vedi i riferimenti lì). Quest'ultimo progetto considera anche la moltiplicazione simultanea per un insieme di costanti.

PS Ti incoraggio a considerare di cambiare il tuo nome utente in qualcosa di riconoscibile.


9

I am not sure whether this is directly relevant to the question, but the following elementary result might be of interest. Given a fixed natural number k, the operation nkn can be realized by a sequential automaton, provided that n is written in reversed binary notation (that is, Least Significant Bit First). The number of states of the automaton is k/2r where 2r is the largest power of 2 dividing k. For instance, the operation n6n is realized by the following automaton. enter image description here

185=1+8+16+32+1286×185=1110=2+4+16+64+1024. Thus, in reverse binary, 185 is written as 10011101 and 1110 (bad choice, I know...) as 01101010001. Processing the entry 10011101 on this automaton gives the path

0011101000011110211200110201
which gives the correct output 01101010001. The type of sequential automaton I am using here was called subsequential by Schützenberger: as you can see there is an initial prefix (in green) and a terminal output function (also in green). For more details how this sequential machine can be computed in a systematic way, see this link.

Could you elaborate on your comment?
J.-E. Pin

k is prime >2.
T....

The construction of a sequential automaton realizing the operation nkn can be done for any k. However, computing this automaton might be easier for k prime.
J.-E. Pin

k2r is exponential.
T....

k is a fixed constant, not related to n.
J.-E. Pin
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.