Schönhage-Strassen-Algorithmus

Der Schönhage-Strassen-Algorithmus ist ein Algorithmus zur Multiplikation zweier n-stelliger ganzer Zahlen. Er wurde 1971 von Arnold Schönhage und Volker Strassen entwickelt.[1] Der Algorithmus basiert auf einer sehr schnellen Variante der diskreten schnellen Fourier-Transformation sowie einem geschickten Wechsel zwischen der Restklassen- und der zyklischen Arithmetik in endlichen Zahlenringen.

Der Schönhage-Strassen-Algorithmus terminiert in O ( n log ( n ) log ( log ( n ) ) ) {\displaystyle O{\Big (}n\cdot \log(n)\cdot \log {\big (}\log(n){\big )}{\Big )}} (siehe Landau-Notation), wenn als Effizienzmaß die Bitkomplexität auf mehrbändigen Turingmaschinen, also die maximale Laufzeit des Algorithmus gemessen als benötigte Bitoperationen in Abhängigkeit von der Bitlänge n {\displaystyle n} der Eingabegrößen gewählt wird. Diese Komplexität stellt eine Verbesserung sowohl gegenüber dem naiven aus der Schule bekannten Algorithmus der Laufzeit O ( n 2 ) {\displaystyle O\left(n^{2}\right)} als auch gegenüber dem 1962 entwickelten Karatsuba-Algorithmus mit einer Laufzeit von O ( n log 2 ( 3 ) ) {\displaystyle O\left(n^{\log _{2}(3)}\right)} sowie dessen verbesserter Variante, dem Toom-Cook-Algorithmus mit O ( n 1 + ε ) {\displaystyle O(n^{1+\varepsilon })} Laufzeit dar.

Der Schönhage-Strassen-Algorithmus war von 1971 bis 2007 der effizienteste bekannte Algorithmus zur Multiplikation großer Zahlen; 2007 veröffentlichte Martin Fürer eine Weiterentwicklung des Algorithmus mit der noch niedrigeren asymptotischen Komplexität n log ( n ) 2 O ( log ( n ) ) {\displaystyle n\cdot \log(n)\cdot 2^{O(\log ^{*}(n))}} , wobei log ( n ) {\displaystyle \log ^{*}(n)} der iterierte Logarithmus von n ist.[2] Durch Optimierungen des Algorithmus von Fürer erreichten David Harvey, Joris van der Hoeven und Grégoire Lecerf 2014 eine Verbesserung der asymptotischen Laufzeit auf O ( n log ( n ) 2 3 log ( n ) ) {\displaystyle O(n\cdot \log(n)\cdot 2^{3\log ^{*}(n)})} .[3] Harvey und van der Hoeven stellten 2021 schließlich einen weiteren Algorithmus vor, der die von Schönhage und Strassen postulierte Laufzeit von O ( n log ( n ) ) {\displaystyle O(n\cdot \log(n))} erreicht.[4]

Bedeutung

Bis 2007 galt der Schönhage-Strassen-Algorithmus als effizientester bekannter Algorithmus für ganzzahlige Multiplikation. Als untere Schranke gibt es für den allgemeinen Fall nur die (triviale) lineare Laufzeit, an die sich der Algorithmus mit wachsender Zahlenlänge annähert. Allerdings haben die Forscher Hinweise dafür gefunden, dass die Schranke O ( n log ( n ) ) {\displaystyle O(n\cdot \log(n))} niemals unterboten werden kann. Selbst bei modernen Computern ist diese Methode der Berechnung erst bei Zahlen mit mehreren tausend Stellen effizienter als der Karatsuba-Algorithmus. Dies liegt wohl allerdings weniger am Overhead des Schönhage-Strassen-Algorithmus, sondern vielmehr an der seit Jahrzehnten typischen Designoptimierung der Computerprozessoren, die dem Erreichen schneller Gleitkommaoperationen den Vorzug vor der Arithmetik in endlichen Restklassenringen ganzer Zahlen gibt.

Für die Suche nach den Algorithmen mit der besten (Zeit-)Komplexität in der Computer-Algebra genießt der Schönhage-Strassen-Algorithmus zentrale Bedeutung.

Algorithmus

Grundidee und Terminologie

Der Schönhage–Strassen-Algorithmus basiert auf der schnellen diskreten Fourier-Transformation (DFT). Dieses Beispiel zeigt die Berechnung von 1234 × 5678 = 7006652. Die Berechnung findet modulo 337 statt. Um die Anschaulichkeit zu verbessern, wird anstelle der Basis 2 mit Basis 10 gearbeitet.

Um zwei ganze Zahlen a {\displaystyle a} und b {\displaystyle b} zu multiplizieren, wird im Groben folgendes Schema angewandt:

  1. Aufspaltung der Zahlen (in Binärdarstellung) a {\displaystyle a} und b {\displaystyle b} in Stücke passender Länge
  2. Schnelle diskrete Fourier-Transformation (DFT) der beiden Stückfolgen
  3. Komponentenweise Multiplikation der transformierten Stücke
  4. Rücktransformation (inverse Fouriertransformation) der Ergebnisse
  5. Zusammensetzen der Ergebnisstücke zur Ergebniszahl

Die im mittleren Schritt durchzuführenden kleinen Multiplikationen werden im rekursiven Sinne wiederum durch den Schönhage-Strassen-Algorithmus ausgeführt.

Um zu verstehen, warum das Ergebnis das Produkt der Zahlen a und b ist, betrachtet man die Polynome

A = i = 0 2 n 1 a i X i {\displaystyle A=\sum _{i=0}^{2^{n}-1}a_{i}\cdot X^{i}} und B = i = 0 2 n 1 b i X i {\displaystyle B=\sum _{i=0}^{2^{n}-1}b_{i}\cdot X^{i}}

Setzt man X = 2 {\displaystyle X=2} ein, so erhält man gerade die Binärdarstellung der Zahlen a und b. Zu berechnen ist c = C ( 2 ) {\displaystyle c=C(2)} für das Produktpolynom

C = l = 0 2 n + 1 1 i = 0 l a i b l i X l {\displaystyle C=\sum _{l=0}^{2^{n+1}-1}\sum _{i=0}^{l}a_{i}b_{l-i}\cdot X^{l}}

Wir bestimmen die Fouriertransformierte der Koeffiziententupel von A und B:

a ^ k = i = 0 2 n 1 a i w i k {\displaystyle {\hat {a}}_{k}=\sum _{i=0}^{2^{n}-1}a_{i}\cdot w^{i\cdot k}} für k = 0 , , 2 n 1 {\displaystyle k=0,\ldots ,2^{n}-1}
b ^ k = j = 0 2 n 1 b j w j k {\displaystyle {\hat {b}}_{k}=\sum _{j=0}^{2^{n}-1}b_{j}\cdot w^{j\cdot k}} für k = 0 , , 2 n 1 {\displaystyle k=0,\ldots ,2^{n}-1}

Anders gesagt wertet man die beiden Polynome an den Stellen w k {\displaystyle w^{k}} aus. Multipliziert man nun diese Funktionswerte, so ergeben sich die entsprechenden Funktionswerte des Produktpolynoms

C = A B {\displaystyle C=A\cdot B} .

Um das Polynom C {\displaystyle C} selbst zu gewinnen, müssen wir die Transformation rückgängig machen:

c ^ l = 1 / 2 n + 1 k = 0 2 n + 1 1 a ^ k b ^ k w l k {\displaystyle {\hat {c}}_{l}=1/2^{n+1}\sum _{k=0}^{2^{n+1}-1}{\hat {a}}_{k}\cdot {\hat {b}}_{k}\cdot w^{-l\cdot k}} für l = 0 , , 2 n + 1 1 {\displaystyle l=0,\ldots ,2^{n+1}-1}
c ^ l = 1 / 2 n + 1 i , j , k = 0 2 n + 1 1 a i b j w i k + j k l k {\displaystyle {\hat {c}}_{l}=1/2^{n+1}\sum _{i,j,k=0}^{2^{n+1}-1}a_{i}b_{j}\cdot w^{i\cdot k+j\cdot k-l\cdot k}} für l = 0 , , 2 n + 1 1 {\displaystyle l=0,\ldots ,2^{n+1}-1}
c ^ l = 1 / 2 n + 1 i , j , k = 0 2 n + 1 1 a i b j w ( i + j l ) k {\displaystyle {\hat {c}}_{l}=1/2^{n+1}\sum _{i,j,k=0}^{2^{n+1}-1}a_{i}b_{j}\cdot w^{(i+j-l)\cdot k}} für l = 0 , , 2 n + 1 1 {\displaystyle l=0,\ldots ,2^{n+1}-1}

Nach Definition der Einheitswurzeln gilt w 2 n + 1 = 1 {\displaystyle w^{\,{2^{n+1}}}=1} . Diese genügt folgender Identität geometrischer Summen von Einheitswurzeln:

k = 0 2 n + 1 1 w l k = { 2 n + 1 l = 0 0 l 0 {\displaystyle \displaystyle \sum _{k=0}^{{2^{n+1}}-1}w^{lk}={\begin{cases}2^{n+1}&l=0\\0&l\neq 0\end{cases}}} für l = 0 , . . . , 2 n + 1 1 {\displaystyle l=0,...,2^{n+1}-1}

denn

k = 0 2 n + 1 1 x k = x 2 n + 1 1 x 1 {\displaystyle \displaystyle \sum _{k=0}^{2^{n+1}-1}x^{k}={\frac {x^{2^{n+1}}-1}{x-1}}} für x 1 {\displaystyle x\neq 1}

Somit gilt:

c ^ l = i + j = l a i b j {\displaystyle {\hat {c}}_{l}=\sum _{i+j=l}a_{i}b_{j}} für l = 0 , , 2 n + 1 1 {\displaystyle l=0,\ldots ,2^{n+1}-1}

Im Artikel Diskrete Fourier-Transformation sind die mathematische Grundlagen dieser Transformation weiter ausgeführt. Da bei der Transformation 2 n {\displaystyle 2^{n}} Summen mit jeweils 2 n {\displaystyle 2^{n}} Termen entstehen, haben wir bei einer klassischen Berechnung der Terme (etwa durch das Horner-Schema) nach wie vor eine quadratische Laufzeit. Mittels der schnellen Fourier-Transformation kann man diese Werte schneller berechnen. Diese Berechnung beruht auf folgendem Teile-und-herrsche-Prinzip:

a ^ k e v e n ( w j ) = i = 0 2 n 1 a j w 2 j k {\displaystyle {\hat {a}}_{k}^{even}(w^{j})=\sum _{i=0}^{2^{n}-1}a_{j}\cdot w^{2j\cdot k}}
a ^ k o d d ( w j ) = i = 0 2 n 1 a j w ( 2 j + 1 ) k {\displaystyle {\hat {a}}_{k}^{odd}(w^{j})=\sum _{i=0}^{2^{n}-1}a_{j}\cdot w^{(2j+1)\cdot k}}
a ^ k ( w j ) = a k e v e n ( w 2 j ) + w k a k o d d ( w 2 j ) {\displaystyle {\hat {a}}_{k}(w^{j})=a_{k}^{even}(w^{2j})+w^{k}\cdot a_{k}^{odd}(w^{2j})}

Man setzt Teillösungen mittels einfacher Operationen (Addition und einfache Multiplikation) zusammen. Damit können die Transformationen in Zeit O ( N log N ) {\displaystyle O(N\cdot \log N)} berechnet werden. Durch das Runden der komplexen Einheitswurzeln auf feste Stellenlänge ergeben sich jedoch Rechenfehler. Um diese auszugleichen, muss für ein resultierendes Bit mit mindestens O ( log N ) {\displaystyle O(\log N)} Bits gerechnet werden. Daraus ergibt sich eine Gesamtlaufzeit von O ( N ( log N ) 2 ) {\displaystyle O(N\cdot (\log N)^{2})} . Bei der Schönhage-Strassen-Variante rechnen wir stattdessen in einem Restklassenring und vermeiden damit die Rechenfehler der komplexen Zahlen.

Des Weiteren ist die Multiplikation keine reine Faltung, sondern es kann auch zu Überträgen kommen; nach Durchführen der FT und iFT müssen diese passend behandelt werden.

Die Aufgabe der Multiplikation zweier ganzer Zahlen wird nun wie folgt konkretisiert:

Es seien die zwei zu multiplizierenden Zahlen a , b Z {\displaystyle a,b\in \mathbb {Z} } in Binärzifferdarstellung gegeben. Weiter sei N {\displaystyle N} die maximale Länge (also Binärziffernanzahl) der beiden Zahlen.

Nach passender Behandlung der Vorzeichen der beiden Zahlen sowie der trivialen Sonderfälle a = 0 {\displaystyle a=0} und b = 0 {\displaystyle b=0} (was mit linearem Aufwand O ( N ) {\displaystyle O(N)} machbar ist) darf man davon ausgehen, dass a , b N {\displaystyle a,b\in \mathbb {N} } natürliche Zahlen sind. Der Schönhage-Strassen-Algorithmus löst diese Aufgabe in O ( N log N log log N ) {\displaystyle O(N\cdot \log N\cdot \log \log N)} .

Theoretische Vorbereitungen

Superschnelle DFT

Die oben angesprochene superschnelle DFT, die das Kernstück des Algorithmus darstellt, muss etwas ausführlicher erläutert werden, da sie hier sehr speziell eingesetzt wird.

Es sei R {\displaystyle R} ein kommutativer unitärer Ring. In R {\displaystyle R} sei das Element 2 {\displaystyle 2} eine Einheit; weiterhin sei w R {\displaystyle w\in R} eine 2 n {\displaystyle 2^{n}} te Einheitswurzel (also w 2 n = 1 {\displaystyle w^{2^{n}}=1} ), die die Gleichheit w 2 n 1 = 1 {\displaystyle w^{2^{n-1}}=-1} erfüllt. Dann lässt sich die Berechnung der diskreten Fouriertransformation (DFT) im Produktraum R 2 n {\displaystyle R^{2^{n}}} (dies ist eine Kurznotation für R ( 2 n ) {\displaystyle R^{(2^{n})}} ; der Begriff Vektorraum ist hier nur für den Fall, dass R {\displaystyle R} ein Körper ist, üblich) wie folgt in einer schnellen Variante (als FFT) durchführen:

Zu berechnen ist für a = ( a 0 , , a 2 n 1 ) R 2 n {\displaystyle a=(a_{0},\ldots ,a_{2^{n}-1})\in R^{2^{n}}} die Transformierte a ^ R 2 n {\displaystyle {\hat {a}}\in R^{2^{n}}} mit

a ^ k = j = 0 2 n 1 a j w j k {\displaystyle {\hat {a}}_{k}=\sum _{j=0}^{2^{n}-1}a_{j}\cdot w^{j\cdot k}} für k = 0 , , 2 n 1 {\displaystyle k=0,\ldots ,2^{n}-1} .

Indem wir die Indizes k = ν = 0 n 1 k ν 2 ν {\displaystyle k=\sum _{\nu =0}^{n-1}k_{\nu }\cdot 2^{\nu }} und j = ν = 0 n 1 j ν 2 n 1 ν {\displaystyle j=\sum _{\nu =0}^{n-1}j_{\nu }\cdot 2^{n-1-\nu }} in Binärdarstellung aufschreiben, wobei wir dies bei der Zahl j {\displaystyle j} in umgekehrter Reihenfolge tun, ist die Transformierte a ^ {\displaystyle {\hat {a}}} wie folgt optimiert berechenbar:

Es seien

A 0 ( j 0 , j n 1 ) = a j {\displaystyle A_{0}(j_{0},\ldots j_{n-1})=a_{j}} für j = 0 , , 2 n 1 {\displaystyle j=0,\ldots ,2^{n}-1}

und

A r + 1 ( k 0 , , k r , j r + 1 , , j n 1 ) = {\displaystyle A_{r+1}(k_{0},\ldots ,k_{r},j_{r+1},\ldots ,j_{n-1})=}
= A r ( k 0 , , k r 1 , 0 , j r + 1 , , j n 1 ) + {\displaystyle =A_{r}(k_{0},\ldots ,k_{r-1},0,j_{r+1},\ldots ,j_{n-1})+}
A r ( k 0 , , k r 1 , 1 , j r + 1 , , j n 1 ) w 2 n 1 r ( k r 2 r + + k 0 2 0 ) {\displaystyle A_{r}(k_{0},\ldots ,k_{r-1},1,j_{r+1},\ldots ,j_{n-1})\cdot w^{2^{n-1-r}\cdot (k_{r}2^{r}+\dots +k_{0}2^{0})}}
= j r = 0 1 A r ( k 0 , , k r 1 , j r , , j n 1 ) w j r 2 n 1 r ( k r 2 r + + k 0 2 0 ) {\displaystyle =\sum _{j_{r}=0}^{1}A_{r}(k_{0},\ldots ,k_{r-1},j_{r},\ldots ,j_{n-1})\cdot w^{j_{r}2^{n-1-r}\cdot (k_{r}2^{r}+\dots +k_{0}2^{0})}} .

Die geschlossene Darstellung für diese Zwischenterme ist

A r + 1 ( k 0 , , k r , j r + 1 , , j n 1 ) = {\displaystyle A_{r+1}(k_{0},\ldots ,k_{r},j_{r+1},\ldots ,j_{n-1})=}
= j r = 0 1 j 0 = 0 1 a j w ( j 0 2 n 1 + + j r 2 n 1 r ) ( k r 2 r + + k 0 2 0 ) {\displaystyle =\sum _{j_{r}=0}^{1}\ldots \sum _{j_{0}=0}^{1}a_{j}\cdot w^{(j_{0}2^{n-1}+\ldots +j_{r}2^{n-1-r})\cdot (k_{r}2^{r}+\dots +k_{0}2^{0})}} .

(Zum Nachrechnen dieser Darstellung beachte man w ( j 0 2 n 1 + + j r 1 2 n r ) k r 2 r = 1 {\displaystyle w^{(j_{0}2^{n-1}+\ldots +j_{r-1}2^{n-r})\cdot k_{r}2^{r}}=1} ).

Diese Rekursion liefert die gewünschten Fourierkoeffizienten a ^ k = A n ( k 0 , , k n 1 ) {\displaystyle {\hat {a}}_{k}=A_{n}(k_{0},\ldots ,k_{n-1})} .

Aufgrund der Eigenschaft w 2 n 1 = 1 {\displaystyle w^{2^{n-1}}=-1} können wir den Rekursionsschritt etwas berechnungsfreundlicher umformen zu

A r + 1 ( k 0 , , k r 1 , 0 , j r + 1 , , j n 1 ) = {\displaystyle A_{r+1}(k_{0},\ldots ,k_{r-1},0,j_{r+1},\ldots ,j_{n-1})=}
= A r ( k 0 , , k r 1 , 0 , j r + 1 , , j n 1 ) + A r ( k 0 , , k r 1 , 1 , j r + 1 , , j n 1 ) w x {\displaystyle =A_{r}(k_{0},\ldots ,k_{r-1},0,j_{r+1},\ldots ,j_{n-1})+A_{r}(k_{0},\ldots ,k_{r-1},1,j_{r+1},\ldots ,j_{n-1})\cdot w^{x}}

und

A r + 1 ( k 0 , , k r 1 , 1 , j r + 1 , , j n 1 ) = {\displaystyle A_{r+1}(k_{0},\ldots ,k_{r-1},1,j_{r+1},\ldots ,j_{n-1})=}
= A r ( k 0 , , k r 1 , 0 , j r + 1 , , j n 1 ) A r ( k 0 , , k r 1 , 1 , j r + 1 , , j n 1 ) w x {\displaystyle =A_{r}(k_{0},\ldots ,k_{r-1},0,j_{r+1},\ldots ,j_{n-1})-A_{r}(k_{0},\ldots ,k_{r-1},1,j_{r+1},\ldots ,j_{n-1})\cdot w^{x}}

mit dem gleichen Exponenten x = 2 n 1 r ( k r 1 2 r 1 + + k 0 2 0 ) {\displaystyle x=2^{n-1-r}\cdot (k_{r-1}2^{r-1}+\ldots +k_{0}2^{0})} .

Die Umkehrtransformation, also die inverse FFT, gelingt, da wir vorausgesetzt haben, dass 2 {\displaystyle 2} im Ring R {\displaystyle R} invertierbar ist:

A r ( k 0 , , k r 1 , 0 , j r + 1 , , j n 1 ) = {\displaystyle A_{r}(k_{0},\ldots ,k_{r-1},0,j_{r+1},\ldots ,j_{n-1})=}
= 2 1 ( A r + 1 ( k 0 , , k r 1 , 0 , j r + 1 , , j n 1 ) + A r + 1 ( k 0 , , k r 1 , 1 , j r + 1 , , j n 1 ) {\displaystyle =2^{-1}{\big (}A_{r+1}(k_{0},\ldots ,k_{r-1},0,j_{r+1},\ldots ,j_{n-1})+A_{r+1}(k_{0},\ldots ,k_{r-1},1,j_{r+1},\ldots ,j_{n-1})}

sowie

A r ( k 0 , , k r 1 , 1 , j r + 1 , , j n 1 ) = {\displaystyle A_{r}(k_{0},\ldots ,k_{r-1},1,j_{r+1},\ldots ,j_{n-1})=}
= 2 1 w x ( A r + 1 ( k 0 , , k r 1 , 0 , j r + 1 , , j n 1 ) A r + 1 ( k 0 , , k r 1 , 1 , j r + 1 , , j n 1 ) {\displaystyle =2^{-1}w^{-x}{\big (}A_{r+1}(k_{0},\ldots ,k_{r-1},0,j_{r+1},\ldots ,j_{n-1})-A_{r+1}(k_{0},\ldots ,k_{r-1},1,j_{r+1},\ldots ,j_{n-1})} ,

wobei wiederum x = 2 n 1 r ( k r 1 2 r 1 + + k 0 2 0 ) {\displaystyle x=2^{n-1-r}\cdot (k_{r-1}2^{r-1}+\ldots +k_{0}2^{0})} ist.

In der Anwendung im Schönhage-Strassen-Algorithmus wird tatsächlich nur eine halbierte FFT benötigt; gemeint ist damit folgendes: Beginnen wir im 1. Schritt der Rekursion mit der Berechnung

A 1 ( 1 , j 1 , , j n 1 ) = A 0 ( 0 , j 1 , , j n 1 ) A 0 ( 1 , j 1 , , j n 1 ) = a j a j + 2 n 1 {\displaystyle A_{1}(1,j_{1},\ldots ,j_{n-1})=A_{0}(0,j_{1},\ldots ,j_{n-1})-A_{0}(1,j_{1},\ldots ,j_{n-1})=a_{j}-a_{j+2^{n-1}}}

nur für k 0 = 1 {\displaystyle k_{0}=1} und schränken wir die weiteren Schritte der Rekursion ebenso auf k 0 = 1 {\displaystyle k_{0}=1} ein, so berechnen wir gerade alle a ^ k {\displaystyle {\hat {a}}_{k}} für ungerade Werte k {\displaystyle k} . Will man umgekehrt aus diesen a ^ k {\displaystyle {\hat {a}}_{k}} für ungerade k {\displaystyle k} (das sind 2 n 1 {\displaystyle 2^{n-1}} Stück) lediglich die Differenzen a j a j + 2 n 1 {\displaystyle a_{j}-a_{j+2^{n-1}}} der ursprünglichen a j {\displaystyle a_{j}} zurückgewinnen, so genügt auch in der Rückrichtung die halbierte Rekursion.

Im Schönhage-Strassen-Algorithmus wird die geschilderte schnelle Fouriertransformation für endliche Zahlenringe Z F n {\displaystyle \mathbb {Z} _{F_{n}}} mit Fermatzahlen F n = 2 ( 2 n ) + 1 {\displaystyle F_{n}=2^{(2^{n})}+1} benötigt.

Hinweis zur Notation: Für den Restklassenring Z / k Z {\displaystyle \mathbb {Z} /k\mathbb {Z} } benutzen wir hier die kürzere Schreibweise Z k {\displaystyle \mathbb {Z} _{k}} , die lediglich im Kontext der p-adischen Zahlen zu Verwechslungen führen könnte.

Als Einheitswurzel wird im Ring Z F n {\displaystyle \mathbb {Z} _{F_{n}}} die Zahl 2 {\displaystyle 2} (oder je nach Kontext auch eine geeignete Potenz von 2) zum Einsatz kommen. Die beim FFT-Algorithmus durchzuführenden Multiplikationen sind dann von der Form x 2 k {\displaystyle x\cdot 2^{k}} ; allerdings sind sie nicht als reine Shift-Operationen durchführbar, da das Reduzieren eines größeren Zwischenergebnisses modulo F n {\displaystyle F_{n}} noch nachgeschoben werden muss. Hier greift eine der brillanten Ideen von Schönhage und Strassen: Sie betten den Ring (ausgestattet mit der Restklassenarithmetik) passend in einen größeren, mit der zyklischen Arithmetik ausgestatteten Überring ein. Dieser Überring hat eine 2-Potenz als Ordnung, so dass in ihm die entsprechende Multiplikation tatsächlich als reine Shift-Operation durchführbar ist. Diesen Trick kann man in einem schönen Struktursatz über Restklassen- und zyklische Arithmetik in endlichen Zahlenringen zusammenfassen.

Struktursatz über zyklische Arithmetik

Der Struktursatz über zyklische Arithmetik lässt sich formal wie folgt fassen:

Für eine Zweierpotenz D = 2 n {\displaystyle D=2^{n}} mit einer natürlichen Zahl n N {\displaystyle n\in \mathbb {N} } gilt

( Z D + 1 , + , ) ( Z D 2 , , ) / ( D + 1 ) Z {\displaystyle (\mathbb {Z} _{D+1},+,\cdot )\cong (\mathbb {Z} _{D^{2}},\oplus ,\otimes )/(D+1)\cdot \mathbb {Z} } .

Hierbei bezeichnet ( Z D + 1 , + , ) {\displaystyle (\mathbb {Z} _{D+1},+,\cdot )} die durch die Repräsentanten 0 , , D {\displaystyle 0,\ldots ,D} darstellbaren Restklassen modulo D + 1 {\displaystyle D+1} ausgestattet mit der Restklassenarithmetik, d. h. mit der Addition und Multiplikation modulo D + 1 {\displaystyle D+1} . Die in diesem Restklassenring vorkommenden Zahlen können mit n + 1 {\displaystyle n+1} Binärziffern dargestellt werden.

Die auf der rechten Seite vorkommende Struktur ( Z D 2 , , ) {\displaystyle (\mathbb {Z} _{D^{2}},\oplus ,\otimes )} bezeichnet die Restklassen modulo der Zahl D 2 {\displaystyle D^{2}} , die allerdings nicht mit der Restklassenarithmetik, sondern abweichend mit der zyklischen Arithmetik ausgestattet werden. Hierbei werden bei Zwischenergebnissen, die zu groß werden, Überträge aufgehoben und auf das Endergebnis additiv aufgeschlagen. Dies entspricht in Binärzifferdarstellung einer Verschiebung der überständigen Binärziffern (rechtsbündig an die niedrigsten Zifferpositionen gestellt) mit nachfolgender Addition. Beispielsweise ergibt die Addition a + 1 {\displaystyle a+1} mit a = D 2 1 {\displaystyle a=D^{2}-1} nicht den Wert D 2 0 {\displaystyle D^{2}\equiv 0} , sondern den Wert D 2 + 1 1 {\displaystyle D^{2}+1\equiv 1} . Aus der so erhaltenen Zahlenstruktur mit zyklischer Arithmetik wird nun noch der Faktorring modulo D + 1 {\displaystyle D+1} gebildet. Es werden also die Endergebnisse noch modulo D + 1 {\displaystyle D+1} reduziert.

Damit besagt dieser Struktursatz folgendes: Das modulo-Rechnen in Z D + 1 {\displaystyle \mathbb {Z} _{D+1}} kann ebenso ersetzt werden durch das zyklische Rechnen im größeren Zahlenraum Z D 2 {\displaystyle \mathbb {Z} _{D^{2}}} mit nachfolgendem Reduzieren modulo D + 1 {\displaystyle D+1} .

Entscheidend für das Gelingen der in diesem Struktursatz vorgestellten Einbettung ist die Eigenschaft, dass die größte darstellbare Zahl F {\displaystyle F} im zyklischen Zahlenraum (hier ist dies die Zahl D 2 1 {\displaystyle D^{2}-1} ) die Zahl 0 {\displaystyle 0} aus dem Restklassenring Z D + 1 {\displaystyle \mathbb {Z} _{D+1}} repräsentiert. Hierfür ist die Bedingung ( D + 1 ) | F {\displaystyle (D+1)|F} notwendig. Damit die zyklische Arithmetik aber überhaupt sinnvoll definiert werden kann, muss andererseits F + 1 {\displaystyle F+1} eine Zweierpotenz sein. Zusammen ergibt sich, dass F = D 2 1 {\displaystyle F=D^{2}-1} die optimale Wahl für die Größe des zyklischen Einbettungsraumes darstellt.

Der klassische Restklassenring ( Z D 2 , + , ) {\displaystyle (\mathbb {Z} _{D^{2}},+,\cdot )} wäre für die Einbettung dagegen nicht geeignet, denn in diesem Ring gilt 2 2 n = D 2 = 0 {\displaystyle 2^{2n}=D^{2}=0} , d. h. die Zahl 2 {\displaystyle 2} ist in diesem Ring ein Nullteiler.

Durchführung

Haben wir die zu multiplizierenden Zahlen a , b {\displaystyle a,b} mit N 2 m {\displaystyle N\leq 2^{m}} Binärziffern vorliegen, so führen wir je nachdem, ob m {\displaystyle m} gerade oder ungerade ist, unterschiedliche Rekursionsschritte aus, um die Stellenzahl in einem Einzelschritt zu logarithmieren:

Rekursionsschritt für ungerades m

Diesen Schritt der Rückführung von m = 2 n 1 {\displaystyle m=2n-1} auf n {\displaystyle n} führen wir mit der Komplexität O ( 2 n ψ ( 2 n ) + n 2 2 n ) {\displaystyle O\left(2^{n}\psi (2^{n})+n\cdot 2^{2n}\right)} durch.

Es seien a , b Z F m {\displaystyle a,b\in \mathbb {Z} _{F_{m}}} mit m = 2 n 1 {\displaystyle m=2n-1} und der Fermatzahl F m = 2 2 m + 1 {\displaystyle F_{m}=2^{2^{m}}+1} zu multiplizieren. Wir werden in diesem Schritt die Rückführung auf die Fermatzahl F n = 2 2 n + 1 {\displaystyle F_{n}=2^{2^{n}}+1} vollziehen.

Für die zu den beiden Fermatzahlen gehörenden Zweierpotenzen führen wir die Abkürzungen

D = F n 1 = 2 2 n {\displaystyle D=F_{n}-1=2^{2^{n}}}

und

E = F m 1 = 2 2 2 n 1 = D 2 n 1 {\displaystyle E=F_{m}-1=2^{2^{2n-1}}=D^{2^{n-1}}}

ein. Die halbierte Stellenzahl von D {\displaystyle D} wird unsere Stückelungsgröße werden, d. h. wir entwickeln a {\displaystyle a} und b {\displaystyle b} nach Potenzen von D {\displaystyle {\sqrt {D}}} :

a = i = 0 2 n a i D i {\displaystyle a=\sum _{i=0}^{2^{n}}a_{i}\cdot {\sqrt {D}}^{i}\quad } und b = i = 0 2 n b i D i {\displaystyle \quad b=\sum _{i=0}^{2^{n}}b_{i}\cdot {\sqrt {D}}^{i}} ,

wobei für die Einzelstücke 0 a i , b i < D {\displaystyle 0\leq a_{i},b_{i}<{\sqrt {D}}} gilt. In Binärdarstellung entspricht diese Zerlegung einer einfachen Gruppierung der Bitfolgen in Stücke der Länge 2 n 1 {\displaystyle 2^{n-1}} Bits.

Eine kleine Schwäche des Algorithmus (die allerdings der erreichten Komplexitätsschranke keinen Abbruch tut) offenbart sich jetzt. Um die superschnelle DFT auf die Stückfolgen ( a 0 , , a 2 n ) {\displaystyle (a_{0},\ldots ,a_{2^{n}})} und ( b 0 , , b 2 n ) {\displaystyle (b_{0},\ldots ,b_{2^{n}})} anwenden zu können, müssen diese zur nächsten Zweierpotenzlänge mit Nullen aufgefüllt werden; die Zahlendarstellung wird also künstlich verlängert zu

a = i = 0 2 n + 1 1 a i D i {\displaystyle a=\sum _{i=0}^{2^{n+1}-1}a_{i}\cdot {\sqrt {D}}^{i}} und b = j = 0 2 n + 1 1 b j D j {\displaystyle b=\sum _{j=0}^{2^{n+1}-1}b_{j}\cdot {\sqrt {D}}^{j}} .

Vermöge des oben erwähnten Struktursatzes zur zyklischen Arithmetik wechseln wir nun vom Restklassenring Z E + 1 {\displaystyle \mathbb {Z} _{E+1}} über zum Quotientenraum ( Z E 2 , , ) / ( E + 1 ) Z {\displaystyle (\mathbb {Z} _{E^{2}},\oplus ,\otimes )/(E+1)\cdot \mathbb {Z} } mit der zyklischen Arithmetik. In diesem Raum errechnet sich für die Multiplikationsaufgabe

a b = ( i = 0 2 n + 1 1 a i D i ) ( j = 0 2 n + 1 1 b j D j ) {\displaystyle a\cdot b=\left(\sum _{i=0}^{2^{n+1}-1}a_{i}{\sqrt {D}}^{i}\right)\cdot \left(\sum _{j=0}^{2^{n+1}-1}b_{j}{\sqrt {D}}^{j}\right)}
= k = 0 2 n + 2 2 ( i , j = 0 i + j = k 2 n + 1 1 a i b j ) D k {\displaystyle =\sum _{k=0}^{2^{n+2}-2}\left(\sum _{i,j=0 \atop i+j=k}^{2^{n+1}-1}a_{i}\cdot b_{j}\right){\sqrt {D}}^{k}}
= k = 0 2 n + 1 1 ( i , j = 0 i + j = k 2 n + 1 1 a i b j ) D k + k = 0 2 n + 1 1 ( i , j = 0 i + j = 2 n + 1 + k 2 n + 1 1 a i b j ) D 2 n + 1 + k {\displaystyle =\sum _{k=0}^{2^{n+1}-1}\left(\sum _{i,j=0 \atop i+j=k}^{2^{n+1}-1}a_{i}\cdot b_{j}\right){\sqrt {D}}^{k}+\sum _{k=0}^{2^{n+1}-1}\left(\sum _{i,j=0 \atop i+j=2^{n+1}+k}^{2^{n+1}-1}a_{i}\cdot b_{j}\right){\sqrt {D}}^{2^{n+1}+k}}
= k = 0 2 n + 1 1 ( i , j = 0 i + j k mod 2 n + 1 2 n + 1 1 a i b j ) D k {\displaystyle =\sum _{k=0}^{2^{n+1}-1}\left(\sum _{i,j=0 \atop i+j\equiv k\mod 2^{n+1}}^{2^{n+1}-1}a_{i}\cdot b_{j}\right){\sqrt {D}}^{k}} ,

wobei wir im letzten Schritt die Eigenschaft D 2 n + 1 = D 2 n = E 2 = 1 {\displaystyle {\sqrt {D}}^{2^{n+1}}=D^{2^{n}}=E^{2}=1} in diesem zyklischen Zahlenraum benutzt haben.

Zusammenfassend erhält die Multiplikation also die Form

a b = k = 0 2 n + 1 1 c k D k {\displaystyle a\cdot b=\sum _{k=0}^{2^{n+1}-1}c_{k}{\sqrt {D}}^{k}}

mit den Ergebniskoeffizienten

c k = i , j = 0 i + j k mod 2 n + 1 2 n + 1 1 a i b j {\displaystyle c_{k}=\sum _{i,j=0 \atop i+j\equiv k\mod 2^{n+1}}^{2^{n+1}-1}a_{i}\cdot b_{j}} .

Wir können c k < 2 n + 1 D {\displaystyle c_{k}<2^{n+1}D} nach oben abschätzen.

Nun folgt eine Umschreibung der Summenformel, damit wir uns bei der anzuwendenden FFT auf eine halbierte FFT beschränken können.

Es gilt c k + 2 n D k + 2 n = c k + 2 n D k E = c k + 2 n D k {\displaystyle c_{k+2^{n}}{\sqrt {D}}^{k+2^{n}}=c_{k+2^{n}}{\sqrt {D}}^{k}E=-c_{k+2^{n}}{\sqrt {D}}^{k}} , also ist

a b = k = 0 2 n 1 ( c k c k + 2 n ) D k {\displaystyle a\cdot b=\sum _{k=0}^{2^{n}-1}(c_{k}-c_{k+2^{n}}){\sqrt {D}}^{k}}

mit 2 n + 1 D < c k c k + 2 n < 2 n + 1 D {\displaystyle -2^{n+1}D<c_{k}-c_{k+2^{n}}<2^{n+1}D} in Z E + 1 {\displaystyle \mathbb {Z} _{E+1}} . Durch passende Addition können wir den Wertebereich ins Positive verschieben, es ist nämlich 0 < c k c k + 2 n + 2 n + 1 D < 2 n + 2 D {\displaystyle 0<c_{k}-c_{k+2^{n}}+2^{n+1}D<2^{n+2}D} , und mit der Definition

z k = { c k c k + 2 n + 2 n + 1 D , 0 k < 2 n 2 n + 1 D , 2 n k < 2 n + 1 {\displaystyle z_{k}={\Big \lbrace }{c_{k}-c_{k+2^{n}}+2^{n+1}D,\quad 0\leq k<2^{n} \atop 2^{n+1}D,\quad \quad 2^{n}\leq k<2^{n+1}}}

gilt

a b = k = 0 2 n + 1 1 z k D k {\displaystyle a\cdot b=\sum _{k=0}^{2^{n+1}-1}z_{k}{\sqrt {D}}^{k}} .

Für die nichttrivialen z k {\displaystyle z_{k}} (Indizes 0 {\displaystyle 0} bis 2 n 1 {\displaystyle 2^{n}-1} ) gilt die Abschätzung 0 < z k < 2 n + 2 D < 2 n + 2 F n {\displaystyle 0<z_{k}<2^{n+2}D<2^{n+2}F_{n}} . Da die beiden Zahlen 2 n + 2 {\displaystyle 2^{n+2}} und F n {\displaystyle F_{n}} teilerfremd ist, genügt zur Bestimmung der z k {\displaystyle z_{k}} die Berechnung der Reste z k mod 2 n + 2 {\displaystyle z_{k}\mod 2^{n+2}} und z k mod F n {\displaystyle z_{k}\mod F_{n}} .

Hat man nämlich die Reste z k = ξ mod F n {\displaystyle z_{k}=\xi \mod F_{n}} und z k = η mod 2 n + 2 {\displaystyle z_{k}=\eta \mod 2^{n+2}} bestimmt, so kann man in Komplexität O ( 2 n ) {\displaystyle O(2^{n})} wie folgt rechnen: Berechne erst δ = η ξ mod 2 n + 2 {\displaystyle \delta =\eta -\xi \mod 2^{n+2}} und dann z k = ξ + δ ( D + 1 ) = ξ + δ F n {\displaystyle z_{k}=\xi +\delta \cdot (D+1)=\xi +\delta \cdot F_{n}} .

Bestimmung der Reste modulo 2n+2

Hier wenden wir einen für die Computeralgebra sehr typischen Trick an: Wir setzen die Stückfolgen a i {\displaystyle a_{i}} und b i {\displaystyle b_{i}} durch Einfügen genügend langer Nullsequenzen mit Sicherheitsabständen so zusammen, dass nach Produktbildung die Einzelergebnisse ebenfalls noch ohne Überlappungen in Stücken aneinandergereiht sind. Es seien also α j = a j mod 2 n + 2 {\displaystyle \alpha _{j}=a_{j}\mod 2^{n+2}} und β j = b j mod 2 n + 2 {\displaystyle \beta _{j}=b_{j}\mod 2^{n+2}} in Z 2 n + 2 {\displaystyle \mathbb {Z} _{2^{n+2}}} . Wir bilden nun

u = k = 0 2 n + 1 1 α k 2 k ( 3 n + 5 ) {\displaystyle u=\sum _{k=0}^{2^{n+1}-1}\alpha _{k}2^{k(3n+5)}} und v = k = 0 2 n + 1 1 β k 2 k ( 3 n + 5 ) {\displaystyle v=\sum _{k=0}^{2^{n+1}-1}\beta _{k}2^{k(3n+5)}}

und haben dabei 0 u , v < 2 2 n + 1 ( 3 n + 5 ) {\displaystyle 0\leq u,v<2^{2^{n+1}(3n+5)}} . Das Produkt u v {\displaystyle u\cdot v} enthält dann in disjunkten Stücken der Bitlänge 3 n + 5 {\displaystyle 3n+5} die Summen

γ k = r , s = 0 r + s = k 2 n + 1 1 α r β s {\displaystyle \gamma _{k}=\sum _{r,s=0 \atop r+s=k}^{2^{n+1}-1}\alpha _{r}\cdot \beta _{s}}

mit 0 k < 2 n + 2 {\displaystyle 0\leq k<2^{n+2}} , denn es ist 0 γ k < 2 3 n + 5 {\displaystyle 0\leq \gamma _{k}<2^{3n+5}} . Für die Terme c k {\displaystyle c_{k}} unserer ursprünglichen Multiplikationsaufgabe a b {\displaystyle a\cdot b} sehen wir

c k = γ k + γ k + 2 n + 1 mod 2 n + 2 {\displaystyle c_{k}=\gamma _{k}+\gamma _{k+2^{n+1}}\mod 2^{n+2}} .

Für die zu bestimmenden Reste η k = z k mod 2 n + 2 {\displaystyle \eta _{k}=z_{k}\mod 2^{n+2}} erhalten wir

η k = γ k γ k + 2 n + γ k + 2 2 n γ k + 3 2 n {\displaystyle \eta _{k}=\gamma _{k}-\gamma _{k+2^{n}}+\gamma _{k+2\cdot 2^{n}}-\gamma _{k+3\cdot 2^{n}}} in Z 2 n + 2 {\displaystyle \mathbb {Z} _{2^{n+2}}} .

Der Komplexitätsaufwand für die Bildung aller α j , β j {\displaystyle \alpha _{j},\beta _{j}} sowie der Extraktion der η k {\displaystyle \eta _{k}} ist O ( 2 2 n ) {\displaystyle O(2^{2n})} ; die Multiplikation u v {\displaystyle u\cdot v} kostet ψ ( 2 n + 1 ( 3 n + 5 ) ) {\displaystyle \psi (2^{n+1}(3n+5))} , insgesamt ist dies also O ( 2 2 n ) {\displaystyle O(2^{2n})} .

Bestimmung der Reste modulo (D+1)

Hier kommt die DFT zum Einsatz. Wir unterziehen die Vektoren ( a 0 , a 2 n + 1 1 ) {\displaystyle (a_{0},\ldots a_{2^{n+1}-1})} und ( b 0 , b 2 n + 1 1 ) {\displaystyle (b_{0},\ldots b_{2^{n+1}-1})} mit 0 a k , b k < D {\displaystyle 0\leq a_{k},b_{k}<{\sqrt {D}}} der DFT in R 2 n + 1 {\displaystyle R^{2^{n+1}}} mit R = Z D + 1 {\displaystyle R=\mathbb {Z} _{D+1}} und der Zahl 2 {\displaystyle 2} als 2 n + 1 {\displaystyle 2^{n+1}} -ter Einheitswurzel. Da wir nur die Differenzen c k c k + 2 n {\displaystyle c_{k}-c_{k+2^{n}}} benötigen, genügt die halbierte DFT:

  • DFT zur Bestimmung der a ^ k {\displaystyle {\hat {a}}_{k}} und b ^ k {\displaystyle {\hat {b}}_{k}} nur für die ungeraden k {\displaystyle k} mit 0 k < 2 n + 1 {\displaystyle 0\leq k<2^{n+1}}
  • 2 n {\displaystyle 2^{n}} Multiplikationen c ^ k = a ^ k b ^ k {\displaystyle {\hat {c}}_{k}={\hat {a}}_{k}\cdot {\hat {b}}_{k}} für alle ungeraden k {\displaystyle k}
  • Inverse DFT zur Gewinnung aller Differenzen c k c k + 2 n {\displaystyle c_{k}-c_{k+2^{n}}} aus den c ^ k {\displaystyle {\hat {c}}_{k}} für ungerade k {\displaystyle k}

Der Komplexitätsaufwand hierfür besteht aus O ( n 2 n ) {\displaystyle O(n2^{n})} Schritten des Einzelaufwands O ( 2 n ) {\displaystyle O(2^{n})} für die DFT (gesamt also O ( n 2 2 n ) {\displaystyle O(n2^{2n})} ); hinzu kommen die Addition von 2 n + 1 D {\displaystyle 2^{n+1}D} sowie die Reduktionen modulo ( D + 1 ) {\displaystyle (D+1)} für die Gewinnung der z k mod ( D + 1 ) {\displaystyle z_{k}\mod (D+1)} , was in O ( 2 2 n ) {\displaystyle O(2^{2n})} bewältigt werden kann.

Rekursionsschritt für gerades m

Auch für diesen Schritt der Rückführung von m = 2 n 2 {\displaystyle m=2n-2} auf n {\displaystyle n} wird die Komplexität O ( 2 n ψ ( 2 n ) + n 2 2 n ) {\displaystyle O\left(2^{n}\psi (2^{n})+n\cdot 2^{2n}\right)} erreicht.

Es seien a , b Z F m {\displaystyle a,b\in \mathbb {Z} _{F_{m}}} mit m = 2 n 2 {\displaystyle m=2n-2} und der Fermatzahl F m = 2 2 m + 1 {\displaystyle F_{m}=2^{2^{m}}+1} zu multiplizieren. Wir werden auch in diesem Schritt die Rückführung auf die Fermatzahl F n = 2 2 n + 1 {\displaystyle F_{n}=2^{2^{n}}+1} vollziehen.

Für die zu den beiden Fermatzahlen gehörenden Zweierpotenzen führen wir analog die Abkürzungen

D = F n 1 = 2 2 n {\displaystyle D=F_{n}-1=2^{2^{n}}}

und

E = F m 1 = 2 2 2 n 2 = D 2 n 2 {\displaystyle E=F_{m}-1=2^{2^{2n-2}}=D^{2^{n-2}}}

ein. Wiederum wird die halbierte Stellenzahl von D {\displaystyle D} unsere Stückelungsgröße werden, d. h. wir entwickeln a {\displaystyle a} und b {\displaystyle b} nach Potenzen von D {\displaystyle {\sqrt {D}}} :

a = i = 0 2 n 1 a i D i {\displaystyle a=\sum _{i=0}^{2^{n-1}}a_{i}\cdot {\sqrt {D}}^{i}\quad } und b = i = 0 2 n 1 b i D i {\displaystyle \quad b=\sum _{i=0}^{2^{n-1}}b_{i}\cdot {\sqrt {D}}^{i}} ,

wobei für die Einzelstücke 0 a i , b i < D {\displaystyle 0\leq a_{i},b_{i}<{\sqrt {D}}} gilt.

Wie oben verlängern wir die Zahlendarstellung auf Zweierpotenzlänge zu

a = i = 0 2 n 1 a i D i {\displaystyle a=\sum _{i=0}^{2^{n}-1}a_{i}\cdot {\sqrt {D}}^{i}}

und analog für b {\displaystyle b} .

Unter abermaliger Zuhilfenahme des Struktursatzes zur zyklischen Arithmetik wechseln wir nun vom Restklassenring Z E + 1 {\displaystyle \mathbb {Z} _{E+1}} über zum Quotientenraum ( Z E 2 , , ) / ( E + 1 ) Z {\displaystyle (\mathbb {Z} _{E^{2}},\oplus ,\otimes )/(E+1)\cdot \mathbb {Z} } mit der zyklischen Arithmetik.

Damit können wir wieder

a b = k = 0 2 n 1 c k D k {\displaystyle a\cdot b=\sum _{k=0}^{2^{n}-1}c_{k}{\sqrt {D}}^{k}}

mit den Ergebniskoeffizienten

c k = r , s = 0 r + s k mod 2 n 2 n 1 a r b s {\displaystyle c_{k}=\sum _{r,s=0 \atop r+s\equiv k\mod 2^{n}}^{2^{n}-1}a_{r}\cdot b_{s}}

darstellen. Dabei können wir c k < 2 n D {\displaystyle c_{k}<2^{n}D} nach oben abschätzen.

Aus D 2 n 1 = E 2 = 1 {\displaystyle {\sqrt {D}}^{2^{n-1}}=E^{2}=1} können wir wieder

0 < c k c k + 2 n 1 + 2 n D < 2 n + 1 D {\displaystyle 0<c_{k}-c_{k+2^{n-1}}+2^{n}D<2^{n+1}D}

folgern, und mit

z k = { c k c k + 2 n 1 + 2 n D , 0 k < 2 n 1 2 n D , 2 n 1 k < 2 n {\displaystyle z_{k}={\Big \lbrace }{c_{k}-c_{k+2^{n-1}}+2^{n}D,\quad 0\leq k<2^{n-1} \atop 2^{n}D,\quad \quad 2^{n-1}\leq k<2^{n}}}

gilt

a b = k = 0 2 n 1 z k D k {\displaystyle a\cdot b=\sum _{k=0}^{2^{n}-1}z_{k}{\sqrt {D}}^{k}}

mit 0 < z k < 2 n + 1 D {\displaystyle 0<z_{k}<2^{n+1}D} . Für die nichttrivialen z k {\displaystyle z_{k}} (Indizes 0 {\displaystyle 0} bis 2 n 1 1 {\displaystyle 2^{n-1}-1} ) gilt die Abschätzung 0 < z k < 2 n + 1 D < 2 n + 1 F n {\displaystyle 0<z_{k}<2^{n+1}D<2^{n+1}F_{n}} . Wegen der Teilerfremdheit der beiden Zahlen 2 n + 1 {\displaystyle 2^{n+1}} und F n {\displaystyle F_{n}} genügt es wieder zur Bestimmung der z k {\displaystyle z_{k}} , die Reste z k mod 2 n + 2 {\displaystyle z_{k}\mod 2^{n+2}} und z k mod F n {\displaystyle z_{k}\mod F_{n}} zu berechnen.

Bestimmung der Reste modulo 2n+1

Wir wenden wieder den Trick der Einfügung von Sicherheitsabständen an: Es seien also α j = a j mod 2 n + 1 {\displaystyle \alpha _{j}=a_{j}\mod 2^{n+1}} und β j = b j mod 2 n + 1 {\displaystyle \beta _{j}=b_{j}\mod 2^{n+1}} in Z 2 n + 1 {\displaystyle \mathbb {Z} _{2^{n+1}}} . Wir bilden

u = k = 0 2 n 1 α k 2 k ( 3 n + 2 ) {\displaystyle u=\sum _{k=0}^{2^{n}-1}\alpha _{k}2^{k(3n+2)}} und v = k = 0 2 n 1 β k 2 k ( 3 n + 2 ) {\displaystyle v=\sum _{k=0}^{2^{n}-1}\beta _{k}2^{k(3n+2)}}

und haben dabei 0 u , v < 2 2 n ( 3 n + 2 ) {\displaystyle 0\leq u,v<2^{2^{n}(3n+2)}} . Das Produkt u v {\displaystyle u\cdot v} enthält dann in disjunkten Stücken der Bitlänge 3 n + 2 {\displaystyle 3n+2} die Summen

γ k = r , s = 0 r + s = k 2 n 1 α r β s {\displaystyle \gamma _{k}=\sum _{r,s=0 \atop r+s=k}^{2^{n}-1}\alpha _{r}\cdot \beta _{s}}

mit 0 k < 2 n + 1 {\displaystyle 0\leq k<2^{n+1}} . Für die gesuchten c k {\displaystyle c_{k}} unserer ursprünglichen Multiplikationsaufgabe a b {\displaystyle a\cdot b} sehen wir

c k = γ k + γ k + 2 n mod 2 n + 1 {\displaystyle c_{k}=\gamma _{k}+\gamma _{k+2^{n}}\mod 2^{n+1}} .

Für die zu bestimmenden Reste η k = z k mod 2 n + 1 {\displaystyle \eta _{k}=z_{k}\mod 2^{n+1}} erhalten wir

η k = γ k γ k + 2 n 1 + γ k + 2 2 n 1 γ k + 3 2 n 1 {\displaystyle \eta _{k}=\gamma _{k}-\gamma _{k+2^{n-1}}+\gamma _{k+2\cdot 2^{n-1}}-\gamma _{k+3\cdot 2^{n-1}}} in Z 2 n + 1 {\displaystyle \mathbb {Z} _{2^{n+1}}} .
Bestimmung der Reste modulo (D+1)

Mit R = Z D + 1 {\displaystyle R=\mathbb {Z} _{D+1}} unterziehen wir wieder die Vektoren ( a 0 , a 2 n 1 ) {\displaystyle (a_{0},\ldots a_{2^{n}-1})} und ( b 0 , b 2 n 1 ) {\displaystyle (b_{0},\ldots b_{2^{n}-1})} mit 0 a k , b k < D {\displaystyle 0\leq a_{k},b_{k}<{\sqrt {D}}} der DFT in R 2 n {\displaystyle R^{2^{n}}} , wobei wir diesmal die Zahl 4 {\displaystyle 4} als 2 n {\displaystyle 2^{n}} -te Einheitswurzel wählen. Da wir nur die Differenzen c k c k + 2 n 1 {\displaystyle c_{k}-c_{k+2^{n-1}}} benötigen, genügt hier wiederum die halbierte DFT:

  • DFT zur Bestimmung der a ^ k {\displaystyle {\hat {a}}_{k}} und b ^ k {\displaystyle {\hat {b}}_{k}} nur für die ungeraden k {\displaystyle k} mit 0 k < 2 n {\displaystyle 0\leq k<2^{n}}
  • 2 n 1 {\displaystyle 2^{n-1}} Multiplikationen c ^ k = a ^ k b ^ k {\displaystyle {\hat {c}}_{k}={\hat {a}}_{k}\cdot {\hat {b}}_{k}} für alle ungeraden k {\displaystyle k}
  • Inverse DFT zur Gewinnung aller Differenzen c k c k + 2 n 1 {\displaystyle c_{k}-c_{k+2^{n-1}}} aus den c ^ k {\displaystyle {\hat {c}}_{k}} für ungerade k {\displaystyle k}

Zusammenfassung

Startend mit a {\displaystyle a} und b {\displaystyle b} mit Ziffernlänge n {\displaystyle n} wird durch die dargestellte Rekursion eine Komplexität von O ( n log ( n ) log ( log ( n ) ) ) {\displaystyle O(n\cdot \log(n)\cdot \log(\log(n)))} erreicht.

Abgewandelte Form

Zimmermann und Brent beschreiben eine Variante des Algorithmus, bei der die Laufzeit (in Abhängigkeit von der Länge der Eingabe) keine Sprünge macht, sondern stetiger verläuft. Dies wird erreicht, indem die DFT-Vektoren nicht aus 2 n {\displaystyle 2^{n}} -stelligen Binärzahlen, sondern Zahlen der passenden Länge gebildet werden. Dadurch muss die Länge der zu transformierenden Vektoren keine Zweierpotenz sein.[5][6]

Literatur

  • Arnold Schönhage: Asymptotically fast algorithms for the numerical multiplication and division of polynomials with complex coefficients. In: J. Calmet. (Hrsg.): EUROCAM ’82: European Computer Algebra Conference (Marseille, France, April 1982). Lect. Notes Comp. Sci. 144. Springer, 1982. 
  • Donald E. Knuth: The Art of Computer Programming, Vol. 2: Seminumerical Algorithms. 3. Auflage. Addison-Wesley, 1998, ISBN 0-201-89684-2. 
  • Chee Yap, Chen Li: QuickMul: Practical FFT-based Integer Multiplication, 2000. Vereinfachung des Schönhage-Strassen-Algorithmus für praktische Anwendungen.
  • Michael T. Goodrich, Roberto Tamassia: Algorithm Design Foundations, Analysis, and Internet Examples (PDF; 308 kB). Eine Einführung zur FFT mit einer Java-Implementierung des QuickMul-Algorithmus.
  • Daniel J. Bernstein: Multidigit multiplication for mathematicians. 11. August 2001 (yp.to – Zusammenfassung verschiedener Techniken zur Polynom- und Langzahlmultiplikation). 
  • Weltrekord-Rechenmethode kommt zu späten Ehren. Universität Bonn, Presseinformation, 21. Dezember 2004

Einzelnachweise

  1. Arnold Schönhage, Volker Strassen: Schnelle Multiplikation großer Zahlen. In: Computing, 7, 1971, S. 281–292, Springer Verlag
  2. Martin Fürer: Faster integer multiplication. STOC 2007 Proceedings, S. 57–66.
  3. David Harvey, Joris van der Hoeven, Grégoire Lecerf: Even faster integer multiplication. 2014, arxiv:1407.3360
  4. David Harvey, Joris van der Hoeven: Integer multiplication in time $O(n\mathrm{log}\, n)$. In: Annals of Mathematics. Band 193, Nr. 2, 1. März 2021, ISSN 0003-486X, doi:10.4007/annals.2021.193.2.4 (projecteuclid.org [abgerufen am 17. April 2024]). 
  5. loria.fr (PDF; 1,9 MB) S. 56
  6. loria.fr (PDF)