2. Darstellung von Polynomen

Werbung
1. Polynomen
(x)
axj . Die Zahlen a j heißen Koeffizienten. Ein Polynom
Ein Polynom ist eine Funktion A(x ) in dieser Form: A
j
0 j
A(x ) hat Grad k wenn ak der höchste Koeffizient mit einem Wert ungleich 0 ist. Jede ganze Zahl großer als der Grad
n

1
eines Polynoms wird die Länge des Polynoms genannt. Das heißt, der Grad eines Polynoms der Länge
ganze Zahl zwischen 0 und n-1 inklusive sein.
kann jede
1.1. Addition von Polynomen
n 1
(x)
bxj zwei Polynome der Länge n. Die Summe von ihnen ist ein Polynom
Seien A( x )   a j x j und B
j
0 j
j 0
n

1
n 1
C ( x )   j 0 c j x j auch mit Länge , so dass C(x) = A(x) + B(x), wobei c j  a j  b j . Zum Beispiel:
8 x 4  3x 3  12 x  5  ( 5x 3  2 x 2  3x  2)  8 x 4  2 x 3  2 x 2  9 x  3 .
1.2. Multiplikation von Polynomen
2
n

2
(x)
bxj dann A
(x
)
cxj mit
(x)
axj und B
j
(x
)B
(x
)C
(x
)wobei C
Seien A
j
0 j
j
0 j
j
0 j
c j  K 0 a k b j k .
n

1
n

1
2
Länge(C) = Länge(A) + Länge(B) und die Laufzeit dieses Verfahren lautet  ( n ) . Die Multiplikation kann so
durchgeführt werden, dass man jede Klausel in A(x) bei jeder Klausel in B(x) multipliziert, und das ganze zusammen
addiert. Zum Beispiel:
3 2
3
(
6
x

7
x

10
x

9
)(

2
x

4
x

5
)
3 2
4 3 2
6 5 4 3


30
x

35
x

50
x

45

24
x

28
x

40
x

36
x


12
x

14
x

20
x

18
x
6 5 4 3 2


12
x

14
x

44
x

20
x

75
x
86
x

45
2. Darstellung von Polynomen
Polynome könne in zwei Formen dargestellt werden: Koeffizienten und Point-Value Darstellung. Diese beiden sind
eigentlich äquivalent. Das heißt, jedes Polynom in Point-Value Darstellung hat ein eindeutiges äquivalent in
Koeffizienten Darstellung. In diesem Abschnitt werden diese beiden Darstellungen beschreiben.
2.1. Koeffizienten-Darstellung
Die Koeffizienten-Darstellung eines Polynoms A( x ) 

n 1
j 0
a j x j der Länge ist ein Vektor von
Koeffizienten a  ( a0, a1 ,..., a n 1 ) . Addition von Polynomen a  (a0 , a1 ,..., an 1 ) und b  (b0 , b1 ,..., bn 1 ) in
Koeffizienten-Darstellung kostet  (n ) . Dafür muss man einfach die zwei Vektoren zusammen addieren. Die
(a
,a
,...,
a
)und b(b
,...,
b
)in Koeffizienten-Darstellung ist in
Multiplikation von zwei Polynomen a
0
1
n

1
0,b
1
n

1
2
 ( n ) möglich. Dazu benutzt man das Verfahren, das unter Abschnitt 1.2 beschrieben ist.
2.2. Point-Value-Darstellung
Die Point-Value-Darstellung eines Polynoms A( x ) 

n 1
j 0
a j x j der Länge n ist eine Menge von
Punkten {( x0 , y0 ), ( x1 , y1 ),..., ( xn1 , yn1 )} , sodass alle x k disjunkt sind und es gilt y k  A( xk ) für
alle k  0,1,..., n  1 . Auswertung der Punkte ist durch Horne-Schema in  (n ) einfach zu berechnen:
A( x0 )  a0  x0 (a1  x0 (a2  ...  x0 (an2  x0 (an1 ))...))
Theorem 1: Eindeutigkeit von Interpolation der Polynomen
Für jede Menge {( x0 , y0 ), ( x1 , y1 ),..., ( xn1 , yn1 )} von n Punkten, mit x k disjunkt, gibt es ein eindeutiges Polynom
A(x) der Länge n, so dass y k  A( xk ) für alle k  0,1,..., n  1 .
Nun betrachten wir die Addition und Multiplikation zweier Polynome A und B in Point-Value-Darstellung:
A : {( x0 , y0 ), ( x1 , y1 ),..., ( xn1 , yn1 )} und B: {( x0 , y0 ), ( x1 , y1 ),..., ( xn1 , yn 1 )}
Polynome und FFT, Mohsen Taheri, FU Berlin, SoSe 12
Seite 1
Zwei Polynome in dieser Darstellung zu addieren ist ganz einfach und hat die Laufzeit
C  A  B  {( x0 , y0  y0 ), ( x1 , y1  y1 ),..., ( xn1 , yn1  yn 1 )}
:
Für die Multiplikation kann man auch das gleiche Verfahren übernehmen. Es gibt allerdings ein kleines Problem. Die
Multiplikation von zwei Polynomen Länge n hat die Länge 2n. Für eine eindeutige Interpolation von einem Polynom
der Länge 2n brauchen wir 2n Punkte (nach Theorem 1). Das bedeutet, dass man für das Polynom C zwei Mal so viel
Punkte brauchen wird. Die Lösung ist dennoch ganz einfach. Man nutzt die sogenannte Extended Point-Value
Darstellung. Diese sind jeweils:
A : {( x0 , y0 ), ( x1 , y1 ),..., ( x2 n1 , y2 n 1 )} und B: {( x0 , y0 ), ( x1 , y1 ),..., ( x2 n1 , y2 n 1 )}
Man wird also 2n Punkte für die Polynome A und B auswählen. Dann multipliziert man diese und berechnet das
Polynom C folgendermaßen: C: {( x0 , y0  y0 ), ( x1 , y1  y1 ),..., ( x2 n1 , y2 n1  y2 n1 )}
Wichtig hier zu beachten ist, dass man diese Multiplikation in  (n ) ausführen kann.
3. Evaluation und Interpolation
Die Auswertung eines Polynoms unter einen bestimmten Wert von x nennt man Evaluation. Wie unter Abschnitt 2.2
erwähnt, kann man dafür das Horne-Schema benutzen und diese in  (n 2 ) durchführen.
Das umgekehrte Verfahren, nämlich das Herausfinden von Koeffizienten-Vektor eines Polynoms in Point-ValueDarstellung heißt Interpolation. Interpolation kann mit Lagranges Formel berechnet werden:
n 1
Lagrange Formel: A( x )   y k ( ( x  x j ) /  ( xk  x j ))
k 0
j k
j k
Es gibt aber effizientere Methoden, die die Evaluation und Interpolation von Polynomen in  ( n lg n ) berechnen.
Dafür muss man die xk schlau auswählen. Folgende Abschnitte beschäftigen sich mit diesen Methoden.
4. DFT
Das Ziel ist also
Punkte auszuwählen und das Polynom A( x ) 

n 1
j 0
a j x j in diesen Punkten auszuwerten. Die
Eingabe ist in Koeffizienten-Vektor a  (a0 , a1 ,..., an 1 ) vorzustellen. Wenn man die komplexe n-te Einheitswurzeln
(eng.: complex nth roots of unity) (siehe 3.1.) als die xk auswählt, und die yk jeweils berechnet, bekommt man
einen Vektor y  ( y0 , y1 ,..., yn1 ) und diesen nennt man diskrete Fourier Transform oder kurz DFT. Man schreibt
also y  DFTn (a ) .
4.1. Komplexe Einheitswurzeln
Eine komplexe Einheitswurzel ist eine komplexe Zahl  , wobei  n  1 . Es gibt genau n komplexe n-te
Einheitswurzeln: e 2ik / n für k=0,1, … , n-1. Die Zahl n  e 2ik / n ist die primitive n-te Einheitswurzel und alle
anderen Zahlen sind die Potenzen dieser Zahl. Also die n komplexe n-te Einheitswurzeln sind n , n , n ,..., n
Nun betrachten wir die Eigenschaften diese Zahlen.
0
Additive Gruppe: Die n Zahlen n , n , n ,..., n
0
1
2
n 1
1
2
n 1
.
haben die gleiche Struktur wie die additive
Gruppe (  n ,) mod n . Weil nn  n0  1 impliziert, dass njnk  nj k  nj k mod n .
dk
 nk .
Cancellation Lemma: Für jede ganze Zahl n  0, k  0 und d  0 gilt: dn
dk
Beweis: dn
 ( e 2ik / dn ) dk  ( e 2ik / n ) k  nk .
Korollar: Für alle ganze Zahlen
gilt: nn / 2  2  1 .
Halving Lemma: Wenn n>0 eine gerade Zahl ist, dann sind die Quadrate der n komplexen n -te Einheitswurzeln
die n/2 komplexe (n/2)-te Einheitswurzeln: {(n0 ) 2 , (n1 ) 2 ,..., (nn 1 ) 2 }  {n0/ 2 , n1 / 2 ,..., nn//221}
Beweis: Da n gerade ist, nehmen wir an n=2m
Zu zeigen: {(20m ) 2 , (21m ) 2 ,..., (22mm1 ) 2 }  {m0 , m1 ,..., mm1}
Nach Cancellation Lemma: {(20m ) 2 , (21m ) 2 ,..., (22mm 1 ) 2 }  {m0 , m1 ,..., m2 m 1}
Polynome und FFT, Mohsen Taheri, FU Berlin, SoSe 12
Seite 2
{m0 , m1 ,..., m2 m1}  {m0 , m1 ,..., mm1 , mm , mm1 ,..., m2 m1}
da mm  1 , ist dann mm  j  mj , also
{m0 , m1 ,..., mm1 , mm , mm1 ,..., m2 m1}  {m0 , m1 ,..., mm1 , m0 , m1 ,..., mm1}  {m0 , m1 ,..., mm1} . □
Summation Lemma: Für jede ganze Zahl n≥1 und für k≠0 und nicht dividierbar durch n, gilt n 1 (nk ) j  0
j 0
5. FFT und der Algorithmus dafür
Unter Verwendung der Eigenschaften der Einheitswurzeln werden wir einen Algorithmus vorstellen, der die
Evaluation eines Polynoms in  ( n lg n ) ausführen kann. Diese Methode heißt Fast Fourier Transform(FFT). Wir
nehmen an, dass n eine Potenz von 2 ist. Für die anderen Fälle gibt es einige Methoden, die allerdings nicht das
Thema dieses Dokuments sind. Die FFT-Methode benutzt eine Divide-and-Conquer Strategie, und teilt das Polynom
A(x ) in gerade und ungerade indizierte Koeffizienten. Damit werden zwei neue Polynome, A[ 0] ( x ), A[1] ( x ) mit
Länge n/2 erzeugt.
A[ 0 ] ( x )  a 0  a 2 x  a 4 x 2  ...  a n 2 x n / 21 , A[1] ( x )  a1  a 3 x  a5 x 2  ...  a n 1 x n / 21
Das Polynom A(x ) ist also: A( x )  A[ 0] ( x 2 )  xA[1] ( x 2 ) . Damit ist das Problem von Auswerten des Polynoms
A(x ) in n Punkten (  0 ,  1 ,...,  n1 ) reduziert zu:
n
n
n

(

(

1. zwei Polynome A[ 0] ( x ), A[1] ( x ) der Länge n/2 in den Punkten (
n),
n),...,
n )auswerten.
02
12
n

12
2. das Resultat mit Hilfe der Abgleichung A( x )  A[ 0] ( x 2 )  xA[1] ( x 2 ) zusammen addieren.
Wenn man das Halving Lemma anwendet, dann ist die Anzahl der Elemente der Liste der Zahlen
[0]
[1]
0
1
n 1
(n ) 2 , (n ) 2 ,..., (n ) 2 nicht n, sondern n/2. Deswegen können wir, die zwei Polynome A (x),A (x)in n/2
komplexe Zahlen (n/2)-te Einheitswurzeln berechnen. Diese zwei Subprobleme haben genau die gleiche Struktur wie
das ursprüngliche Problem und sind halb so groß. Diese Teilung ist die Basis des folgenden Algorithmus RecursiveFFT, der ein Vektor a  (a0 , a1 ,..., an 1 ) als Eingabe bekommt, und die y  DFTn (a ) berechnet.
RECURSIVE-FFT(a)
1
2
3
4
5
n = a.length()
if n==1
return a
// n ist ein Potenz von 2
n  e2i / n
 1
6
[0
]
a

(
a
,a
,...,
a
)
0
2
n

2
7
[
1
]
a

(a
,a
,...,
a
)
1
3
n

1
8
9
10
11
12
13
14
[
0
]
[
0
]
y

RECURSIVE

FFT
(
a
)
[
1
]
[
1
]
y
RECURSIVE

FFT
(
a
)
for k=0 to n/2-1
[0]
[1
]
yk yk

yk
[0
]
[
1
]
y
y

y
k

(n
/2
)
k 
k
  n
return y
// y ist als einen Spaltenvektor zu betrachten
Zeilen 2-3 repräsentieren die Rekursionsbasis: DFT von einem Vektor mit einem Element ist das Element selbst.
[0]
weil: y 0  a0 .10  a0 .1  a0 . Zeilen 6-7 definieren die Koeffizienten-Vektoren der Polynome A und A .Die
[1]
Zeilen 4,5 und 13 sorgen dafür, dass  stets den Wert   nk hat. Die Zeilen 8-9 führen die rekursive
Berechnung y  DFTn / 2 für k=0,1,…,n/2-1: y k[ 0 ]  A[ 0 ] (nk / 2 ) und y k[1]  A[1] (nk / 2 ) oder, weil durch Cancellation
Lemma nk / 2  n2 k , ist dann y k[ 0 ]  A[ 0 ] (n2 k ) und y k[1]  A[1] (n2 k ) . Zeilen 11-12 kombinieren das Ergebnis der
Polynome und FFT, Mohsen Taheri, FU Berlin, SoSe 12
Seite 3
rekursiven Berechnung DFTn / 2 . Für y0 , y1 ,... yn / 21 berechnet die Zeile 11:
y k  y k[ 0 ]  nk y k[1]  A[ 0 ] (n2 k )  nk A[1] (n2 k )  A(nk ) . Für yn / 2 , yn / 21 ,... yn 1 und k=0,1,…,n/2-1 berechnet die
Zeile 12: yk ( n / 2)  yk[0]  nk yk[1]  yk[0]  nk n / 2 yk[1]  A[0] (n2k )  nk ( n / 2) A[1] (n2k )
 A[ 0] (n2 k n )  nk ( n / 2 ) A[1] (n2 k n )  A(nk ( n / 2 ) )
Deswegen ist der Vektor , der bei dem Algorithmus zurück gegeben wird, ist tatsächlich der DFT(a) .
Um die Laufzeit zu berechnen, betrachten wir dass jeder rekursiver Aufruf  (n ) Zeit kostet, wobei n die Länge des
Vektors a ist. Die Laufzeit berechnet sich: T (n )  2T (n / 2)   (n )   ( n lg n ) .
6. Interpolation in komplexen Einheitswurzeln
Nun beschäftigen wir uns mit umgekehrtem Verfahren, also ein Polynom von dem Point-Value Darstellung zurück zu
Koeffizienten-Darstellung transformieren( a  DFT 1 ( y ) ). Man kann die Berechnung von DTF als eine
Matrizenmultiplikation vorstellen:
1
 y 0  1 1

 
n2
 y1   1  n
 y  1  2
n4
n
DFT (a )   2   
3
n6
 y 3  1  n
   



 
 y  1  n 1  2( n  )
n
n
 n 1  
1



3
n
6
n
9
n


3( n 1)
n

1
 a 0 


n 1

n
  a1 
  n2 ( n 1)  a 2 


  n3( n 1)  a 3 
  




  n( n 1)( n 1)  a n 1 
Die Matrix heißt Vandermonde-Matrix und wird als Vn bezeichnet. Damit man von dem Vektor a den Vektor y
nachrechnet, braucht man Vn1 , die Inverse-Matrix von Vn .
Theorem: Für j,k=0,1,…,n-1 sind die (j,k)Einträge von Vn1 die Zahlen  n kj / n .
Beweis: Zu zeigen: Vn1Vn  I n , wobei I n die n×n Identitätsmatrix ist. Betrachte die (j,j' )Einträge von Vn1Vn :
[Vn1Vn ] jj'  k 0 (n kj / n)(nkj ' )  k 0 (n k ( j  j ') / n)
n 1
n 1
Beweise: Falls j=j' ist diese Summe gleich 1. Im Falle j≠j'gilt: Da -(n-1)≤j-j'≤n-1 , ist j-j' sicherlich nicht durch n
dividierbar. Deswegen kann man das Summation Lemma anwenden, und somit ist die Summe in diesem Fall immer
gleich 0. □
1
Nun, dass wir Vn berechnet haben:
I)
y  DFT ( a )  Vn .a  Vn1 . y  Vn1 .Vn .a  I n .a  a  a  Vn1 . y
II)
(j,k)Einträge der Vn1 sind: [Vn1 ] jk  n kj / n
I  II  a j 
1 n 1
 yk nkj
n k 0
Vergleicht man diese Formel mit der von einem Polynom in Einheitswurzeln( yk 

n 1
k 0
ak nk ) sieht man, dass mit
einer leichten Modifikation in Recursive-FFT, man die Interpolation berechnen kann. Die Modifikation ist wie folgt.
Tausche a und y, ersetze n durch n , und dividiere jedes Element durch n. Also ist die Interpolation auch
in  (n lgn) berechenbar.
1
7. Zusammenfassung
Wir haben gezeigt, dass mit Hilfe vom Recursive-FFT man die Evaluation und Interpolation eines Polynoms in
 (n lgn) durchführen kann. Damit man zwei Polynome in Koeffizienten-Form in  (n lgn) multipliziert, wird man sie
zunächst in Point-Value-Form umwandeln. Diese Transformation ist in  (n lgn) machbar. Die Multiplikation in PointValue-Form kostet nun  (n ) Zeit. Nachher wird man das Ergebnis der Multiplikation in  (n lgn) zurück in
Koeffizienten-Form umwandeln. Somit kann man diese Multiplikation insgesamt in  (n lgn) durchführen.
Polynome und FFT, Mohsen Taheri, FU Berlin, SoSe 12
Seite 4
Herunterladen