bernoulli_numbers_ramanujan_congruences.sf 505 B

123456789101112131415161718192021
  1. #!/usr/bin/ruby
  2. # Formula due to Ramanujan for computing the nth-Bernoulli number.
  3. # See also:
  4. # https://en.wikipedia.org/wiki/Bernoulli_number#Ramanujan's_congruences
  5. func ramanujan_bernoulli_number(n) is cached {
  6. return 1/2 if n.is_one
  7. return 0 if n.is_odd
  8. ((n%6 == 4 ? -1/2 : 1) * (n+3)/3 - sum(1 .. (n - n%6)/6, {|k|
  9. binomial(n+3, n - 6*k) * __FUNC__(n - 6*k)
  10. })) / binomial(n+3, n)
  11. }
  12. for n in (0..100) {
  13. say "B(#{n}) = #{ramanujan_bernoulli_number(n).as_rat}"
  14. }