Sunteți pe pagina 1din 5

O condiie necesar i suficient ca un numr s fie numr Fibonacci Autor: prof.

Staicu Ovidiu Ninel Colegiul Economic Petre S. Aurelian Slatina, jud. Olt

1. Introducere Propuse de Leonardo Pisa n 1202, numerele lui Fibonacci reprezint un ir de numere construit dup o anumit relaie de recuren ntre termeni. Numerele lui Fibonacci sunt introduse prin problema iepurilor de cas: plecnd de la o singur pereche de iepuri (un mascul i o femel) i tiind c fiecare pereche de iepuri produce n fiecare lun o nou pereche de iepuri, care devine "productiv" la vrsta de o lun, calculai cte perechi de iepuri vor fi dup n luni. Pisa arat c ntr-o situaie perfect (fr s moar iepuri), fiecare pereche de iepuri produce o alt pereche n fiecare lun. Acest tip de cretere conduce la o serie de numere cunoscute ca numere Fibonacci. Definiia 1. Se numesc numere Fibonacci numerele care fac parte din irul de numere ncepnd cu 0, 1, 1, 2, 3, ... unde fiecare numr succesiv este suma numerelor precedente. Mai precis , irul poate fi definit prin relaia de recuren:

n continuare vom prezenta unele dintre problemele de calcul ale numerelor Fibonacci. 2. Calculul numerelor Fibonacci Folosind relaia de recuren dat n Definiia 1 pentru numerele lui Fibonacci vom implementa natural un algoritm recursiv pentru a calcula cel de-al n-lea numr Fibonacci. De exemplu, urmtorul algoritm implementat n C++, returneaz cel de-al n-lea numr Fibonacci:
static int Fibonacci (int n) { if(n < 0) throw new ArgumentException("Input parameter invalid"); int N; if (n == 0) N = 0; else if (n == 1 || n == 2) N = 1; else N = Fibonacci(n - 1) + Fibonacci(n - 2); return N; }

1 www.ls-infomat.ro | www.manuale-de-informatica.ro

Pentru a calcula

, algoritmul va calcula

, construind arborele urmtor:

Timpul de executare crete exponenial cu ct ncercm s calculm un numr Fiboncci mai mare. Din acest motiv este bine s ne bazm pe o formul exact de calcul a numerelor Fibonacci cum este Formula Binnet sau varianta de calcul iterativ. Formula Binnet:

static double Fibonacci(int n)


{

double double double return


}

gr = ((double)1 + Sqrt(5)) / 2; grN = Pow(gr, n); gr_1 = Pow(((double)1 - gr), n); (grN-gr_1)/ Sqrt(5);

Varianta de calcul iterativ:


static int Fibonacci (int n) { int index1 = 1, index2 = 1; if (n == 0) return 0; if (n == 1 || n == 2) return 1; int current; for (int i = 2; i <= n; i++) { current = index1+index2; index1=index2; index2= current; } return current; }

3. Condiia necesar i suficient ca un numr s fie Fibonacci Dac putem calcula valoarea exact a unui numr Fibonacci eficient, urmtoarea ntrebare care apare n mod natural este dac se d un numr natural , cum putem determina eficient dac este sau nu numr Fibonacci. n mod normal ar trebui s calculm numerele Fibbonacci pn cnd ajungem sau depim valoarea lui . Aceast abordare este ineficient i dureaz din ce n ce mai mult pentru o valoare din ce n ce mai mare. n continuare vom prezenta o condiie de testare elegant cu ajutorul creia vom stabili dac un numr este sau nu Fibonacci.
2 www.ls-infomat.ro | www.infobits.ro

Vom arta c orice ntreg pozitiv este numr Fibonacci dac i numai dac este ptrat perfect. Pentru a demonstra aceast teorem mai nti introducem dou leme, care apoi vor fi folosite pentru a demonstra teorema final. Aceast teorem a fost dat de Gessel n 1972. Lema1. Ecuaia: , este satisfcut de perechea ,

Demonstraie. Vom demonstra Lema 1 prin inducie. Verificm afirmaia pentru cazul Pentru avem perechea Fibonacci Verificm afirmaia pentru cazul Pentru avem perechea Fibonacci . nlocuind n ecuaie obinem: . nlocuind n ecuaie obinem: i demonstrm c este adevrat

Presupunem afirmaia adevrat pentru perechea pentru perechea , ceea ce este echivalent cu: Presupunem

adevrat i vom demonstra: (1) Pentru c sunt numere Fibonacci , nlocuind n (1) obinem:

Lema 2. Dac (x, y) este o pereche de numere pozitive ntregi care satisface ecuaia

atunci

, pentru un anume n, n0.

Demonstraie prin inducie dup (x+y). n primul rnd, dac Dac atunci n al doilea rnd dac atunci substituind pe cu obinem: i sunt numere pozitive atunci ele pot fi , sau .

Observm c exist perechea

pentru care ecuaia este satisfcut.


3 www.ls-infomat.ro | www.infobits.ro

n final presupunem c Avem perechea de numere ntregi pozitive care satisfac ecuaia

, aa cum se vede mai jos:

Prin urmare, prin inducie, i

pentru un anume , i de aici ceea ce nseamn c

Teorema 1. Un ntreg pozitiv este un numr Fibonacci dac i numai dac

este ptrat perfect. Soluia ecuaiei ptratice sau echivalent Presupunnd c y este pozitiv putem simplifica forma la Presupunnd c este numrul Fibonacci pentru un anume n, conform Lemei 1 trebuie s fie numrul Fibonacci . Pentru ca s fie numr Fibonacci (i implicit ntreg), trebuie s fie ntreg. Astfel c trebuie s fie ptrat perfect. Invers, presupunnd c pozitiv ntreg, trebuie s fie de asemenea un numr pozitiv ntreg. Conform regulilor de baz ale adunrii i nmulirii avem: Dac este impar, atunci este impar. Adunnd sau scznd 4 obinem tot un numr impar. De aceea este impar i ptrat perfect. Dac extragem radical dintr-un numr ptrat perfect i impar obinem un numr impar. Deci n final avem: este ptrat perfect i tiind c este un numr este

Cum este numr impar adunnd nc o valoare impar obinem un numr par care care atunci cnd se mparte la 2 d ca rezultat un numr ntreg.

4 www.ls-infomat.ro | www.infobits.ro

Dac este par, atunci este par. Adunnd sau scznd 4 obinem tot un numr par. De aceea este par i ptrat perfect. Dac extragem radical dintr-un numr ptrat perfect i par obinem un numr par. Deci n final avem:

Cum x este numr par adunnd nc o valoare par, obinem un numr par care atunci cnd se mparte la 2 d ca rezultat un numr ntreg. tiind c este un ntreg pozitiv, conform lemei 2, ambele valori numere Fibonacci. i trebuie s fie

Iat sursa programului n C++ care verific dac un numr este Fibonacci conform teoremei demonstrate mai sus:
#include <iostream> #include <cmath> using namespace std; bool EsteFib(double x) { double x1=5* pow(x,2.0)+4; double x2=5* pow(x,2)-4; long radical_x1=(long )sqrt(x1); long radical_x2=(long )sqrt(x2); return (radical_x1*radical_x1==x1)||(radical_x2*radical_x2==x2)? true:false; } int main() { int n; cout<<"Introduceti numarul:"; cin>>n; EsteFib(n)==1 ? cout<<n<<" este numar Fibonacci": cout<<n<<" nu este numar Fibonacci"; return 0; }

Bibliografie 1. Phillip James, Department of Computer Science, Swansea University When is a number Fibonacci ?, 2009: http://www.cs.swan.ac.uk 2. http://www.maths.surrey.ac.uk/

5 www.ls-infomat.ro | www.infobits.ro

S-ar putea să vă placă și