import Data.List import Data.Ratio -- slightly altered seidel triangle seidel :: Integer -> [Integer] seidel 0 = [1] seidel 1 = [1] seidel n | odd n = scanr (+) (last helper) helper | otherwise = scanl (+) (head helper) helper where helper = seidel (n - 1) --seidel n = reverse ((head (helper)) : (helper)) -- where helper = scanr1 (+) (seidel (n - 1)) t :: Integer -> Integer t 0 = 1 t 1 = 1 t n | odd n = last (seidel (n)) | otherwise = head (seidel (n)) bernoulli :: Integer -> Rational bernoulli 0 = 1 bernoulli 1 = (-1) % 2 bernoulli n | odd n = 0 bernoulli n | otherwise = (-1) ^ (div n 2) * n * (t (n-1)) % (2^n - 4^n)