module Main where{ import Data.List; primes::[](Integer); primes = (2:eratosthenes_sieve); eratosthenes_sieve::[](Integer); eratosthenes_sieve = (filter by_eratosthenes (enumFrom 3)); by_eratosthenes::Integer->Bool; by_eratosthenes x = (and (map (indivisible x) (takeWhile (lt_sqrt x) primes))); lt_sqrt::Integer->Integer->Bool; lt_sqrt x p = ((<=) ((*) p p) x); indivisible::Integer->Integer->Bool; indivisible big small = ((/=) 0 (mod big small)); powers_of :: Integer -> [Integer]; powers_of x = x:(map (x*)(powers_of x)); largest_power_less_than :: Integer -> Integer -> Integer; largest_power_less_than maxx x = let { l :: Integer -> Integer; l accum = case (x*accum <= maxx) of { True -> l (x*accum); _ -> accum } } in l 1; primesmax :: Integer -> [Integer]; primesmax maxx = let { p1 :: [Integer]; p1 = takeWhile (\x -> x<=maxx) primes; } in map (largest_power_less_than maxx) p1; growing :: [[Integer]]; growing = map head $ group $ (map primesmax (enumFrom 2)); pr1 :: [Integer] -> IO (); pr1 x = do { putStr (show ((sum(map ((log::(Double->Double)) . fromInteger) x))/(log 2.0))); putStr " "; print ( x); }; logp :: Integer -> Double; logp x = log (fromInteger x); main:: IO (); main=mapM_ pr1 growing; }