The difficult part of this problem was working around F#'s lack of break, continue, and return in for loops. hasForm would be most easily expressed using nested for loops but would require break, continue, and return to perform acceptably. Another desire is support for infinite range expressions, so that oddComposites could be written as {9..2..} |> Seq.filter (isPrime>>not).
let problem46b = let form p s = p + 2*(s*s) //making sure to exclude 1 let oddComposites = Seq.initInfinite id |> Seq.filter (fun i -> i <> 1 && i%2=1 && isPrime i |> not) //cached for performance let primes = Seq.initInfinite id |> Seq.filter isPrime |> Seq.cache //exclusive let primesUpto n = primes |> Seq.takeWhile ((>=) n) //think nested loops let hasForm n = primesUpto n |> Seq.exists (fun p -> ({1..n-1} |> Seq.map (fun s -> form p s) |> Seq.find (fun r -> (r = n) || (r > n))) = n) oddComposites |> Seq.find (hasForm>>not)
No comments:
Post a Comment