Very nice problem. I didnt realize you could deal with the precision problem.

+

Therefore I used this identity to speed up the fibonacci calculation:

+

f_(2*n+k)

+

= f_k*(f_(n+1))^2

+

+ 2*f_(k-1)*f_(n+1)*f_n

+

+ f_(k-2)*(f_n)^2

+

<haskell>

<haskell>

−

problem_104 = undefined

+

import Data.List

+

import Data.Char

+

+

fibos = rec 0 1

+

where

+

rec a b = a:rec b (a+b)

+

+

fibo_2nk n k =

+

let

+

fkm1 = fibo (k-1)

+

fkm2 = fibo (k-2)

+

fk = fkm1 + fkm2

+

fnp1 = fibo (n+1)

+

fnp1sq = fnp1^2

+

fn = fibo n

+

fnsq = fn^2

+

in

+

fk*fnp1sq + 2*fkm1*fnp1*fn + fkm2*fnsq

+

+

fibo x =

+

let

+

threshold = 30000

+

n = div x 3

+

k = n+mod x 3

+

in

+

if x < threshold

+

then fibos !! x

+

else fibo_2nk n k

+

+

findCandidates = rec 0 1 0

+

where

+

m = 10^9

+

rec a b n =

+

let

+

continue = rec b (mod (a+b) m) (n+1)

+

isBackPan a = (sort $ show a) == "123456789"

+

in

+

if isBackPan a

+

then n:continue

+

else continue

+

search =

+

let

+

isFrontPan x = (sort $ take 9 $ show x) == "123456789"

+

in

+

map fst

+

$ take 1

+

$ dropWhile (not.snd)

+

$ zip findCandidates

+

$ map (isFrontPan.fibo) findCandidates

+

+

problem_104 = search

+

</haskell>

+

It took 8 sec on a 2.2Ghz machine.

+

+

The lesson I learned fom this challenge, is: know mathematical identities and exploit them. They allow you take short cuts.

+

Normally you compute all previous fibonacci numbers to compute a random fibonacci number. Which has linear costs. The aforementioned identity builds the number not from its two predecessors but from 4 much smaller ones. This makes the algorithm logarithmic in its complexity. It really shines if you want to compute a random very large fibonacci number. f.i. the 10mio.th fibonacci number which is over 2mio characters long, took 20sec to compute on my 2.2ghz laptop.

+

+

I have a slightly simpler solution, which I think is worth posting. It runs in about 6 seconds. HenryLaxen June 2, 2008

Finding Fibonacci numbers for which the first and last nine digits are pandigital.

Solution:

Very nice problem. I didnt realize you could deal with the precision problem.
Therefore I used this identity to speed up the fibonacci calculation:
f_(2*n+k)
= f_k*(f_(n+1))^2
+ 2*f_(k-1)*f_(n+1)*f_n
+ f_(k-2)*(f_n)^2

The lesson I learned fom this challenge, is: know mathematical identities and exploit them. They allow you take short cuts.
Normally you compute all previous fibonacci numbers to compute a random fibonacci number. Which has linear costs. The aforementioned identity builds the number not from its two predecessors but from 4 much smaller ones. This makes the algorithm logarithmic in its complexity. It really shines if you want to compute a random very large fibonacci number. f.i. the 10mio.th fibonacci number which is over 2mio characters long, took 20sec to compute on my 2.2ghz laptop.

I have a slightly simpler solution, which I think is worth posting. It runs in about 6 seconds. HenryLaxen June 2, 2008