Fibonaccigetallen

Download Report

Transcript Fibonaccigetallen

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
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)
– 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)
n 1
 f (i)  f (n  1)  1
i 0
n 1
n 1
i 0
i 0
 f (i)   ( f (i  2)  f (i  1))  f (n  1)  f (1)  f (n  1) 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
1 5
q
2
of
1 5
q
2
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 rij
f(n) = A jn + B j’ n aan de eigenschap f(n)=f(n1)+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
1   1  5   1  5  

 

f (n) 






2
2
5 
 
 

n
Deze waarden zijn voor elke integer n
een geheel getal!
n
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
n

1   1  5  


f (n) 

5   2  


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 AVLboom
• 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?