Zaawansowane algorytmy i struktury danych/Wykład 4: Różnice pomiędzy wersjami
Nie podano opisu zmian |
|||
Linia 303: | Linia 303: | ||
<math>\omega_m = e^{-\frac{2\pi i}{n}}</math> i podzielić otrzymany wynik | <math>\omega_m = e^{-\frac{2\pi i}{n}}</math> i podzielić otrzymany wynik | ||
przez <math>n</math>. | przez <math>n</math>. | ||
== Dzielenie wielomianów == | |||
W tej części wykładu skupimy się na problemie dzielenia dwóch | |||
wielomianów. Niech <math>A(x)</math> będzie wielomianem stopnia | |||
<math>m</math> a <math>B(x)</math> wielomianem stopnie | |||
<math>n</math>. W problemie dzielenia wielomianów, chcemy obliczyć | |||
dwa wielomiany <math>D(x)</math> i <math>R(x)</math> takie, że | |||
<center><math> | |||
A(x) = B(x) D(x) + R(x), | |||
</math></center> | |||
oraz stopień wielomianu <math>R(x)</math> jest ostro mniejszy niż | |||
<math>n</math>. Wielomian <math>D(x)</math> nazywamy {{def|wynikiem | |||
dzielenia|}, a wielomian <math>R(x)</math> to {{def|reszta z | |||
dzielenia|}. Pierwszy pomysł jaki się od razu nasuwa, to spróbować | |||
policzyć odwrotność wielomianu <math>B(x)</math> i przemnożenie | |||
przez tą odwrotność stronami tego równania. Niestety wielomiany nie | |||
mają niestety odwrotności będących wielomianami. Jednak nie pozostajemy | |||
tutaj zupełnie bezradni. Możemy rozszerzyć naszą dziedzinę obliczeń | |||
tak aby zagwarantować istnienie pewnych odwrotności. | |||
Obliczenia będziemy wykonywać nad zbiorem szeregów formalnych | |||
<math>F[[x]]</math> nad ciałem <math>F</math>, patrz | |||
[[Matematyka_dyskretna#szeregi formalne| Wykład z matematyki | |||
dyskretnej]]. Dla części elementów <math>F[[x]]</math> istnieją | |||
odwrotności. Elementy te są postaci <math>1 + x A(x)</math> gdzie | |||
<math>A(x) \in F[[x]]</math>. | |||
{{cwiczenie|odwrotność_formalna| | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
Czy umiesz obliczyć odwrotność dla szeregu <math>1 + x</math>? | |||
Jak ukryć kawałek tekstu | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Odwrotność to <math>\sum_{i=0}^{\infty} (-x)^{i}</math>. | |||
</div> | |||
</div> | |||
}} | |||
== Interpolacja wielomianów == | |||
== Obliczanie wartości wielomianu w wielu punktach == |
Wersja z 14:59, 19 lip 2006
Abstrakt
Naturalna metoda dodawania dwóch wielomianów wymaga czasu , natomiast prosty algorytm mnożenia dwóch wielomianów stopnia wymaga czasu . W wykładzie tym pokażemy, jak z wykorzystaniem szybkiej transformaty Fouriera (STF), wykonać wszystkie podstawowe operacje na wielomianach w czasie większym niż o czynnik polilogarytmiczny. Pokażemy jak dla wielomianów stopnia :
- mnożyć je w czasie ,
- obliczać wielomian interpolacyjny w czasie ,
- obliczać wartość wielomianu w punktach w czasie ,
- dzielić wielomiany w czasie .
Mnożenie wielomianów w punktach
Niech i będzą wielomianami stopnia nad ciałem . Wielomiany te możemy jednoznaczne reprezentować poprzez ich wartości w punktach. Następujące twierdzenie zostało sformułowane w ramach wykładu z Metod Numerycznych.
Twierdzenie [Twierdzenie o interpolacji wielomianów]
Niech będzie ustalonym zbiorem parami różnych punktów
. Dla tego zbioru punktów
możemy wyznaczyć zbiory wartości wielomianów:
Niech będzie wynikiem mnożenia
wielomianów i , mamy wtedy
.
Ponieważ stopień wielomianu jest nie większy niż
to z Twierdzenia o interpolacji zbiór wartości
,
jednoznacznie wyznacza wielomian . Mając
zbiory i możemy wyznaczyć zbiór
w czasie . Procedura ta jest
przedstawiona na następującym rysunku:
<flash>file=Zasd_fft1.swf|width=460|height=350</flash>
Jednak aby ostatecznie otrzymać szybszy algorytm niż algorytm naiwny
musimy pokazać jak rozwiązać problem obliczania wartości wielomianu
w punktach w czasie szybszym niż
. Podobnie musimy umieć obliczać wielomian
interpolacyjny dla danego zbioru punktów.
Szybka transformata Fouriera (STF)
Problem obliczania wartości wielomianu w punktach i problem jego interpolacji rozwiążemy wykorzystując szybką transformatę Fouriera. W poprzednim rozdziale nie zakładaliśmy nic na temat zbioru punktów . Głównym pomysłem w konstrukcji algorytmu STF będzie właśnie wybór odpowiedniego zbioru punktów X tak, aby jak największa ilość wykonywanych obliczeń powtarzała się.
Założymy chcemy obliczyć wartości wielomianu oraz jest parzyste. Jeżeli jest nieparzyste to dodajemy na początek jednomian co nie zmienia nam wyniku działania algorytmu. Punkty zdefiniujemy w następujący sposób:
.
Dla wielomianu definiujemy dwa nowe wielomiany i poprzez wybranie do nich współczynników o numerach odpowiednio parzystych i nieparzystych:
,
.
Wielomiany oraz są stopnia co najwyżej . Co więcej zachodzi:
(1)
Widzimy teraz, że problem ewaluacji wielomianu w punktach sprowadza się do:
- ewaluacji wielomianów i
w punktach
.
- a następnie obliczenie wartości wyniku zgodnie ze wzorem (1).
Zauważmy, że z definicji punktów $x_i$ mamy:
.
Możemy teraz zauważyć, że zachodzi , a więc . Udało nam się więc zredukować problem rozmiaru - obliczenia wartości wielomianu stopnia w do punktach, do dwóch problemów rozmiaru - obliczenia wartości wielomianów i stopnia w punktach. Możemy teraz zastosować tą technikę rekurencyjne otrzymując następujący algorytm.
Algorytm Algorytm Szybkiej Transformaty Fouriera
STF() if nieparzyste then dodaj wyraz do zwiększ if then return a for k=0 to do \omega = \omega \omega_n return y
Algorytm ten najpierw oblicza SFT wielomianów i a następnie łączy te wyniki w celu wyliczenia SFT dla wielomianu . Przeanalizujmy teraz wykonanie pętli. Zauważmy najpierw, że w 'tym kroku pętli mamy . Czyli:
oraz
Gdzie w ostatniej równości skorzystaliśmy ze wzoru (1). Widzimy zatem, że algorytm poprawnie oblicza wartość STF dla wielomianu . Równanie rekurencyjne na czas działania procedury STF wygląda następująco:
.
Odwrotna transformata Fouriera
Aby zakończyć konstrukcję algorytmu dla szybkiego mnożenia wielomianów pozostaje nam pokazanie jak wykonać obliczyć wielomian interpolujący dla zbioru punktów . Obliczenie wykonane w czasie szybkiej transformaty Fouriera możemy przedstawić w postaci macierzowej jako mnożenie macierzy przez wektor , gdzie jest macierzą Vandermonde'a zawierającą potęgi
Element macierzy dany jest jako
.
Korzystając z definicji zbioru otrzymujemy
W celu wykonania operacji odwrotnej do SFT, czyli obliczenia wielomianu interpolacyjnego, musimy wykonać mnożenie .
{{lemat||| Niech macierz będzie zdefiniowana jako
jest macierzą odwrotną do macierzy .
}
Dowód
Pokażemy, że . Rozważmy pozycję macierzy :
Jeżeli to i suma ta jest równa . W przeciwnym przypadku
możemy skorzystać ze wzoru na sumę szeregu geometrycznego:
Czyli rzeczywiście . \qed

Porównując postać macierzy oraz macierzy widzimy, że w celu obliczenia transformaty odwrotnej możemy użyć Algorytmu Szybkiej Transformaty Fouriera, musimy tylko zamienić linijkę na i podzielić otrzymany wynik przez .
Dzielenie wielomianów
W tej części wykładu skupimy się na problemie dzielenia dwóch wielomianów. Niech będzie wielomianem stopnia a wielomianem stopnie . W problemie dzielenia wielomianów, chcemy obliczyć dwa wielomiany i takie, że
oraz stopień wielomianu jest ostro mniejszy niż
. Wielomian nazywamy {{def|wynikiem
dzielenia|}, a wielomian to {{def|reszta z
dzielenia|}. Pierwszy pomysł jaki się od razu nasuwa, to spróbować
policzyć odwrotność wielomianu i przemnożenie
przez tą odwrotność stronami tego równania. Niestety wielomiany nie
mają niestety odwrotności będących wielomianami. Jednak nie pozostajemy
tutaj zupełnie bezradni. Możemy rozszerzyć naszą dziedzinę obliczeń
tak aby zagwarantować istnienie pewnych odwrotności.
Obliczenia będziemy wykonywać nad zbiorem szeregów formalnych nad ciałem , patrz Wykład z matematyki dyskretnej. Dla części elementów istnieją odwrotności. Elementy te są postaci gdzie .
Ćwiczenie odwrotność_formalna