Kapitel 1 Algebraische und arithmetische Algorithmen 1.1 Das algebraische Berechnungsmodell Struktur: Körper (oder Ring) mit den Operationen +,,, (/) Eingabe: endliche Folge von Zahlen Ausgabe: endliche Folge von Zahlen Laufzeit : Anzahl der Operationen als Funktion der Eingabelänge. Verwendet werden Abfragen auf 0, Schleifen, Rekursionen etc. 1. Matrizenmultiplikation Eingabe: Zwei (n n)-matrizen über einem Ring a 11 a 1n A =..... a n1 a nn und B = b 11 b 1n..... b n1 b nn Ausgabe: (n n)-matrix c 11 c 1n C =.... n. mit c ij = a ik b kj, 1 i, j n c n1 c k=1 nn Der naive Algorithmus nach dieser Formel benutzt drei verschachtelte Schleifen über i, j und k. Das ergibt eine Laufzeit von Θ(n 3 ): n n n (n 1) Multiplikationen Additionen n 3 n Operationen Für n = sind es also 8 Multiplikationen und 4 Addidtionen. Geht es noch schneller? 1..1 Algorithmus von Strassen (1969) Der deutsche Mathematiker Volker Strassen die fand folgende Formel, um ( )-Matrizen zu multiplizieren: A B = C = c 11 c 1 c 1 c mit 1
c 11 = m 1 + m m 4 + m 6 c 1 = m 4 + m 5 c 1 = m 6 + m 7 c = m m 3 + m 5 m 7 m 1 = (a 1 a ) (b 1 + b ) m = (a 11 + a ) (b 11 + b ) m 3 = (a 11 a 1 ) (b 11 + b 1 ) m 4 = (a 11 + a 1 ) b m 5 = a 11 (b 1 b ) m 6 = a (b 1 b 11 ) m 7 = (a 1 + a ) b 11 wobei a ij b ij wie zuvor die Elemente der Matrizen A und B bezeichnen. Diese Methode nutzt 7 Multiplikationen und 18 Additionen und lässt sich zu einem rekursiven Algorithmus zur Multiplikation quadratischer Matrizen beliebiger Größe erweitern. Dazu führt man die Matrizenmultiplikation zunächst auf den Fall für ( )-Matrizen zurück. Gegeben seien zwei Matrizen über einem Ring R: A, B R n n mit n = k, k N + mit Hier sind A ij, B ij R n n A = A 11 A 1 A 1 A und B = für 1 i, j. Nun gilt A B = B 11 B 1 B 1 B A 11B 11 + A 1 B 1 A 11 B 1 + A 1 B A 1 B 11 + A B 1 A 1 B 1 + A B Damit ist die Multiplikation von (n n)-matrizen auf 7 Multiplikationen und 18 Additionen von ( n n )-Matrizen zurückgeführt. Als Rekursionsanker wählen wir (1 1)-Matrizen (was Elementen aus R entspricht). Das Verfahren lässt sich auch für quadratische Matrizen beliebiger Größe anwenden, indem man die Matrix bis zur nächsten Zweierpotenz mit Nullen auffüllt. Die Dimension der Matrix kann sich dadurch höchstens verdoppeln. Die Laufzeit des Algorithmus ist: M(1) = 1 ( n ) M(n) = 7M ( n ) + 18 ( n ) + 9 n = 7M = 7 (7M( n 4 ) + 9 ( n ) ) 9 + n =... ( n ) = 7 k M k + 9 ( ( n ) ( n + 7 +... + 7 k 1 n ) ) k 1 = n log 7 + 9 ( 7 ) log [ n (1 ) ] n 4 1 log n 7 4 1 kürzt sich mit n 4 = 7n log 7 6n Θ(n log 7 )
Durch den kleineren Exponenten von log 7 =, 807.. < 3 ist der Strassen-Algorithmus asymptotisch schneller als der naive Algorithmus ist. Aber geht es (asymptotisch) noch schneller? 1.. Ausblick Falls für ein k N das Produkt zweier (k k)-matrizen mit p Multiplikationen berechenbar ist, so ist allgemein das Produkt zweier (n n)-matrizen in O(n log k p ) Operationen berechenbar. Strassen fand das Paar k =, p = 7. Seitdem gab es weitere Arbeiten auf diesem Gebiet, die die Laufzeit noch weiter reduzieren konnten auf Θ(n x ): Victor Pan 1978 k = 70, p = 143640 x =, 795.. Bini, Capovani, Lotti, Romani 1979 x =, 779.. Schönhage 1979 x =, 55.. Pan, Winogard 1980 x =, 54.. Coppersmith, Winogard 1980 x =, 376.. 1.3 Inversion und Determinante von Matrizen Wir betrachten (n n)-matrizen über einem Körper K. Gegeben ist die Matrix A über K und gesucht ist A 1, falls A regulär ist. Die Laufzeit bezeichnet wieder die Anzahl der Körperoperationen +,,, /. Mit dem klassischen Gauss-Eliminationsverfahren lässt sich die Inverse berechnen, indem man die Matrix A mit Zeilenoperationen in die Einheitsmatrix überführt und die selben Operationen auch auf eine Einheitsmatrix anwedet: ( ) ( ) A I n I n A 1 Die Elimination eines Elementes der Matrix benötigt eine Zeilenoperation, welche in O(n) arbeitet. Insgesamt ergibt sich also eine Laufzeit von Θ(n 3 ). Rückführung der Inversion auf Matrizenmultiplikation: Sei wieder A K n n mit n = k, k N +. Unter der Voraussetzung, dass A 11 regulär ist, gilt folgende Zerlegung: X Y A = I n 0 n A 11 0 n I n A 1 11 A 1 A 1 A 1 11 I n 0 n D 0 n I n }{{}}{{}}{{} Dabei bezeichnen A ij, 1 i, j die ( n n )-Blockmatrizen aus A, I n die Einheitsmatrix der Größe n und 0 n die Nullmatrix der Größe n. Die Matrix D berechnet sich aus I n D = A A 1 A 1 11 A 1 Die Matrizen X und Z sind regulär, weil ihre Determinante 1 ist (Dreiecksform). Wenn sowohl A 11 als auch D regulär sind, dann ist Y ebenfalls regulär und es gilt: A 1 11 A 1 11 0 n A 1 = 0 n I n 0 n D 1 A 1 A 1 11 I n }{{}}{{}}{{} Z 1 A 1 Das liefert einen rekursiven Algorithmus zum Invertieren einer (n n)-matrix. Y 1 Z I n X 1 0 n 3
Die Determinante von A lässt sich ebenfalls auf diese Art zurückführen: det A = det X det Y det Z = 1 det Y 1 = det A 11 det D Bisher wird immer vorausgesetzt, dass A 11 regulär ist. Falls dies nicht gewährleistet ist, lässt sich zumindest in den Körpern R und Q folgender Trick nutzen (A T = A transponiert): A 1 = (A T A) 1 A T Die Matrix A T A ist positiv definit und symmetrisch. to be continued... 1.4 Multiplikation Boolscher Matrizen (Fortsetzung 18.04.) Da die Einträge ĉ ij n sind, können wir statt über Z auch über Z n+1 rechnen. Z n+1 ist ein Ring, d.h. die schnelle Matrizen Multiplikation ist anwendbar. (ĉ ij sind die Ergebnisse der Multiplikation) jetzt noch: Anzahl der Bitoperationen für eine Multiplikation/Addition/Subtraktion auf Z n+1 (Die Zahlen werden binär dargestellt mit log(n + 1) Bits.) Addition und Subtraktion von zwei k-bit-zahlen braucht O(k) Bitoperationen (nach der Schulmethode und der Implementierung im Schaltkreis). Für die Multiplikation werden O(k ) Bitoperationen benötigt. Beispiel für die Addition: 1 0 1 1 + 1 0 0 1 1 0 1 0 0 Beispiel für die Multiplikation: 1 0 1 1 1 0 0 1 1 0 1 1 1 0 1 1 1 1 0 0 0 1 1 Satz 1. Falls die Matrizenmultiplikation über einem Ring in M(m) arithmetischen Operationen möglich ist und Multiplikation/Addition/Subtraktion von k-bitzahlen in m(k) Bitoperationen, so kann man mit O(M(n) m( log(n + 1) )) Bitoperationen boolsche n n-matrizen multiplizieren. zum Beispiel: M(n) = O(n,376... ) m(k) = O(k ) O(n,376... log (n)) = O(n,377 ) (boolsche Matrizenmultiplikation) 4
1.4.1 Transitiver Abschluss Boolscher Matrizen gegeben: Boolsche n n-matrix A ˆ= gerichteter Graph G A mit n Knoten (o.b.d.a. V = {1,..., n}) ˆ= binäre Relation R A auf einer n-elementigen Menge Wir wollen den reflexiven und den transitiven Abschluss dieser Relation (Matrix A ) berechnen. A := I A A A 3 = (komponentenweises Oder) (A ) ij = 1 in G A existiert ein Weg von i nach j, denn: (A ) ij = 1 in G A existiert ein Weg der Länge k von i nach j i=0 A i Beweis durch Induktion: (es existiert ein Weg von i nach r mit der Länge k 1) (A k 1 ) ir = 1 a rj = 1 und (A k ) ij = n (A k 1 ) ir a ij ) i=0 Zusammenhang: transitiver Abschluss Multiplikation: Satz. a) Falls die Multiplikation boolscher Matrizen mit M(n) boolschen Operationen möglich ist, dann ist der transitiver Abschluss in O(M(n)) möglich. (Vorraussetzung: 4 M( n / ) M(n), M(n) c für ein c > 0) b) transitiver Abschluss in A(n) möglich, denn Multiplikation in A(3n) Beweis. (Annahme n ist eine Zweierpotenz) a) wenn A = B D C E dann ist A = (B CE D) }{{} :=F E DF F CE E E DF CE Die transitive Hülle von n n-matrix kann auf transitive Hüllen von n / n / -Matrizen (E und F ) und 6 Multiplikation und Additionen zurückgeführt werden. 5
A(n) = A( n / ) + 6M( n / ) + O(n ) für n A(1) = 0 also gilt: A(n) = A( n / ) + O(M(n)) A(n) = O(M(n)) (wie bei Inversion auflösen) Beispiel für die Graphendarstellung von G A : 1... n / n / + 1... n Pfade innerhalb der linken Seite werden durch die Einträge in B repräsentiert. Pfade innerhalb der rechten Seite werden durch die Einträge in E repräsentiert. Pfade von der linken zur rechten Seite werden durch die Einträge in C repräsentiert. Pfade von der rechten zur linken Seite werden durch die Einträge in D repräsentiert. Bisherige Methode: Für jeden Knoten in G A wird eine Breitensuche durchgeführt. O(n(n + m)) (Alternativ kann bei dünn besetzten Matrizen Multiplikation effizient durchgeführt werden.) b) Übung Was kann man noch auf Matrizenmultiplikation reduzieren? Analyse kontextfreier Sprachen geht in O(M(n)). (Dazu wird ein angepasster CYK-Algorithmus verwendet.) M := Komplexität der boolschen Matrizenmultiplikation 1.5 Polynommultiplikation, diskrete Fourier-Transformation gegeben: Körper K, Polynome über K in x: K[x] Ausdrücke der Form P (x) = a 0 + a 1 x + a x + + a n x n mit n 0, a 0,..., a n ɛ K werden durch einen Vektor der Koeffizienten (a 0,..., a n ) ɛ K n+1 repräsentiert. 6
Die Addition von Polynomen wird komponentenweise durchgeführt. Für die Multiplikation von Polynomen gilt: (a 0 + a 1 x + + a n x n ) (b 0 + b 1 x + + b n x n ) = c 0 + c 1 x + + c n x n c i = mit c i = i j=0 n j=i n a j b i j a j b i j für i n für i > n i = 0,..., n (c 0,..., c n ) heißt Faltung (Konvolution) von (a 0,..., a n ) (b 0,..., b n ). Wie viele Operationen (über K) sind nötig, um Faltung (d.h. Polynommultiplikation) zu berechnen? Direkt aus der Definition folgt: i + 1 für i n (n i) + 1 für i = n + 1,..., n n i + 1 + i=0 n i=n+1 (i n) + 1 = O(n ) 1.5.1 FFT ausführlich geg: Vektor a = (a 0,..., a n ) K n+1 Körper K, der eine primitive (n + 1)-te Einheitswurzel ω besitzt. obda: (n + 1) ist eine Zweierpotenz. Algorithm 1 FFT(a,n,ω) 1: if n = 0 then : return (a) 3: else 4: ag := (a 0, a,...a n 1 ) 5: au := (a 1, a 3,...a n ) 6: u := F F T (ag, n 1, ω ) 7: v := F F T (au, n 1, ω ) 8: w := 1 9: for i = 0 n 1 do 10: y i := u i + w v i 11: y n+1 +i := u i w v i 1: w := ω w 13: end for 14: return (y 0,...y n ) 15: end if Erklärung der Zeilen 8-15: für i = 0,..., n 1 : w durchläuft 1, ω, ω,..., ω n 1 y i soll sein: p 1 (ω i ) + }{{}}{{} ω i u i w für i = n 1 + 1,..., n : Wie sieht hier ω i aus? p (ω i ) }{{} v i 7
i = n + 1, n + 3, n + 5,... ω i = ω (n+1), ω (n+1)+, ω (n+1)+4,... ω i = ω i (n+1) Es werden hier die Werte von p 1 an diesen Stellen genommen. w i für i = n 1 + 1,..., n ist gleich: w n+1 +j }{{} = 1 = ω j für j = 0,..., n+1 Genaue Rekursionsgleichung: T (n + 1) = T ( n + 1 T (n + 1) = 3 (n + 1) log(n + 1) ) + 3 n + 1 }{{} Körperoperationen in Zeilen 8-14 Für die Faltung (Konvolution, Polynommultiplikation) haben wir folgenden Satz 3. (Faltungssatz) Seien a, b K n+1 Vektoren, K Körper mit primitiver (n+1)-ter Einheitswurzel, dann gilt a b = DF T 1 (DF T (a) DF T (b)) wobei a b K n+1 die Koeffizienten des Polynomproduktes darstellt, a, b die Dimension n haben (werden mit 0 aufgefüllt) und für die komponentenweise Multiplikation steht. Korollar 1. Die Multiplikation von Polynomen von Grad n mit Koeffizienten aus K (Eigenschaften wie in Satz 3) ist möglich mit O(nlogn) Operationen über dem Körper K. Denn die Operationen in der Formel in Satz 3 benötigen folgende Laufzeiten: DF T (a) DF T (b) in O(nlogn) mit FFT möglich geht in O(n) Zeit DF T 1 auch in O(nlogn) möglich, da die zugehörige inverse Matrix 1 1 1 1 ω 1 1 ω n n+1..... ist.. 1 ω n ω n FFT unter Benutzung von ω 1 möglich. Ergebnis muss 1 mit n + 1 multipliziert werden. }{{} O(n)Zeit 1.5. Bedeutung der Fourier-Transformation Darstellung einer Funktion mit Hilfe der Einheitswurzel 1, e i π N,..., e i (N 1) π N. Dabei gilt e i k π N π π = cos(k ) + sin(k N N ) = ωk 8
FFT gibt die Darstellung einer Funktion mit Hilfe von sin und cos verschiedener Frequenzen an. Die Koeffizienten sagen dabei aus wie stark die Frequenzen vertreten sind. Das Ergebnis der Fouriertransformation heißt auch Spektrum. Anwendungsgebiete: Wirtschaftwissenschaften: Untersuchung von Preisschwankungen Bild- und Signalverarbeitung: ( Hier ) werden durch Anwendung der Fourier-Transformation mit der Sinc-Funktion sinc(x) = sin(x) x Filter für die Rauschunterdrückung erstellt. Es wird dabei in Hoch- und Tiefpassfiter unterschieden. 9