fork(5) download
  1. import Control.Monad (forM_, when)
  2. import Control.Monad.ST
  3. import Data.Array.ST
  4. import Data.Array.Unboxed
  5.  
  6. sieve :: Int -> UArray Int Bool
  7. sieve n = runSTUArray $ do
  8. let m = (n-1) `div` 2
  9. bits <- newArray (0, m-1) True
  10. forM_ [0 .. r `div` 2 - 1] $ \i -> do
  11. isPrime <- readArray bits i
  12. when isPrime $ do
  13. forM_ [2*i*i+6*i+3, 2*i*i+8*i+6 .. (m-1)] $ \j -> do
  14. writeArray bits j False
  15. return bits
  16.  
  17. primes :: Int -> [Int]
  18. primes n = 2 : [2*i+3 | (i, True) <- assocs $ sieve n]
  19.  
  20. main = do
  21. print $ primes 100
  22. print $ sum $ primes 2000000
Success #stdin #stdout 0.07s 4616KB
stdin
Standard input is empty
stdout
[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97]
1179908154