-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy patheuler-007.fs
21 lines (19 loc) · 837 Bytes
/
euler-007.fs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#light
let primes N =
let sieve = [| for i in 2u .. N -> true |]
let numberToIndex n = n-2u
let setFlag n value = sieve.[int(numberToIndex n)] <- value
let getFlag n = sieve.[int(numberToIndex n)]
let checkComposites prime = for n in {2u*prime .. prime .. N} do false |> setFlag n
let rec tryfind_nextprime n =
if n > N then None elif getFlag n then Some n else tryfind_nextprime (n+1u)
let rec filterSieve i =
match i with
| Some(i) when i*i > N -> ()
| Some(i) -> checkComposites i;
i+1u |> tryfind_nextprime |> filterSieve
| None -> ()
filterSieve (Some 2u);
{ 2u .. N } |> Seq.filter (fun n -> getFlag n)
let Nth = 10001
printfn "%dst prime is %d " Nth (primes 1000000u |> Seq.nth (Nth-1))