fork download
  1. primesW :: [Int]
  2. primesW = [2,3,5,7] ++ _Y ( (11:) . gapsW 13 (tail wheel) . _U .
  3. map (\p->
  4. map (p*) . dropWhile (< p) $
  5. scanl (+) (p - rem (p-11) 210) wheel) )
  6. where
  7. wheel = cycle [b-a | let xs = [i | i <- [11..11+210], gcd i 210 == 1]
  8. , (b,a) <- zip (tail xs) xs]
  9.  
  10. gapsW k (d:w) s@(c:cs) | k < c = k : gapsW (k+d) w s -- set difference
  11. | otherwise = gapsW (k+d) w cs -- k==c
  12.  
  13. _Y g = g (_Y g) -- = g . g . g . g . ...... -- recursive fixpoint
  14.  
  15. _U ((x:xs):t) = x : (union xs . _U . pairs) t -- ~= nub . sort . concat
  16. where
  17. pairs (xs:ys:t) = union xs ys : pairs t
  18. union a@(x:xs) b@(y:ys) = case compare x y of
  19. LT -> x : union xs b
  20. EQ -> x : union xs ys
  21. GT -> y : union a ys
  22.  
  23. main = print . take 5 . drop (1000000-4) $ primesW
Success #stdin #stdout 1.98s 5720KB
stdin
Standard input is empty
stdout
[15485843,15485849,15485857,15485863,15485867]