// Learn more about F# at http://fsharp.net open System open System.Collections.Generic let IsPrime n = if n = 1 then false else let max = n |> float |> sqrt |> int let rec Test = function | x when x > max -> true | x -> if (n % x) = 0 then false else Test (x+1) Test 2 let NthLeftTruncatablePrime index = let rec Find digit factor primes primes' count acc = match digit, primes' with | 10, _ -> let primes = List.rev acc Find 1 (10*factor) primes primes count [] | _, [] -> Find (digit+1) factor primes primes count acc | _, prime::tail -> let k = (digit * factor) + prime let count, acc = if IsPrime k then count+1, k::acc else count, acc if count = index then k else Find digit factor primes tail count acc let primes = [2;3;5;7] if index <= 4 then List.nth primes (index-1) else Find 1 10 primes primes 4 [] open System.Diagnostics do NthLeftTruncatablePrime 100 |> ignore let timer = Stopwatch.StartNew() let mutable prime = 1 for i = 1 to 1000 do prime <- NthLeftTruncatablePrime 1000 done timer.Stop() Debug.WriteLine(prime) Debug.WriteLine(timer.ElapsedMilliseconds)