bernoulli_numbers_seidel.sf 692 B

123456789101112131415161718192021222324252627282930313233
  1. #!/usr/bin/ruby
  2. # Seidel's algorithm for computing Bernoulli numbers.
  3. # Algorithm from:
  4. # https://oeis.org/wiki/User:Peter_Luschny/ComputationAndAsymptoticsOfBernoulliNumbers#Seidel
  5. func bernoulli_seidel(n) {
  6. n == 0 && return 1
  7. n == 1 && return 1/2
  8. n.is_odd && return 0
  9. var D = [0, 1, (n/2 - 1).of(0)...]
  10. var (h=1, w=1)
  11. n.times {
  12. if (w ^= 1) {
  13. (h-1).times { |k| D[k+1] += D[k] }
  14. }
  15. else {
  16. w = h++
  17. while (--w) { D[w] += D[w+1] }
  18. }
  19. }
  20. D[h-1] / ((1 << (n+1)) - 2) * (4.divides(n) ? -1 : 1)
  21. }
  22. for i in (0 .. 10) {
  23. printf("B(%2d) = %20s / %s\n", 2*i, bernoulli_seidel(2*i).nude)
  24. }