http://projecteuler.net/index.php?section=problems&id=39
配列を使うと簡単。
open Seq
// p = 2lm(m + n)
let N = 1000
let count_peri = Array.create (N + 1) 0
for m in takeWhile (fun m -> 2 * m * (m + 1) <= N) (seq { 2..N }) do
// n' = m + n
for n' in takeWhile (fun n' -> 2 * m * n' <= N)
(filter (fun n' -> n' % 2 = 1) (seq { m+1..m*2-1 })) do
let p = 2 * m * n'
for q in p..p..N do
count_peri.[q] <- count_peri.[q] + 1
let larger x y = if snd x >= snd y then x else y
printfn "%d" (fst (fold larger (0, 0)
(seq { for k in 1..N -> (k, count_peri.[k]) })))