Project Euler 7

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


素数判定は2から順に割っていきます。

let count start = Seq.initInfinite (fun n -> n + start)
let is_prime n = Seq.forall (fun p -> n % p <> 0)
                  (Seq.takeWhile (fun p -> p * p <= n) (count 2))

takeWhileが使いたいのでListでなくSequenceにします。takeWhileで切られるまでの整数で全て割り切れたらpは素数です。全てというのがforallです。第2引数のSequenceから出てくる要素に第1引数の関数を作用させてどれかがfalseになればそこで打ち切ってfalseを返すはずです。

let count start = Seq.initInfinite (fun n -> n + start)

let is_prime n = Seq.forall (fun p -> n % p <> 0)
                  (Seq.takeWhile (fun p -> p * p <= n) (count 2))
let primes = Seq.filter is_prime (count 2)

let N = 10001
printfn "%d" (snd (Seq.head (Seq.filter (fun x -> fst(x) = N)
                                    (Seq.zip (count 1) primes))))