60 Days of Euler in F# - Problem 25

The Problem

Find the index of the first number in the Fibonacci sequence to contain 1000 digits.

The Solution

Once again, it's BigInteger to the rescue. It is very easy to generate the Fibonacci sequence.

let fibSeq =
    let rec fibSeq n1 n2 = 
        seq { let n0 = n1 + n2 
              yield n0
              yield! fibSeq n0 n1 }
    seq { yield 1I ; yield 1I ; yield! (fibSeq 1I 1I) }

We know the first two elements of the sequence are both 1, so we just yield those directly. For elements after that, we call the recursive fibSeq function, which uses yield to return the sum of the previous two terms, then uses yield! to return the next element in the sequence. This function generates numbers forever, but F#'s sequence magic will only generate the numbers that it needs.

With this in hand, finding the answer is easy.

let aThousandDigits = pown 10I 999

#time
fibSeq
|> Seq.findIndex (fun f -> f >= aThousandDigits)
#time
Other Posts in This Series