400 likes | 602 Views
Fibonacci & Friends. Inhoud. Fibonaccigetallen Toepassing voor AVL-bomen …. Konijnen. (Voorbeeld uit De Telduivel ) Elk paar konijnen van twee maanden of ouder krijgt elke maand twee kinderen Hoeveel konijnen zijn er in maand i ? Fibonacci-getal!. De maanden. Maand 1: 1 Maand 2: 1
E N D
Inhoud • Fibonaccigetallen • Toepassing voor AVL-bomen • …
Konijnen • (Voorbeeld uit De Telduivel) • Elk paar konijnen van twee maanden of ouder krijgt elke maand twee kinderen • Hoeveel konijnen zijn er in maand i? • Fibonacci-getal!
De maanden • Maand 1: 1 • Maand 2: 1 • Maand 3: 2 (beginpaar krijgt kinderen) • Maand 4: 3 (beginpaar krijgt kinderen) • Maand 5: 5 (alle paren die er in maand 3 waren krijgen kinderen) • Maand 6: 8 (alle paren die er in maand 4 waren krijgen kinderen)
Recurrente betrekking • A(1)=1 • A(2)=1 • Als i > 2dan A(i) = A(i – 1) + A(i – 2) • Reeks getallen: 1,1,2,3,5,8,13,21,34,55, … • Heet de reeks Fibonaccigetallen
Notatie • f(k) = k-de Fibonaccigetal • f(0) = 0 • Dus f(0)=0; f(1)=1; f(k) = f(k-1)+f(k-2) als k>1 • 0, 1, 1, 2, 3, 5, …
Italiaans wiskundige (1170-1250), Pisa Leerboeken (o.a. decimaal getallenstelsel voor handelaars) Getaltheorie Eerste Europeaan met Fibonaccirij (al eerder in Indiase wiskunde bekend) Fibonacci
Toepassingen van Fibonaccirij • In de natuur: o.a. schelpen, zonnebloemen • In de wiskunde • In de informatica • Hier: analyse van AVL-bomen • In de kunst en architectuur (verband met gulden snede) • Mooi voorbeeld van recurrente betrekking
Euclides • Grootste gemene deler • Bijv.: • ggd(30,20) = 10 • ggd(75,33) = 3 • Toepassing o.a. in cryptografie (bijv. Public key cryptografie gebaseerd op priemfactoren…) • Hoe vind je de ggd van twee gegeven positieve integers snel?
Simpele methode • Gegeven positieve integers x, y • Gevraagd: bereken ggd(x,y) • Methode 1: ontbind x en y in priemfactoren • Kijk welke priemfactoren overeenkomen
Voorbeeld • 60 = 2 * 2 * 3 * 5 • 72 = 2 * 2 * 2 * 3 * 3 • 2, 2, 3 gemeen, dus ggd(60,72) = 2 * 2 * 3 = 12
Methode 2:Algoritme van Euclides • ... maak een rij getallen, beginnend met x en y, en elk volgend getal is: • het laatste getal modulus het een-na-laatste getal • ...
EuclidesGGD(x, y) while (y != 0) do z = x mod y x = y; y = z; return x Rest bij deling Vb: 60, 36 36, 24 24, 12 12, 0 Dus antwoord 12 Euclides
240, 147 147, 93 93, 54 54, 39 39, 15 15, 9 9, 6 6, 3 3, 0 Acht stappen Antwoord 3 Hoeveel stappen zijn er nodig? Soms gaat ‘t snel, soms niet
Lemma • Als we k delingen nodig hebben om de ggd van twee getallen a en b te berekenen met a>b, dan is a ³ f(k+1). • (k+1)e Fibonaccigetal
Noem de resten die we krijgen van achteraf a0 a1 … ak-1 en zet ak= b en ak+1 = a Vb. a0 = 0; a1 = 3; a2 = 6; a3 = 9; a4 = 15; a5=39; a6 = 54; a7 = 93; a8 = 147; a9 = 240 240, 147 147, 93 93, 54 54, 39 39, 15 15, 9 9, 6 6, 3 3, 0 Bewijs (1): definitie a-reeks
Bewijs (2): eigenschappen a-reeks • a0 = 0; a1 > 0 (vanwege Euclides-algoritme) • a2 > 1, want delen door 1 geeft rest 0 dus a2 = 1 geeft a1 = 0 • k> 2: ak³ak-1 + ak-2 • Omdat akmod ak-1 = ak-2 en ak> ak-1 • Zie algoritme en manier waarop we de a-reeks maakten • Met inductie naar k volgt nu: • ak³ f(k) QED
Eigenschappen van Fibonacci getallen (2) • f(-1) = f(1) – f(0) = 1 • Bewijzen met inductie meestal met twee basisgevallen • Stelling: f(n+k) = f(k)*f(n+1)+f(k-1)*f(n) • Dit heet de Fibonacci Increment Stelling • Bewijs • Basisgeval k=0: f(0)*f(n+1)+f(-1)*f(n)= 0*f(n+1)+1*f(n)=f(n) = f(n+0) • Basisgeval k=1: f(1)*f(n+1) + f(0)*f(n+1)=1*f(n+1)+0*f(n)= f(n+1) • Inductiestap: ..
Inductiestap van f(n+k) = f(k)*f(n+1)+f(k-1)*f(n) • We nemen aan dat dit geldt voor alle kleinere waarden van k: in het bijzonder voor k-1 en k-2: • f(n+k-1) = f(k-1)*f(n+1)+f(k-2)*f(n) • f(n+k-2) = f(k-2)*f(n+1)+f(k-3)*f(n) • Nu: f(n+k) = f(n+k-1)+f(n-k-2) =f(k-1)*f(n+1)+f(k-2)*f(n) + f(k-2)*f(n+1) + f(k-3)*f(n) =(f(k-1)+f(k-2))f(n+1) + (f(k+2)+f(k+3)*f(n) =f(k)*f(n+1) + f(k-1)*f(n) • We gebruikten de Inductiehypothese en we gebruiken de definitie van de Fibonaccirij
Oneven • Fibonaccigetallen op oneven posities sommeren tot volgende Fibonaccigetal: • 0 1 1 2 3 5 8 13 21 34 • 1 2 5 13 hebben samen som 34
Kwadraten • f(2n+1) = f(n+n+1) = f(n+1)*f(n+1) + f(n)*f(n) = f(n+1)2 + f(n)2
Waarde van f(n) • Hoe groot is eigenlijk f(n) • Soort exponentieel gedrag • Simpel: f(n) £ 2n • Met inductie • Ook simpel: f(n) ³ 2n/2 = (wortel van 2)n • Kunnen we preciezer zijn?
Exponentieel gedrag preciezer • Stel eens dat g(n) = qn • Voor een functie g die voldoet aang(n)=g(n-1)+g(n-2) voor alle n • Dan dus: qn= qn-1+qn-2 • Deel door qn-2 geeft: q2 = q + 1 • Oplossen met abc-formule geeft of
Exponentieel gedrag • Schrijf j = (1 + sqrt(5))/2 en • j’= (1 - sqrt(5))/2 • j = ongeveer 1.618 • j’= ongeveer -0.618 • De rij f(n)=jn voldoet aan f(n)=f(n-1)+f(n-2) • Maar de beginwaarden kloppen niet…
Combinatiestelling • Voor elk paar getallen A en B voldoet de rijf(n) = A jn + B j’ n aan de eigenschap f(n)=f(n-1)+f(n-2) • Eenvoudig uitschrijven na wat we weten… • Fibonaccirij is ook van deze vorm • Reken uit A en B: • n= 0: f(0)=0 = A j0 + B j’0 = A+B • n= 1: f(1)=1 = A j1 + B j’1 = A j + B j’ • Door oplossen krijg je A = 1/sqrt(5); B= -1/sqrt(5)
Conclusie Deze waarden zijn voor elke integer n een geheel getal!
Conclusie vervolg • j’n gaat snel naar 0 en is altijd kleiner dan 1 want j’is ongeveer -0.618 • De term j’n kan dus alleen de afronding beinvloeden van de formule voor f(n) en f(n) is dus ongeveer
Euclides • Hoe lang duurt het algoritme van Euclides? • Als we ons grootste getal a bestaat uit r bits, en we doen k delingen danf(k+1) £ a £ 2r • 1/ sqrt(5) jk£ 2r • jk£ 2r * sqrt(5) • k£ r/log(j) +O(1) • log(j) is ongeveer 0.694 (als ik ‘t goed heb uitgerekend)
AVL-bomen • Het minimaal aantal knopen in een AVL-boom met hoogte h voldoet zo ongeveer aan de eigenschappen van een Fibonaccirij • Stel A(h) is minimum aantal knopen van een AVL-boom met diepte h • Kijk naar wortel. Linker en rechterdeelboom hebben hoogte h-1 of h-2 en minstens eentje heeft hoogte h-1 • Dus A(h) = A(h-1)+A(h-2)+1 • (eentje voor de wortel zelf) • Wat moeten we doen met de +1? Een simpel trucje…
AVL en Fibonacci • We weten A(h)=A(h-1)+A(h-2)+1 • Schrijf nu B(h) = A(h) + 1 • Nu geldt: B(h) = A(h-1)+1 + A(h-2)+1 = B(h-1)+B(h-2) • Dus B is een soort Fibonacci-rij, met misschien andere beginwaarden • En is dus te schrijven als lineaire combinatie van jnen j’n, en de laatste term gaat naar 0 voor grote n. • Dus A(h) = Q(jn) • Afgerond: A(h) = O(1.6181h) en A(h)=W(1.6180h)
Scherpere grens op hoogte AVL-boom • A(h) = O(1.6181h) en A(h)=W(1.6180h) • A(h) = Q(jn) • A(h) was minimum aantal knopen in AVL-boom met hoogte h • Voor elke AVL-boom met n knopen en hoogte h geldt dat n³ A(h) = W(1.6180h) • Dus log n³ log (Q(jh))= h * log(j) + Q(1) • h £ log n / log(j) + Q(1) • En dus h £ 1.44 log n (ongeveer)
De gulden snede • Het getal j speelt een rol in de kunst en architectuur • Aangenomen wordt dat afstanden die zich als 1: j verhouden er mooi uit zien.
Andere recurrenties • Voor ‘t oplossen van andere “exponentiele” recurrente betrekkingen zijn er allerlei methoden • Voorbeeldje • Onafhankelijke deelverzameling in graaf • Stel knopen die allemaal geen kant onderling hebben
Onafhankelijke deelverzameling • Deelverzameling knopen die onderling allemaal geen kant gemeen hebben • Probleem: zoek een zo groot mogelijke voor gegeven graaf
Algoritme • if er is een knoop v met geen buren of maar 1 buur then • Recursief zoek de beste oplossing S als we v weglaten • Return S + {v} • else kies een knoop v • Recursief zoek de beste oplossing S als we v weglaten • Recursief zoek de beste oplossing T als we v en alle buren van v weglaten • Return de beste: S of T+{v}
Exponentiele algoritmen • Dit soort algoritmen is exponentieel • Tijd is iets van O(cn) voor een getal c tussen 1 en 2 • Hoe lager c hoe beter • Hoe vinden we een grens?
Analyse • Schrijf: Aantal vertakkende recursieve aanroepen is T(n) • T(n) £ T(n-1)+T(n-3)+1 • Want in 1 geval laten we 1 knoop weg, in andere geval laten we minstens 3 knopen weg • Schrijven we Q(n)=T(n)+1 dan • Q(n) £ Q(n-1)+Q(n-3) • We willen e • Stel Q(n) £ a*cn • Dan a* cn £ a* cn-1 + a* cn-3
Vervolg • Dan a* cn £ a* cn-1 + a* cn-3 • Deel a eruit: cn £ cn-1 + cn-3 • Deel door cn: • 1 £ c-1 + c-3 • Los de vergelijking 1 = c-1 + c-3 op, bijvoorbeeld met Mathematica, Maple, Excel Solver. Of natuurlijk analytisch… • Excel geeft mij 1.4656 • Dus algoritme gebruikt tijd O(1.4656n) • Veel betere algoritmen bestaan (eerste stap is wegwerken van knopen met twee buren); heel veel van de analyse is op dit principe gebaseerd…
Conclusie • Fibonaccigetallen • Hoe bepaal je het soort exponentieel gedrag van dit soort reeksen en dit soort recurrente betrekkingen?