func ramanujan_bernoulli_number(n) is cached { return 1/2 if n.is_one return 0 if n.is_odd ((n%6 == 4 ? -1/2 : 1) * (n+3)/3 - sum(1 .. (n - n%6)/6, {|k| binomial(n+3, n - 6*k) * __FUNC__(n - 6*k) })) / binomial(n+3, n) }