import Data.List factor :: Integer -> [Integer] factor 1 = [] factor n = let prime = head $ dropWhile ((/= 0) . mod n) [2 .. n] in (prime :) $ factor $ div n prime count :: Eq a => [a] -> [(a, Int)] count xs = map (\l -> (head l, length l)) $ group xs p :: Integer -> Double p nInt = 1/n * product fractions where fractions = map fraction factors fraction :: (Double, Int) -> Double fraction (pi, ri) = (pi + fromIntegral ri * (pi - 1)) / pi factors = map (\(p, r) -> (fromIntegral p, fromIntegral r)) $ count (factor nInt) n = fromIntegral nInt main :: IO () main = print $ map p [1..10]