fork(1) download
  1. import Data.List
  2.  
  3. factor :: Integer -> [Integer]
  4. factor 1 = []
  5. factor n = let prime = head $ dropWhile ((/= 0) . mod n) [2 .. n]
  6. in (prime :) $ factor $ div n prime
  7.  
  8. count :: Eq a => [a] -> [(a, Int)]
  9. count xs = map (\l -> (head l, length l)) $ group xs
  10.  
  11. p :: Integer -> Double
  12. p nInt = 1/n * product fractions
  13. where
  14. fractions = map fraction factors
  15. fraction :: (Double, Int) -> Double
  16. fraction (pi, ri) = (pi + fromIntegral ri * (pi - 1)) / pi
  17. factors = map (\(p, r) -> (fromIntegral p, fromIntegral r)) $
  18. count (factor nInt)
  19. n = fromIntegral nInt
  20.  
  21. main :: IO ()
  22. main = print $ map p [1..10]
Success #stdin #stdout 0s 6268KB
stdin
Standard input is empty
stdout
[1.0,0.75,0.5555555555555556,0.5,0.36,0.4166666666666667,0.2653061224489796,0.3125,0.2592592592592593,0.27]