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.AB
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.BAB
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.