module LennartPrimes (primesUpTo) where infixr :> data StreamInt = !Int :> StreamInt (!>) :: StreamInt -> Int -> Int (x :> _) !> 0 = x (_ :> xs) !> n = xs !> (n-1) -- By replacing lprimes on the next line by '5 :> gen 7 4 2' this algorithm -- runs in very little space, but is somewhat slower. primes = 2 :> 3 :> lprimes where isPrime (p:>ps) n = n `rem` p /= 0 && (p*p > n || isPrime ps n) lprimes = 5 :> gen 7 4 2 gen n a b = if isPrime lprimes n then n :> gen (n+a) b a else gen (n+a) b a primesUpTo n = [ fromIntegral (primes !> (i-1)) | i <- [1..fromIntegral n] ]