http://projecteuler.net/index.php?section=problems&id=46
これも前問と同じアルゴリズムを、奇数ごとに適用します。この問題は有限リストなので素直に書けます。
let mutable primes = [ 2 ]
let is_prime n = Seq.forall (fun p -> n % p <> 0)
(Seq.takeWhile (fun p -> p * p <= n) primes)
let extend_primes ps max_n =
let last = List.nth ps ((List.length ps) - 1)
ps @ (List.filter is_prime [last+1..max_n])
let rec coincident ps qs : bool =
let p = if ps = [] then 0 else List.head ps
let q = if qs = [] then 0 else List.head qs
if p = 0 || q = 0 then false
else if p = q then true
else if p < q then coincident (List.tail ps) qs
else coincident ps (List.tail qs)
let s = seq {
for n in Seq.initInfinite (fun n -> n * 2 + 9) do
primes <- extend_primes primes n
let sq = Seq.toList ((Seq.takeWhile ((<=) 0)
(Seq.initInfinite
(fun k -> n - 2 * k * k))))
if not (coincident primes (List.rev sq)) then
yield n
}
printfn "%d" (Seq.head s)