Project Euler 50

http://projecteuler.net/index.php?section=problems&id=50


どうしても素数列の遅延評価ができない。

open Arithmetic

let N = pown 10 6
let primes = Primes.make_primes N

let rec calc_max_list a s =
   let h = List.head a
   let t = List.tail a
   if s < h then []
   else h :: (calc_max_list t (s - h))

let max_prime_sum a =
   let rec max_prime_sum' a s =
      if s <= 1 then []
      else if Primes.is_prime s then a
      else max_prime_sum' (List.tail a) (s - List.head a)
   max_prime_sum' a (List.sum a)

let max_and_prime a =
   let b = List.rev (calc_max_list a N)
   let c = max_prime_sum b
   (List.length b, c)

let solve () =
   let rec solve' a b =
      let m, c = max_and_prime a
      if m < List.length b then b
      else solve' (List.tail a)
            (if List.length c > List.length b then c else b)
   
   List.sum (solve' primes [])

printfn "%d" (solve())