Problem 25: What is the first term in the Fibonacci sequence to contain 1000 digits?
Commentary: Well, I certainly hope you paid attention to all the boring crap in the solution to Problem 2, because you’re going to need it to understand my solution for Problem 25.
First, I’ll describe my first attempted solution, which was a “computery” approach. My original plan was to use the closed form (discussed in the link above) to the Fibonacci Numbers, passing off all the “heavy lifting” to GNU bc. This “works”, but is UNBELIEVABLY slow (I think I let it run for about 15 minutes before I decided to try to math my way out of things). This problem is a good reminder (though we’ll definitely see others) of the inarguable fact that mathematicians are still kings of earth–or at least that the Project Euler people like to occasionally throw a bone to math-types instead of letting the computer science nerds have all the fun.
Ok, so, remember that weird “continued fraction” expansion of that I gave in the solution to Problem 2? If you stare at it for a few seconds, then it should be obvious that
and hence
While we’re here, it’s worth pointing out that if you define in terms of that continued fraction expansion, then you can deduce from that definition the numeric value of , since from the first equation above, if we multiply both sides by , then rearrange things and get
Using the good old quadratic formula gives two solutions (or in other words, two possibilities for ), namely . One of these two possibilities is positive and the other negative. From there it isn’t hard to see which is which.
Ok, so back to Project Euler. With the above observation regarding , we can rewrite the closed form expression of the Fibonacci Numbers (using the Project Euler convention that ) as
Then for sufficiently large (and thinking about the problem at hand for 3 seconds should convince you that the we’re after should do the trick), we have
**
since of course will be quite small. It follows that we need only find the smallest natural number satisfying
And since is an increasing function, this is equivalent to needing to find the smallest n satisfying
The problem is now trivial. Note that from the above observation regarding and from basic properties of logarithms:
Whence, we wish to find the smallest natural number satisfying
It follows that .
Who says a masters in math is useless?
R Code:
ElapsedTime <- system.time({
##########################
phi<-(1+sqrt(5))/2
answer<-ceiling((999+1/2*log(5, 10))/log(phi, 10))
##########################
})[3]
ElapsedMins <- floor(ElapsedTime/60)
ElapsedSecs <- (ElapsedTime-ElapsedMins*60)
cat(sprintf("\nThe answer is: %d\nTotal elapsed time: %d minutes and %f seconds\n", answer, ElapsedMins, ElapsedSecs))
** Output: The answer is: 4782 Total elapsed time: 0 minutes and 0.000000 seconds **