import Data.List import Data.Char import Data.Ratio import Data.Array hiding (index) bernoulli :: Integer -> Rational bernoulli n = b (fromIntegral n) where b 0 = 1%1 b 1 = -1%2 b m | mod 2 m == 1 = 0 | otherwise = sum [(choosef m k) * (bernoullis!k) / (fromIntegral (k-m-1)) | k <- [0..m-1]] bernoullis = listArray (0, fromIntegral n) [b (fromIntegral k) | k <- [0..n]] choosef m k = (facts!m) % ((facts!k)*(facts!(m-k))) facts = listArray (0, n) [f (fromIntegral k) | k <- [0..n]] f 0 = 1 f m = m * (facts!(m-1))