29 sept 2012

Fibonacci, to infinity and beyond

Que poco sueño que tengo. Estoy tan aburrido que me he dedicado a comprobar el número entero más alto que se puede alcanzar con 64 bits según la sucesión de nuestro hamijo Leonardo Pisano Bigollo, más conocido como Leonardo Fibonacci.

La sucesión se define matemáticamente así:



Por lo que los primeros elementos serán...



Ajá! Bonito todo, ¿no? Veamos una manera de comprobar el número más alto de la sucesión con 64 bits.

var
   current,old:Int64;
   fibonacci:array [1..2] of Int64;
   c:Byte;
begin
   fibonacci[1]:=0; // F0
   fibonacci[2]:=1; // F1
   old:=0;
   current:=1; // Controladores de overflow
   c:=1; // Switch de posición en array

   while (current>old) do begin
     WriteLn(Current);

     old:=fibonacci[c];
     fibonacci[c]:=fibonacci[1]+fibonacci[2];
     current:=fibonacci[c];

     if c=1 then c:=2 else c:=1;
   end;

  ReadLn;
end.

Y ese es un ejemplo de algoritmo para comprobar el número más alto de fibonacci, el resto dependerá de la aritmética, en este caso con una precisión entera de 64 bits (realmente ni siquiera es una precisión de 64 bits, pues uno es de signo (aunque usáramos un unsigned integer 64 no llegaríamos a más)). Se basa en el uso del desbordamiento aritmético (overflow) es decir, una vez llegado al número más alto, por ejemplo el 0111(base 2), si incrementamos tenemos 1111(base2), es decir, pasamos a un número negativo (pues el último es de signo), por lo que hemos llegado al límite. No soy precisamente un genio explicando, lo siento :D

Y aquí los resultados obtenidos :3



Salu2.

No hay comentarios:

Publicar un comentario