Sum of primes below two-million.

Easy problem, but way too slow (taking several minutes) with the naïve prime number generator from problem 7. This new version is 10x faster, based on this paper:http://www.cs.hmc.edu/~oneill/papers/Sieve-JFP.pdf (still not implementing the 'wheel' though; probably another 3x improvement)

let primes =

let rec sieve i c = seq {

match Map.tryFind i c with

| None -> yield i

yield! sieve (i + 1L) (Map.add (i * i) [i] c)

| Some(f) -> yield! sieve (i + 1L) (List.fold (fun c p –>

Map.add (i + p) (match Map.tryFind (i + p) c with

None -> [p] | Some(f) -> p :: f) c)

(Map.remove i c) f) }

sieve 2L Map.empty

primes |> Seq.takeWhile ((>=) 2000000L) |> Seq.sum