fork download
  1. {-# OPTIONS_GHC -O2 #-}
  2. module Main where
  3.  
  4. main = interact (\s-> show $ primes() !! (read s - 1))
  5.  
  6. primes :: () -> [Int]
  7. primes () = 2: primes' -- LINEAR-folding multiples-union
  8. where -- ERATOSthenes sieve
  9. primes' = 3: sieve primes' 3 []
  10. sieve (p:ps) x fs =
  11. let
  12. q=p*p
  13. in
  14. ([x+2,x+4..q-2] `minus`
  15. foldl union [] [[y+s,y+2*s..q] | (s,y) <- fs])
  16. ++ sieve ps q
  17. ((2*p,q):[(s,q-rem (q-y) s) | (s,y) <- fs])
  18.  
  19. union a@(x:xs) b@(y:ys) = case compare x y of
  20. LT -> x : union xs b
  21. EQ -> x : union xs ys
  22. GT -> y : union a ys
  23. union a [] = a
  24. union [] b = b
  25.  
  26. minus a@(x:xs) b@(y:ys) = case compare x y of
  27. LT -> x : minus xs b
  28. EQ -> minus xs ys
  29. GT -> minus a ys
  30. minus a b = a
  31.  
  32. {-
  33. FOLDL FOLDR
  34. 50,000: 611,953 0.15s 5.8MB 0.44s 5.8MB
  35. 100,000: 1,299,709 0.41s 7.8MB 1.28s 8.8MB
  36. 200,000: 2,750,159 1.09s 14.0MB 3.83s 14.0MB
  37. 300,000: 4,256,233 1.93s 19.1MB 7.08s 19.1MB
  38. 400,000: 5,800,079 2.95s 25.2MB 11.08s 24.2MB
  39. 500,000: 7,368,787 3.94s 28.2MB > 15 sec >30.4MB
  40. 1,000,000: 15,485,863 10.93s 58.0MB > 15 sec >30.4MB
  41.  
  42. O(n^1.45) O(n^0.9)
  43. -}
stdin
1000000
compilation info
[1 of 1] Compiling Main             ( prog.hs, prog.o )
Linking prog ...
stdout
15485863