Sei eine feste positive ganze Zahl der Größe Bits.
Man darf diese ganze Zahl entsprechend vorverarbeiten.
Wie komplex ist die Multiplikation anderen positiven ganzen Zahl einer Größe von Bits ?
Beachten Sie, dass wir bereits -Algorithmen haben. Die Frage hier ist, ob wir von etwas klügerem nehmen können? ϵ = 0
cc.complexity-theory
ds.algorithms
circuit-complexity
algebraic-complexity
arithmetic-circuits
T ....
quelle
quelle
Antworten:
Es ist zwar nicht immer der effizienteste Algorithmus, aber diese Frage hängt sehr eng mit den Additionsketten zusammen. jeder Algorithmus zur Berechnung von schnell durch Zugabe Ketten führt zu einem Algorithmus zur Berechnung f ( B ) = A B durch wiederholte Addition (jede Zugabe natürlich ist , um ein O ( n ) Betrieb). Im Gegensatz dazu führt ein schneller Algorithmus zum Berechnen von A B für jedes B zu einem schnellen Algorithmus zum Berechnen von AA f(B)=AB O(n) AB B A Natürlich muss dieser Algorithmus nicht unbedingt die Form einer Additionskette haben. Dennoch scheint dies ein ausgezeichneter Ausgangspunkt zu sein. Schauen Sie sich http://en.wikipedia.org/wiki/Addition_chain an oder lesen Sie vol. 2 von The Art Of Computer Programming für weitere Details.
quelle
Um die Idee von Steven Stadnicki zu erweitern, können wir schnell einen naiven Algorithmus konstruieren, der besser als die Matrixmultiplikation mit der diskreten Fouriertransformation ist.
Wir zählen die Anzahl von Einsen in . Wenn weniger als die Hälfte der Bits Einsen sind, erstellen wir eine verknüpfte Liste ihrer Positionen. Zum Multiplizieren verschieben wir einfach B um jede Position in der Liste nach links (multiplizieren mit dem dargestellten Bit) und addieren die Ergebnisse.A B
Wenn mehr als die Hälfte der Bits Einsen sind, machen wir dasselbe wie oben, verwenden jedoch stattdessen die Nullen, um die Liste der Positionen aufzufüllen. Die Idee ist, dass wir diese Summe von der Summe subtrahieren, die durch Multiplikation mit allen erhalten würde. Um die Summe aller zu erhalten, verschieben wir um die Anzahl der Bits in A und subtrahieren B davon. Dann können wir unsere erhaltene Summe von der verknüpften Liste abziehen.B A B
Wir können das den naiven Linked-List-Algorithmus nennen. Seine Laufzeit ist im schlimmsten Fall , aber O ( | B | √O(n2) im Mittel schneller als DFT für kleine| A| .O(|B||A|2π−−−√) |A|
Um die Idee der Listen optimal zu nutzen, setzen wir Divide-and-Conquer ein. Wir teilen in zwei Hälften und ermitteln die Größe der zugehörigen Listen mit dem naiven Algorithmus. Wenn sie größer als 5 sind, rufen wir den naiven Algorithmus erneut für Hälften auf, die größer als 5 sind, bis es uns gelingt, alle Hälften auf weniger als fünf zu reduzieren. (Dies liegt daran, dass wir dies auf 4 Subtraktionen reduzieren können)A
Noch besser ist, dass wir unseren Divide-and-Conquer-Algorithmus verbessern. Wir durchlaufen alle möglichen Kombinationen von Verzweigungen und suchen gierig die beste aus. Diese Vorverarbeitung dauert ungefähr so lange wie die eigentliche Multiplikation.
Wenn wir bei der Vorverarbeitung uneingeschränkte Freiheit haben, lösen wir den optimierten Divide-and-Conquer-Algorithmus für alle Zweige optimal. Dies benötigt im schlimmsten Fall die Zeit , sollte jedoch durch Additionskettenverfahren optimal sein.O(2|A|)
Ich arbeite daran, genauere Werte für die obigen Algorithmen zu berechnen.
quelle
Die Arbeit Multiplikation mit einer Konstanten ist sublinear ( PDF ) gibt einen Algorithmus für Verschiebungs- / Additionsoperationen, wobeindie Größe der Konstante ist.O(nlogn) n
Im Wesentlichen funktioniert dies, indem die Bits in der Konstanten gesucht, verschoben und die zu multiplizierende Zahl nur für die 1- Bits in der Konstanten addiert werden (wie lange Multiplikation für Binär, wobei ein 0- Bit in der untersten zu multiplizierenden Zahl bedeutet Die Spitze wird nicht verschoben und hinzugefügt, während 1 Bit bedeutet, dass die Spitze verschoben und hinzugefügt wird. Dies ist jedoch immer noch O ( n ) , da die Konstante O ( n ) 1- Bit enthalten kann.1 1 0 1 O(n) O(n) 1
In dem Artikel wird dann über die Änderung der Zahlendarstellung der Konstanten in ein System mit zwei Basen gesprochen, bei dem die Nicht- Bits anscheinend spärlicher sind, wenn die Konvertierung korrekt durchgeführt wird (es ist ein sehr redundantes Zahlensystem). Sie berechnen, wie dünn es ist; Die Anzahl der Nicht-Null-Bits ist auf weniger als 0 ( n ) begrenzt , daher ist eine sublineare Anzahl von Additionen erforderlich. Es ist jedoch immer noch O ( n m0 O(n) tatsächliche Operationen aufgrund derO(m)-Kosten jeder Addition (wobeindie Größe der Konstanten undmdie Größe der anderen Zahl ist).O(nmlogn) O(m) n m
Um Ihre Frage zu beantworten: Ja, es gibt ein ähnliches Ergebnis wie bei der Matrix-Vektor-Multiplikation, da Sie eine Beschleunigung erhalten, wenn sie konstant ist. aber natürlich ist diese Beschleunigung nur über naive Langmultiplikation möglich, und es gibt Multiplikationsalgorithmen, die weitaus besser sind als O ( n 2logn Sie können mit diesem Algorithmus erhalten.O(n2logn)
quelle
Wie von Matt Groff vorgeschlagen, könnten Sie daran interessiert sein, in der Übungsgemeinschaft nach Inspirationen zu suchen (oder wenn in Ihrer Situation innerhalb der Bitbreite einer aktuellen CPU liegt). In der Tat wurde das Problem der ganzzahligen Multiplikation mit einer Konstanten von vielen Compilerschreibern und Schaltungsentwicklern in Betracht gezogen, obwohl sie normalerweise an einem "Multiplikator ohne Multiplikator" (Multiplizieren mit Verschiebung, Addition und Subtraktion) interessiert sind. Eine der frühen Referenzen, die mir bekannt sind, ist (das habe ich in Abschnitt 8.4 von Hacker's Delight erfahren.):n
Bernstein, R. (1986), Multiplikation mit ganzzahligen Konstanten. Software: Praxis und Erfahrung, 16: 641–652. doi: 10.1002 / spe.4380160704
Modernere Arbeit von Vincent Lefèvre kann gefunden werden hier (unbedingt Follow-up - Arbeiten zu sein , um zu sehen), und er stellt auch ein CMU - Projekt auf effiziente Schaltungssynthese (siehe die Referenzen dort). Das letztere Projekt berücksichtigt sogar die gleichzeitige Multiplikation mit einer Reihe von Konstanten.
PS: Ich empfehle Ihnen, in Betracht zu ziehen, Ihren Benutzernamen in einen erkennbaren Namen zu ändern.
quelle
Ich bin mir nicht sicher, ob dies für die Frage direkt relevant ist, aber das folgende elementare Ergebnis könnte von Interesse sein. Wenn eine feste natürliche Zahl , kann die Operation n → k n durch einen sequentiellen Automaten realisiert werden, vorausgesetzt, dass n in umgekehrter binärer Notation geschrieben ist (d. H. Das am wenigsten signifikante Bit zuerst). Die Anzahl der Zustände des Automaten ist k / 2 r, wobei 2 r die größte Potenz von 2 ist, die k teilt . Beispielsweise wird die Operation n → 6 n durch den folgenden Automaten realisiert.k n→kn n k/2r 2r 2 k n→6n
quelle