[OT] fastest fibbonacci

Matthias Bentrup via Digitalmars-d digitalmars-d at puremagic.com
Mon Oct 24 01:20:26 PDT 2016


On Sunday, 23 October 2016 at 23:17:28 UTC, Stefam Koch wrote:
> On Sunday, 23 October 2016 at 19:59:16 UTC, Minas Mina wrote:
>> On Sunday, 23 October 2016 at 13:04:30 UTC, Stefam Koch wrote:
>>> Hi Guys,
>>>
>>> while brushing up on my C and algorithm skills, accidently 
>>> created a version of fibbonaci which I deem to be faster then 
>>> the other ones floating around.
>>>
>>> It's also more concise
>>>
>>> the code is :
>>>
>>> int computeFib(int n)
>>> {
>>>     int t = 1;
>>>     int result = 0;
>>>
>>>     while(n--)
>>>     {
>>>         result = t - result;
>>>         t = t + result;
>>>     }
>>>
>>>    return result;
>>> }
>>
>> You can even calculate Fibonacci in O(1).
>
> An approximation of it.

The fibonacci sequence can be represented exactly as a linear 
combination of two exponential functions, but the two bases of 
the exponentials and the linear multipliers of them are 
irrational numbers, which cannot be represented exactly on a 
computer.

However the rounding error is so small, that rounding to int will 
give you always the correct answer as long as you stay within the 
precision limit of the floating point type you use, e.g. a real 
should give you 64-bit fibonacci in O(1), if the exponential 
function is O(1).

PS: the exact formula is fib(n) = 1/sqrt(5) * (0.5 + 
0.5sqrt(5))^n - 1/sqrt(5) * (0.5 - 0.5sqrt(5))^n. If you round to 
integer anyway, the second term can be ignored as it is always <= 
0.5.



More information about the Digitalmars-d mailing list