fork(2) download
  1. {-# OPTIONS_GHC -O2 #-}
  2. module Main where
  3. import Array
  4. main = interact (\s-> show $ primes () !! (read s - 1))
  5.  
  6. primes :: () -> [Int]
  7. primes () = 2: primes' -- marking off composites on Array segments
  8. where -- between consecutive primes squares, on odds
  9. primes' = 3: sieve primes' 3 []
  10. sieve (p:ps) x fs =
  11. let
  12. q = (p*p-x)`div`2
  13. a = accumArray (\b c-> False) True
  14. (1,q-1)
  15. [(i,()) | (s,y) <- fs, i <- [y+s,y+s+s..q]]
  16. in
  17. [i*2 + x | (i,e) <- assocs a, e]
  18. ++ sieve ps (p*p)
  19. ((p,0):[(s,rem (y-q) s) | (s,y) <- fs])
  20.  
  21. {-
  22. segmented generation: O(n^) delta O(n^)
  23. 1,000: 7,919 0.00s 3.7MB
  24. 30,000: 350,377 0.09s 4.7MB 1.0
  25. 100,000: 1,299,709 0.51s 1.44 5.8MB 2.1 0.6
  26. 300,000: 4,256,233 2.49s 1.44 12.9MB 9.2 1.3 0.9
  27. 600,000: 8,960,453 6.77s 1.44 21.1MB 17.4 0.9 1.2 1.0
  28. 1,000,000: 15,485,863 14.09s 1.43 38.5MB 34.8 1.4 0.9 1.2 1.0
  29.  
  30. ARR/odds: O(n^) delta O(n^)
  31. 1,000: 0.00s 3.7MB
  32. 30,000: 0.02s 4.8MB 1.1
  33. 100,000: 0.06s 7.8MB 4.1 1.1
  34. 300,000: 0.27s 17.1MB 13.4 1.1
  35. 600,000: 0.61s 1.18 30.3MB 26.6 1.0
  36. 1 mln: 15,485,863 1.18s 1.29 52.9MB 49.2 1.2
  37. 2 mln: 32,452,843 2.84s 1.27 87.7MB 84.0 0.8
  38. 3 mln: 49,979,687 5.01s 1.40 137.9MB 134.2 1.2 0.9
  39. 4 mln: 67,867,967 8.44s 1.81 203.4MB 199.7 1.4 1.2
  40. 5 mln: 86,028,121 11.90s 1.54 240.3MB 236.6 0.8 1.1 1.1
  41. -}
stdin
1000000
compilation info
[1 of 1] Compiling Main             ( prog.hs, prog.o )
Linking prog ...
stdout
15485863