[Haskell-cafe] Question about memory usage
Richard O'Keefe
ok at cs.otago.ac.nz
Mon Aug 16 21:53:11 EDT 2010
On Aug 17, 2010, at 12:37 AM, Roel van Dijk wrote:
>
> 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). Please
> correct me if I'm wrong (or sloppy).
Using the classic
x**0 = 1
x**1 = x
x**(2k+0) = (x**2)**k k > 0
x**(2k+1) = (x**2)**k + x k > 1
powers of smallish numbers or matrices can be computed in logarithmic
time.
Using x**n = exp(n*log(x)) and floating point arithmetic,
the whole thing can be done in O(1) time, and the price of
some inaccuracy. Using double precision arithmetic, I get
fib(52) = 32951280099.0001
which is clearly wrong. Truncation will save you, up to
fib(72) = 498454011879265.1875
which is wrong in the units place.
More information about the Haskell-Cafe
mailing list