[Haskell-cafe] Question about memory usage
Daniel Fischer
daniel.is.fischer at web.de
Mon Aug 16 09:13:41 EDT 2010
On Monday 16 August 2010 14:37:34, Roel van Dijk wrote:
> On Sat, Aug 14, 2010 at 5:41 PM, Andrew Coppin
>
> <andrewcoppin at btinternet.com> wrote:
> > (Then again, the Fibonacci numbers can be computed
> > in O(1) time, and nobody ever needs Fibonacci numbers in the first
> > place, so this is obviously example code.)
>
> A bit off-topic, but I don't think there exists a function that
> computes fibonacci numbers in O(1) time. There exists a closed-form
> expression to calculate the nth Fibonacci number, but the complexity
> of that expression is not O(1):
>
> phi = (1 + sqrt 5) / 2
> fib n = ((phi ** n) - (1 - phi) ** n) / sqrt 5
>
> The use of (**) should make the complexity at least O(n).
Using Double for phi and n, that expression is calculated in constant
time. If you use (^) or (^^) instead of (**) and use Int [or Integer and
neglect the compexity of Integer arithmetic, assuming additions and
divisions of Integers to be O(1)] for n, it's O(log n).
However, whether using (**), (^) or (^^), with Double for phi, that formula
gives wrong results even for rather small n (> 70 resp. > 75).
You can calculate the n-th Fibonacci number in O(log n) steps using Integer
arithmetic to get correct results.
Multiplying two Integers with k bits takes O(k^(1+ x)) with 0 < x <= 1, the
exact value of x depends on the used algorithm of course. I don't remember
what's the best found so far, but x < 0.5 is reached.
Since the abovementioned O(log n) steps algorithm includes multiplication
of Integers with Theta(n) bits, its complexity is O(n^(1 + y)) for some y
>= x.
> Please correct me if I'm wrong (or sloppy).
>
> Regards,
> Roel
More information about the Haskell-Cafe
mailing list