Skip to content

Instantly share code, notes, and snippets.

@dungpa
Created June 5, 2012 14:22
Show Gist options
  • Save dungpa/2875314 to your computer and use it in GitHub Desktop.
Save dungpa/2875314 to your computer and use it in GitHub Desktop.
A sequence of prime under n: parallel version
let pfilterRange predicate (i, j) =
let results = ResizeArray(j-i+1)
let monitor = new Object()
Parallel.For(
i, j, new ParallelOptions(),
(fun () -> ResizeArray(j-i+1)),
(fun k _ (localList: ResizeArray<_>) ->
if predicate k then localList.Add(k)
localList),
(fun local -> lock (monitor) (fun () -> results.AddRange(local)))
) |> ignore
results.ToArray()
let rec primesUnderParallel = function
| n when n<=2 -> [||]
| 3 -> [|2|]
| n when n<=100 -> primesUnder n
| n -> let ns = n |> float |> sqrt |> ceil |> int
let smallers = primesUnderParallel ns
Array.append smallers (pfilterRange (indivisible smallers) (ns, n-1))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment