Fibonacci & Friends Met dank aan Gerard Tel
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 > 2 dan 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, …
Fibonacci Italiaans wiskundige (1170-1250), Pisa Leerboeken (o.a. decimaal getallenstelsel voor handelaars) Getaltheorie Eerste Europeaan met Fibonaccirij (al eerder in Indiase wiskunde bekend)
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 ...
Euclides EuclidesGGD(x, y) Rest bij deling Vb: 60, 36 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
Soms gaat ‘t snel, soms niet 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?
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
Bewijs (1): definitie a-reeks 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 (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 ak mod 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 (1)
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 aan g(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 = 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 rij f(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 dan f(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 jn en 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 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?