Algebraische und arithmetische Algorithmen

Werbung
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.2
Matrizenmultiplikation
Eingabe: Zwei (n × n)-Matrizen über einem Ring



a11 · · · a1n

..  und B = 
..
A =  ...

.
. 
an1 · · · ann
b11
..
.
bn1
···
..
.
···

b1n
.. 
. 
bnn
Ausgabe: (n × n)-Matrix

c11 · · ·
 ..
..
C= .
.
cn1 · · ·

c1n
n
..  mit c = X a · b , 1 ≤ i, j ≤ n

ij
ik
kj
.
k=1
cnn
Der naive Algorithmus nach dieser Formel benutzt drei verschachtelte Schleifen über i, j und k. Das
ergibt eine Laufzeit von Θ(n3 ):
n2 · n
Multiplikationen
n2 · (n − 1)
Additionen
2n3 − n2
Operationen
Für n = 2 sind es also 8 Multiplikationen und 4 Addidtionen. Geht es noch schneller ?
1.2.1
Algorithmus von Strassen (1969)
Der deutsche Mathematiker Volker Strassen die fand folgende Formel, um (2 × 2)-Matrizen zu multiplizieren:


c11 c12
 mit
A·B =C =
c21 c22
1
c11 = m1 + m2 − m4 + m6
c12 = m4 + m5
c21 = m6 + m7
c22 = m2 − m3 + m5 − m7
m1 = (a12 − a22 ) · (b21 + b22 )
m2 = (a11 + a22 ) · (b11 + b22 )
m3 = (a11 − a21 ) · (b11 + b12 )
m4 = (a11 + a12 ) · b22
m5 = a11 · (b12 − b22 )
m6 = a22 · (b21 − b11 )
m7 = (a21 + a22 ) · b11
wobei aij bij 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 (2 × 2)-Matrizen zurück.
Gegeben seien zwei Matrizen über einem Ring R: A, B ∈ Rn×n mit n = 2k , k ∈ N+ mit




A11 A12
B11 B12
 und B = 

A=
A21 A22
B21 B22
n
n
Hier sind Aij , Bij ∈ R 2 × 2 für 1 ≤ i, j ≤ 2. Nun gilt


A11 B11 + A12 B21 A11 B12 + A12 B22

A·B =
A21 B11 + A22 B21 A21 B12 + A22 B22
Damit ist die Multiplikation von (n × n)-Matrizen auf 7 Multiplikationen und 18 Additionen von
( n2 × n2 )-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
M (n) = 7M
=
=
=
=
=
n
2
n
+ 18
n 2
2
9 2
7M
+ n
2
2
n
9 n 2
9
7 · (7M ( ) + ·
) + n2
4
2
2
2
...
n 9
n 2
n 2 k
2
k−1
7 M k + · n +7·
+ ... + 7
· k−1
2
2
2
2
"
#
log
n
2
log2 n
7
−
1
9
1
kürzt sich mit n2
nlog2 7 + n2 · 4 7
2
4
−
1
4
= 7nlog2 7 − 6n2
⇒
Θ(nlog2 7 )
2
Durch den kleineren Exponenten von log2 7 = 2, 807.. < 3 ist der Strassen-Algorithmus asymptotisch
schneller als der naive Algorithmus ist. Aber geht es (asymptotisch) noch schneller ?
1.2.2
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(nlogk p ) Operationen berechenbar.
Strassen fand das Paar k = 2, p = 7. Seitdem gab es weitere Arbeiten auf diesem Gebiet, die die
Laufzeit noch weiter reduzieren konnten auf Θ(nx ):
Victor Pan
1978
Bini, Capovani, Lotti, Romani
1979
x = 2, 779..
Schönhage
1979
x = 2, 55..
Pan, Winogard
1980
x = 2, 54..
Coppersmith, Winogard
1980
x = 2, 376..
1.3
k = 70, p = 143640
x = 2, 795..
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 In
In A−1
Die Elimination eines Elementes der Matrix benötigt eine Zeilenoperation, welche in O(n) arbeitet.
Insgesamt ergibt sich also eine Laufzeit von Θ(n3 ).
Rückführung der Inversion auf Matrizenmultiplikation:
Sei wieder A ∈ K n×n mit n = 2k , k ∈ N+ . Unter der Voraussetzung, dass A11 regulär ist, gilt folgende
Zerlegung:




A11 0 n2
I n2 A−1
I n2
0 n2
A
11 12 


A=
−1
A21 A11 I n2
0 n2 D
0 n2
In
|
{z
}|
{z
}|
{z 2
}
X
Y
Z
Dabei bezeichnen Aij , 1 ≤ i, j ≤ 2 die ( n2 × n2 )-Blockmatrizen aus A, I n2 die Einheitsmatrix der Größe
n
n
n
2 und 0 2 die Nullmatrix der Größe 2 . Die Matrix D berechnet sich aus
D = A22 − A21 A−1
11 A12
Die Matrizen X und Z sind regulär, weil ihre Determinante 1 ist (Dreiecksform). Wenn sowohl A11 als
auch D regulär sind, dann ist Y ebenfalls regulär und es gilt:




−1
−1
n
n
n
n
I
−A
A
A
0
I
0
11 12 
11
2
2
2 

A−1 =  2
n
0 n2
I n2
0 n2 D−1
−A21 A−1
I
11
2
|
{z
}|
{z
}|
{z
}
Z −1
Y −1
X −1
Das liefert einen rekursiven Algorithmus zum Invertieren einer (n × n)-Matrix.
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 A11 · det D
Bisher wird immer vorausgesetzt, dass A11 regulär ist. Falls dies nicht gewährleistet ist, lässt sich
zumindest in den Körpern R und Q folgender Trick nutzen (AT = A transponiert):
A−1 = (AT · A)−1 · AT
Die Matrix AT · 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 Zn+1 rechnen. Zn+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 Zn+1
(Die Zahlen werden binär dargestellt mit dlog(n + 1)e 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 2 ) Bitoperationen benötigt.
Beispiel für die Addition:
Beispiel für die Multiplikation:
1 0 1 1
+
1 0 1 1
1 0 0 1
·
1 0 0 1
1 0 1 1
1 0 1 0 0
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(dlog(n + 1)e)) Bitoperationen boolsche n × n-Matrizen multiplizieren.
zum Beispiel:

M (n) = O(n2,376... ) 
O(n2,376... · log2 (n)) = O(n2,377 )

2
m(k) = O(k )
(boolsche Matrizenmultiplikation)
4
1.4.1
Transitiver Abschluss Boolscher Matrizen
gegeben:
Boolsche n × n-Matrix A
=
ˆ gerichteter Graph GA mit n Knoten (o.B.d.A. V = {1, . . . , n})
=
ˆ binäre Relation RA auf einer n-elementigen Menge
Wir wollen den reflexiven und den transitiven Abschluss dieser Relation (Matrix A∗ ) berechnen.
A∗ := I ∨ A ∨ A2 ∨ A3 ∨ · · · =
∞
_
Ai
i=0
(komponentenweises Oder)
(A∗ )ij = 1 ⇔ in GA existiert ein Weg von i nach j, denn:
(A∗ )ij = 1 ⇔ in GA existiert ein Weg der Länge k von i nach j
Beweis durch Induktion:
(es existiert ein Weg von i nach r mit der Länge k − 1)
(Ak−1 )ir = 1 arj = 1 und (Ak )ij =
n
W
(Ak−1 )ir aij )
i=0
Zusammenhang: transitiver Abschluss ↔ Multiplikation:
Satz 2.
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 /2 ) ≤ M (n), M (2n) ≤ 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 C
D E



∗
∗
F CE ∗

(B ∨ CE D)
 |

{z
}

dann ist A∗ = 
:=F


∗
∗
∗
∗
E DF
E ∨ E DF CE
Die transitive Hülle von n × n-Matrix kann auf 2 transitive Hüllen von n /2 × n /2 -Matrizen (E ∗
und F ) und 6 Multiplikation und 2 Additionen zurückgeführt werden.
5
A(n) = 2A(n /2 ) + 6M (n /2 ) + O(n2 ) für n ≥ 2
A(1) = 0
also gilt: A(n) = 2A(n /2 ) + O(M (n))
⇒ A(n) = O(M (n))
(wie bei Inversion auflösen)
Beispiel für die Graphendarstellung von GA :
n/
2
1 . . . n /2
Pfade
Pfade
Pfade
Pfade
+ 1...n
innerhalb der linken Seite werden durch die Einträge in B repräsentiert.
innerhalb der rechten Seite werden durch die Einträge in E repräsentiert.
von der linken zur rechten Seite werden durch die Einträge in C repräsentiert.
von der rechten zur linken Seite werden durch die Einträge in D repräsentiert.
Bisherige Methode: Für jeden Knoten in GA 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) = a0 + a1 · x + a2 · x2 + · · · + an · xn mit n ≥ 0, a0 , . . . , an K werden
durch einen Vektor der Koeffizienten (a0 , . . . , an ) K n+1 repräsentiert.
6
Die Addition von Polynomen wird komponentenweise durchgeführt.
Für die Multiplikation von Polynomen gilt:
(a0 + a1 · x + · · · + an · xn ) · (b0 + b1 · x + · · · + bn · xn ) = c0 + c1 · x + · · · + c2n · x2n
mit

i
P


aj bi−j
 ci =
für i ≤ n


 ci =
für i > n
j=0
n
P
i = 0, . . . , 2n
aj bi−j
j=i−n
(c0 , . . . , c2n ) heißt Faltung (Konvolution) von (a0 , . . . , an ) · (b0 , . . . , bn ).
Wie viele Operationen (über K) sind nötig, um Faltung (d.h. Polynommultiplikation) zu berechnen?
Direkt aus der Definition folgt: 2i + 1 für i ≤ n
2(n − i) + 1 für i = n + 1, . . . , 2n
n
P
2i + 1 +
i=0
1.5.1
2n
P
2(i − n) + 1 = O(n2 )
i=n+1
FFT ausführlich
geg: Vektor a = (a0 , ..., an ) ∈ 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
2:
return (a)
3: else
4:
ag := (a0 , a2 , ...an−1 )
5:
au := (a1 , a3 , ...an )
2
6:
u := F F T (ag, n−1
2 ,ω )
n−1
7:
v := F F T (au, 2 , ω 2 )
8:
w := 1
9:
for i = 0 → n−1
2 do
10:
yi := ui + w · vi
11:
y n+1 +i := ui − w · vi
2
12:
w := ω · w
13:
end for
14:
return (y0 , ...yn )
15: end if
Erklärung der Zeilen 8 - 15:
für i = 0, ..., n−1
2 :
n−1
w durchläuft 1, ω, ω 2 , ..., ω 2
yi soll sein: p1 (ω 2i ) + |{z}
ω i · p2 (ω 2i )
| {z }
| {z }
ui
w
für i =
+ 1, ..., n :
Wie sieht hier ω 2i aus?
vi
n−1
2
7
2i
=
n+1
,
n+3
,
n+5
, ...
ω 2i =
ω (n+1)
, ω (n+1)+2 , ω (n+1)+4 , ...
ω 2i = ω 2i−(n+1)
Es werden hier die Werte von p1 an diesen Stellen genommen.
wi für i = n−1
2 + 1, ..., n ist gleich:
n+1
+j
n+1
j
2
|w {z } = −ω für j = 0, ..., 2
=−1
Genaue Rekursionsgleichung:
T (n + 1) = 2T (
n+1
)+
2
n+1
3·
| {z2 }
Körperoperationen in Zeilen 8-14
3
(n + 1) · log(n + 1)
2
T (n + 1) =
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 2n+1 die Koeffizienten des Polynomproduktes darstellt, a, b die Dimension 2n 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)
in O(nlogn) mit FFT möglich
DF T (b)
◦
DF T −1
geht in O(n) Zeit
auch in O(nlogn) möglich, da die zugehörige inverse Matrix


1
1
···
1



−1 · · · ω −n 


1
ω
1 

n+1  .
..
..  ist.
..
 ..
.
.
. 


2
1 ωn · · · ωn
→FFT unter Benutzung von ω −1 möglich. Ergebnis muss
1
mit
multipliziert werden.
|n + 1 {z
}
O(n)Zeit
1.5.2
Bedeutung der Fourier-Transformation
2π
2π
Darstellung einer Funktion mit Hilfe der Einheitswurzel 1, ei·2 N , . . . , ei·(N −1) N . Dabei gilt
2π
ei·k N = cos(k
2π
2π
) + sin(k ) = ω k
N
N
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
sin(x)
der Sinc-Funktion sinc(x) = x
Filter für die Rauschunterdrückung erstellt. Es wird dabei
in Hoch- und Tiefpassfiter unterschieden.
1.5.3
Weitere Anwendung: Korrelation
a0 , . . . an ∈ Rn , b0 , . . . bn ∈ Rn
Korrelation:
P
c0 , . . . c2n mit ck =
ai bk+i , k = 0, . . . 2n lässt sich zurückführen auf Konvolution von a mit b̂ =
i
(bn , . . . b0 ).
Damit ist die FFT anwendbar.
Dies wird z.B. in der Mustererkennung benutzt.
Beispiel:
gegeben: „Text“ b = b0 , . . . bm und „Muster“ a = a0 , . . . an
9
Dafür gibt es auch String-Matching-Algorithmen, welche später in der Vorlesung behandelt werden.
Frage:
An welcher Stelle k stimmt das Muster möglichst gut mit dem Text überein?
⇒Das ist dort, wo die Korrelation hoch ist. z.B.: 0 − 1−Muster und 0 − 1−Text:
Wandle jede 0 in eine −1 um.
b=
...
bk
...
bk+n
...
a=
a0 . . .
an
Daraus folgt:
P
• ck = bk+i ai ⇒ ck ist maximal, wenn ai = bk+i ∀i, d.h. ck = n + 1
i
• ck = −(n + 1), wenn ai 6= bk+i ∀i
• Werte dazwischen, sonst.
D.h. die Werte drücken den Grad der Übereinstimmung aus.
Mit FFT: O(m log m)
Dies ist auch in 2 − D möglich: z.B. mit Bildern und nicht nur 0 − 1−Mustern. Es gibt auch Varianten
für relle Werte.
Bemerkungen zur FFT:
1. o.B.d.A n + 1 Zweierpotenz: Für die DFT für beliebiges n nicht der Fall. Es kann für beliebiges n
übertragen werden durch Varianten des Algorithmus. Dies ist aber nicht offensichtlich.
Für die Konvolution ist „o.B.d.A.“ gerechtfertigt, denn Polynome können mit 0−Koeffizienten bis zur
nächsten Zweierpotenz aufgefüllt werden.
2. FFT auf Restklassenkörpern ZM : M ist eine Primzahl ⇔ ZM ist ein Körper.
Frage:
Enthält der Körper ZM primitive (n + 1) − te Einheitswurzeln?
z.B. Z41 enthält folgende 8. Einheitswurzeln:
1, |{z}
3 , |{z}
9 , 14, |{z}
27 , 32, 38, 40, wobei 3 und 38 primitive Einheitswurzeln sind.
ω
ω2
ω3
Es gilt:(ohne Beweis)
Falls M = c · 2r + 1 Primzahl, dann gibt es eine primitive 2r −te Einheitswurzel in ZM .
z.B.: M=41, r=3 und c=5.
Primzahlen dieser Form liegen „ziemlich dicht“. Es gibt etwa 50 Primzahlen dieser Form M < 231 mit
r ≥ 20.
z.B. Konvolution von Polynomen mit ganzzahligen Koeffizienten durch FFT auf ZM durchführbar, falls
M
alle Koeffizienten der Konvolution aus dem Intervall ( −M
2 , 2 )
1.6
Arithmetik
• Bitmodell: Zahlen sind binärdargestellt. Größe=Länge der Binärdarstellung
• binäre Operationen: ∨, ∧, ¬
• Rechnermodelle:
– Schaltkreise
– Turingmaschine
• n-Bit-Zahlen:
– Addition/Subtraktion in O(n) Operationen durchführbar.
10
– Multiplikation in θ(n2 ) mit der „Schulmethode“.
Frage: Kann man „schneller“ multiplizieren?
1.6.1
a→
1. Methode: (Karatsuba/Ofman - 1962)
αn αn−1 . . . α n+1
2
|
{z
}
α n−1 . . . α0
| 2 {z }
βn βn−1 . . . β n+1
2
|
{z
}
β n−1 . . . β0
| 2 {z }
:=a1
b→
:=b1
⇒a=
n−1
P
αi 2i und b =
i=0
:=a0
:=b0
n−1
P
β i 2i
i=0
o.B.d.A.: Zweierpotenz, sonst mit Nullen auffüllen.
⇒

n
a = a0 + a1 · 2 2 
n
a · b = a0 b0 + (a0 b1 + a1 b0 )2 2 + a1 b1 2n
n
b = b + b · 22 
0
1
d.h. man berechne:
(1) a0 b0
(2) a0 b1 + a1 b0
(3) a1 b1
⇒ Dann Produkt a · b in O(n).
⇒ Dies ist mit 3 Multiplikationen von
n
2 -Bit-Zahlen
möglich:
(1) m1 := a0 · b0
(2) m2 := a1 · b1
m3 := (a0 + a1 )(b0 + b1 )
(3) m4 := m3 − m2 − m1
Macht man das also rekursiv, so gilt für die Anzahl T (n) der Operationen:
(analog zum zur Strassen Analyse)
T (1) = 1
n
+ cn
cn steht für Add/Sub von n-Bit-Zahlen in den Formeln
T (n) = 3T
2 n n
= 3 3T
+c
+ cn
4
2
= ...
k−1 j
n
X
3
k
mit k = log n
= 3 T
+ cn
k
2
2
j=0
3 log n
−1
log n
2
= 3
T (1) + c · n
3
2 −1
log n
3
≤ nlog 3 + 2cn
2
= O(nlog 3 )
= O(n1,585... )
11
1.6.2
2. Methode: (noch schneller)
Stellenzahl N = (r + 1)n, wobei die Konstante r geeignet bestimmt werden muss. ai , bj (i, j ∈ 0, . . . , r)
sind n-Bits lang.
a=
ar
ar−1
...
a1
a0
b=
br
br−1
...
b1
b0
Daraus folgt:
a = ar 2rn + ar−1 2(r−1)n + · · · + a1 2n + a0
b = br 2rn + br−1 2(r−1)n + · · · + b1 2n + b0
Betrachte folgende Polynome:
p(x) = ar xr + ar−1 xr−1 + · · · + a1 x + a0 : dann ist a = p(2n )
q(x) = br xr + br−1 xr−1 + · · · + b1 x + b0 : dann ist b = q(2n )
Sei w(x) = p(x) · q(x) ⇒ a · b = w(2n ).
Wir berechnen die Koeffizienten von w, indem wir folgendes berechnen:
w(0)
=
p(0) · q(0)
w(1)
=
p(1) · q(1)
...
w(2r)
=
p(2r) · q(2r)
{z
}
|
Produkt durch rekursiven Aufruf.
12
Herunterladen