32 lines
980 B
Haskell
32 lines
980 B
Haskell
import Control.Arrow ((&&&))
|
|
import Data.List (scanl1, foldl1')
|
|
|
|
getNthPrimorial :: Int -> Integer
|
|
getNthPrimorial n = foldl1' (*) (take n primes)
|
|
|
|
primes :: [Integer]
|
|
primes = 2 : filter isPrime [3,5..]
|
|
|
|
isPrime :: Integer -> Bool
|
|
isPrime = isPrime_ primes
|
|
where isPrime_ :: [Integer] -> Integer -> Bool
|
|
isPrime_ (p:ps) n
|
|
| p * p > n = True
|
|
| n `mod` p == 0 = False
|
|
| otherwise = isPrime_ ps n
|
|
|
|
primorials :: [Integer]
|
|
primorials = 1 : scanl1 (*) primes
|
|
|
|
main :: IO ()
|
|
main = do
|
|
-- Print the first 10 primorial numbers
|
|
let firstTen = take 10 primorials
|
|
putStrLn $ "The first 10 primorial numbers are: " ++ show firstTen
|
|
|
|
-- Show the length of the primorials with index 10^[1..6]
|
|
let powersOfTen = [1..6]
|
|
primorialTens = map (id &&& (length . show . getNthPrimorial . (10^))) powersOfTen
|
|
calculate = mapM_ (\(a,b) -> putStrLn $ "Primorial(10^"++show a++") has "++show b++" digits")
|
|
calculate primorialTens
|