fork download
  1. {-# LANGUAGE PatternGuards #-}
  2.  
  3. import Data.List
  4. import Data.Function
  5.  
  6. tsieve (x:xs) = x : tsieve [y | y <- xs, rem y x /= 0]
  7.  
  8. psieve (p:ps) xs | (h,t) <- span (< p*p) xs =
  9. h ++ psieve ps [y | y <- t, rem y p /= 0]
  10.  
  11. main = do { n <- fmap read getLine ;
  12. print .
  13. last . take n . -- nubBy (((==0).).rem) $ [2..]
  14. -- tsieve $ [2..]
  15. -- fix $ (2:) . (`psieve` [3..])
  16. (`psieve` [2..]) . fix $ (2:) . (`psieve` [3..])
  17. }
Success #stdin #stdout 1.78s 8872KB
stdin
100000

nubBy (((==0).).rem) [2..] --  2k 0.79s  5.8 MB  --   4k 3.51s  5.8 MB  --  n^2.15
T-sieve:                   --  4k 0.62s  6.8 MB  --   8k 2.98s  6.8 MB  --  n^2.25
postponed T-sieve          -- 40k 0.57s 10.9 MB  -- 100k 1.88s 12.9 MB  --  n^1.30
staged postp'd T-sv        -- 40k 0.46s  8.8 MB  -- 400k 10.52  8.9 MB  --  n^1.36
                                                 
stdout
1299709