import Data.Array.Unboxed import Control.Applicative ((<*>)) -- cf JBwoVL import Data.List (tails, inits) -- stackoverflow.com/a/42150321/849891 ps = 2 : [n | (r:q:_, px) <- (zip . tails . (2:) . map (^2) <*> inits) ps, (n,True) <- assocs ( accumArray (\_ _ -> False) True (r+1,q-1) [(m,()) | p <- px, let s=(r+p)`div`p*p, m <- [s,s+p..q-1]] :: UArray Int Bool )] main = do (print $ ps !! 10000000)