Rekurencja Matematyka dyskretna
Rekurencja Definicja rekurencyjna (indukcyjna) nieformalnie: taka definicja, która odwołuje się do samej siebie, ale trzeba tu uważać, by odwołanie było do instancji o mniejszej komplikacji, zwykle chodzi o ciąg < a!, a!, a!, >, dla którego przepis na element a! wykorzystuje jakieś poprzednie elementy, np. a!!!, a!!!, itp., początkowy element (lub kilka początkowych) muszą być zadane konkretnie, żeby było od czego zacząć, zwykle definicja rekurencyjna odwołuje się do jednego lub kilku poprzednich elementów, ale może też odwoływać się do wszystkich poprzednich.
Przykład R. 1. Wieże Hanoi - E. Lucas, 1883 Legenda mówi, że w pewnym klasztorze buddyjskim, Budda umieścił 64 złote krążki na jednej z trzech diamentowych iglic tak, że krążki wyżej umieszczone miały mniejsze promienie. Mnisi bez wytchnienia przekładają krążki na trzecią iglicę w ten sposób, że: w jednym ruchu przenosić tylko jeden krążek, krążek większy nigdy nie może leżeć na krążku mniejszym, można posługiwać się środkową iglicą. Kiedy skończą świat skończy się. Ile czasu im to zajmie?
Wieże Hanoi analiza H! = 1 dla n = 1 2 H!!! + 1 dla n 1 Możemy policzyć kilka jego wyrazów: 1, 3, 7, 15, 31, 63, (są to kolejne potęgi dwójki pomniejszone o 1). Zgadujemy, że: Udowodnimy to za pomocą indukcji: 1. Sprawdzamy dla n=1 (bazą indukcji): H! = 2 n 1 (1) Ze wzoru (1) H! = 2! 1 = 1 tak jak we wzorze rekurencyjnym. 2. Założenie indukcyjne: H k = 2 k 1 H k!! = 2 H k + 1 = 2 2 k 1 + 1 = 2 k!! 1 (krok indukcyjny) ckd (1). Ponieważ mnisi muszą wykonać co najmniej 2!" 1 ruchów, więc nawet jeśli pracują w tempie 1 operacji na sekundę, mamy przed sobą jeszcze H!" = 2!" 1 s 6 10!! lat.
Wieże Hanoi - algorytm rekurencyjny W celu przeniesienia krążków z A do C należy: 1. przenieść n- 1 krążków z A do C - wówczas n- ty dysk samotnie pozostaje w A 2. przenieść n- ty (największy krążek) z A do B 3. przenieść n- 1 krążków z C do B
Algorytm rozwiązania problemu Wież Hanoi dla N krążków i trzech kołków A, B, C procedura przenieś(n,x,y,z) //przenieś N z X na Y używając Z { if (N = = 1) wypisz(x," ", Y); else { przenieś(n- 1,X,Z,Y); //przenieś N- 1 z X na Z używając Y wypisz(x," ", Y); przenieś(n- 1,Z,Y,X); //przenieś N- 1 z Z na Y używając X } }
Metody rozwiązywania równań rekurencyjnych podstawienia: zgadujemy oszacowanie, a następnie dowodzimy przez indukcję, że odgadliśmy prawidłowo iteracyjna: przekształcamy rekurencję w sumę a następnie ją ograniczamy rekurencji uniwersalnej: stosujemy twierdzenie do rekurencji uniwersalnej metoda ogólna rozwiązywania liniowych równań rekurencyjnych (funkcje tworzące)
Metoda podstawienia Metoda rozwiązywania równań rekurencyjnych przez podstawianie polega na przyjęciu postaci rozwiązania, a następnie wykazaniu przez indukcję, że jest ono poprawne. Bardzo skuteczna jeśli zna się (zgadnie) rozwiązanie. Stosowana tylko w przypadkach, kiedy łatwo jest przewidzieć postać rozwiązania.metoda może być użyta do określenia albo górnego albo dolnego oszacowania wartości rozwiązania rekurencji.
Metoda iteracyjna polega na rozwijaniu (iterowaniu) rekurencji i wyrażanie jej jako sumy składników zależnych tylko od n warunków brzegowych. Następnie mogą być użyte techniki sumowania do oszacowania rozwiązania. Metoda iteracyjna jest zazwyczaj związana z dużą ilością przekształceń algebraicznych, wiec zachowanie prostoty nie jest łatwe. Punkt kluczowy to skoncentrowanie się na dwóch parametrach: liczbie iteracji koniecznych do osiągnięcia warunku brzegowego oraz sumie składników pojawiających się w każdej iteracji.
Notacje asymptotyczne O, Ω, Θ Nie zawsze można podać postać zwartą (nieuwikłaną) dla ciągu zadanego równaniem rekurencyjnym. Do tej pory nie jest znana zwarta postać wielu równań. Na szczęście często można wyznaczyć przybliżone, asymptotyczne oszacowania ciągów lub ogólniej funkcji. Opisują one zachowanie funkcji wraz ze wzrostem argumentu. Podczas przekształceń rachunkowych celowo ograniczamy naszą wiedzę o funkcji, dzięki czemu łatwiej jest rachować i otrzymać zadowalającą postać przybliżającą. W oszacowaniach asymptotycznych posługujemy się ogólnie przyjętymi symbolami opisującymi asymptotyczne zachowanie jednej funkcji wobec drugiej. Notację asymptotyczną wprowadzimy jedynie dla funkcji zdefiniowanych na zbiorze N (lub jego podzbiorach) o wartościach w R.
O notacja ( wielkie O ) Asymptotyczna granica górna dla szacowania funkcji z góry z dokładnością do stałego współczynnika (wprowadzona przez P. Bachmanna w 1894 r) cg(n) f(n) n0 n O f ( n) = O( g( n)) ( g( n) ) = { f ( n) : c > 0 n n n 0 f ( n) cg( n)} 0 0
Ω notacja Asymptotyczna granica dolna dla szacowania funkcji z dołu z dokładnością do stałego współczynnika ( ) ( ) ( ) { ( ) ( )} n f n cg n n n c n f n g n g n f > = Ω = Ω 0 0 : )) ( ( ) ( 0 0
Θ notacja asymptotycznie dokładne oszacowanie mówimy, że g(n) jest asymptotycznie dokładnym oszacowaniem dla f(n) (oznaczenie f(n)=θ(g(n))) lub inaczej, że począwszy od n0 funkcja f(n) jest równa g(n) z dokładnością do stałego współczynnika gdy: Θ f ( n) = Θ( g( n)) ( g( n) ) = { f ( n) : c, c > 0 n n n 0 c g( n f ( n) c g( n)} 1 2 0 0 1 ) 2 c2g(n) f(n) c1g(n) n0 n
Metoda rekurencji uniwersalnej Metoda rekurencji uniwersalnej podaje uniwersalny przepis rozwiązywania równania rekurencyjnego postaci T(n) = Θ(1) dla n {0,1} a T(n/b) + f(n) dla n > 1 gdzie a 1 i b > 1 są stałymi, a f(n) jest funkcją asymptotycznie dodatnią. Za wartość (n/b) przyjmujemy najbliższą liczbę całkowitą (mniejsza lub większą od wartości dokładnej). Rekurencja opisuje czas działania algorytmu, który dzieli problem rozmiaru n na a problemów, każdy rozmiaru n/b, gdzie a i b są dodatnimi stałymi. Każdy z a problemów jest rozwiązywany rekurencyjnie w czasie T(n/b). Koszt dzielenia problemu oraz łączenia rezultatów częściowych jest opisany funkcją f(n).
Twierdzenie R. 1. Twierdzenie o rekurencji uniwersalnej Niech a 1, b>1 będą stałymi, niech f(n) będzie pewną funkcją i niech T(n) będzie zdefiniowane dla nieujemnych liczb całkowitych przez rekurencję Θ(1) dla n {0,1} T(n) = a T(n/b) + f(n) dla n > 1 gdzie n/b oznacza kres dolny ( n/b ) lub górny ( n/b ) z wyrażenia n/b. Wtedy funkcja T(n) może być ograniczona asymptotycznie w następujący sposób: 1. Jeśli f(n) = O( 2. Jeśli f(n) = ( n log b a ) b a ε n log ) dla ε>0 to T(n) = Θ ( n log b a ) log b a Θ to T(n) = Θ n log n) ( 2 3. Jeśli f(n) = ( log b a Ω n + ε ) dla pewnego ε>0 i jeśli af(n/b) cf(n) dla pewnego c<1 i dostatecznie dużych n to T(n) = Θ ( f ( n)) Dowód twierdzenia w: T. Cormen, Ch. Leiserson, R. Rivest: Wprowadzenie do algorytmów. WNT 2007.
Uwagi do twierdzenia o rekurencji uniwersalnej Istnieją trzy możliwości, mówiące o tym, że: 1. n log b a jest wielomianowo większa od f(n) 2. log b a n jest tego samego rozmiaru co f(n) 3. log b a n jest wielomianowo mniejsza od f(n) W trzecim przypadku warunek af(n/b) cf(n) znany jest jako warunek regularności.
Uwagi do twierdzenia o rekurencji uniwersalnej Trzy omawiane przypadki nie obejmują wszystkich możliwych przypadków funkcji f(n). Jest pewna luka pomiędzy przypadkami 1 i 2, gdy f(n) jest mniejsza ale nie wielomianowo, oraz pomiędzy przypadkami 2 i 3, gdy f(n) jest większa ale nie wielomianowo. Jeżeli funkcja f(n) wpada w jedną z tych luk albo gdy nie zachodzi warunek regularności w przypadku 3, to metoda rekurencji uniwersalnej nie może być zastosowana to rozwiązania równania rekurencyjnego. Twierdzenie o rekurencji uniwersalnej można dowieść korzystając z metody iteracyjnej.
Liczby Fibonacciego (Leonardo Fibonacci (1175 1250)) Ciąg Fibonacciego ciąg liczb naturalnych określony rekurencyjnie w sposób następujący: Pierwszy wyraz jest równy 0, drugi jest równy 1, każdy następny jest sumą dwóch poprzednich. Formalnie: F! = 0 dla n = 0 1 dla n = 1 F!!! + F!!! dla n > 1 Kolejne wyrazy ciągu Fibonacciego to: F 0 F 1 F 2 F 3 F 4 F 5 F 6 F 7 F 8 F 9 F 10 F 11 F 12 F 13 0 1 1 2 3 5 8 13 21 34 55 89 144 233 Ciąg został podany w 1202 roku przez Leonarda z Pizy, zwanego Fibonaccim w swoim dziele Liber abaci jako rozwiązanie zadania o rozmnażaniu się królików. Nazwę "ciąg Fibonacciego" spopularyzował w XIX w. Édouard Lucas.
Własność ilorazu Iloraz dowolnego elementu ciągu Fibonacciego i jego poprzednika jest ze wzrostem wskaźnika coraz lepszym przybliżeniem boskiej liczby φ. Przy 14 elemencie przybliżenie daje już dokładność 14 miejsc dziesiętnych. Twierdzenie R. 2. Keplera (Jan Kepler (1571 1630)) φ = lim n! F n!! F n
Złota liczba φ Liczba φ, określająca tzw. złotą proporcję (złoty podział, złota liczba, boski podział). Dwie wielkości a i b są w złotym stosunku φ jeżeli:. Odkryta została w starożytnej Grecji, a udokumentowana przez Euklidesa (300 pne). φ =!!!! = 1,6180339887
Własności φ Potęgowanie φ φ! = φ + 1 φ! = φ + 1 φ = φ! + φ = φ + φ + 1 = 2φ + 1 φ! = 3φ + 2 φ! = F!!! φ + F!!! Odwrotność liczby φ 1 φ = φ 1 Suma początkowych liczb Fibonacciego (dowód indukcyjny)! F!!!! = F!!! 1 Stąd np. F!" + + F!" = F!! F!"
Trójki pitagorejskie Trójką pitagorejską nazywamy trzy liczby naturalne spełniające równanie Pitagorasa: a! = b! + c!. Pierwszą taką trójką jest: 3, 4, 5. Większe trójki można konstruować wykorzystując dowolne cztery kolejne wyrazy ciągu Fibonacciego. Trójkę utworzą: (1) iloczyn dwóch skrajnych wyrazów, (2) podwojony iloczyn dwóch środkowych wyrazów i (3) suma kwadratów dwóch środkowych wyrazów. Np. 2, 3, 5, 8; 2 8 = 16, 2 3 5 = 30, 3 3 + 5 5 = 34; 16! + 30! = 34!
Wielkie twierdzenie Fermata Twierdzenie R. 3. Twierdzenie Fermata Nie istnieje trójka dodatnich liczb całkowitych będąca rozwiązaniem równania: a! = b! + c! dla n N, n > 2. Pierre Fermat (1601 1655) zanotował je na marginesie łacińskiego tłumaczenia książki Arithmetica Diofantosa i opatrzył następującą uwagą: znalazłem zaiste zadziwiający dowód tego twierdzenia. Niestety, margines jest zbyt mały, by go pomieścić. Twierdzenie zostało sformułowane przez Fermata w roku 1637. Opublikowano je dopiero w roku 1670, po odnalezieniu go w pozostałych po śmierci pismach Fermata, i z miejsca stało się wyzwaniem dla kolejnych pokoleń matematyków. Wiadomo bowiem było, że wiele hipotez formułowanych przez Fermata okazało się prawdziwymi, a ich dowody zostały znalezione przez innych. To jedno przez ponad 300 lat opierało się próbom dowodu w ogólności, znane były dowody szczególnych przypadków. Dlatego też nazwane zostało ostatnim twierdzeniem Fermata. Dowód ostatecznie został przeprowadzony przez angielskiego matematyka Andrew Johna Wilesa w roku 1994. Zajmował ok. 100 stron A4 i wyrażony był w języku topologii i krzywych eliptycznych. (za: http://pl.wikipedia.org/wiki/wielkie_twierdzenie_fermata)
Wzór Bineta (Eulera Bineta) Jawny wzór na n- ty wyraz ciągu Fibonacciego podany w roku 1843 przez J.P.M. Bineta możemy otrzymać, korzystając z metody funkcji tworzących. Zdefiniujmy ciąg i dla tego ciągu obliczmy wzór na jego n- ty wyraz. Funkcja tworząca dla tego ciągu ma postać Podstawiając otrzymujemy: tak więc:
Uprościmy wyrażenie gdzie wówczas tak więc Podstawiając otrzymujemy ostatecznie tzw. formułę Bineta
Twierdzenie R. 4. Twierdzenie Eulera- Bineta (1843) Ogólna postać wzoru na wyraz ciągu Fibonacciego: