fork(1) download
  1. main = do
  2. let n = read s
  3. ps = eulerPrimesTo (n+1)
  4. print (length ps, last ps)
  5.  
  6. fromSpan (xs,i) = xs ++ fromSpan (map (+ i) xs,i)
  7.  
  8. eulerS () = iterate eulerStep ([2],1)
  9. eulerStep (xs@(p:_), i) =
  10. ( (tail . concat . take p . iterate (map (+ i))) xs
  11. `minus` map (p*) xs, p*i )
  12.  
  13. eulerPrimesTo :: Int -> [Int]
  14. eulerPrimesTo m = if m > 1 then go ([2],1) else []
  15. where
  16. go w@((p:_), _)
  17. | m < p*p = takeWhile (<= m) (fromSpan w)
  18. | True = p : go (eulerStep w)
  19.  
  20. minus a@(x:xs) b@(y:ys) = case compare x y of
  21. LT -> x : minus xs b
  22. EQ -> minus xs ys
  23. GT -> minus a ys
  24. minus a b = a
stdin
725000
compilation info
[1 of 1] Compiling Main             ( prog.hs, prog.o )
Linking prog ...
stdout
(58418,724993)