bernoulli_numbers_recursive_2.pl 773 B

12345678910111213141516171819202122232425262728293031323334353637
  1. #!/usr/bin/perl
  2. # Author: Daniel "Trizen" Șuteu
  3. # License: GPLv3
  4. # Date: 04 October 2016
  5. # Website: https://github.com/trizen
  6. # Recursive computation of Bernoulli numbers (slightly improved).
  7. # https://en.wikipedia.org/wiki/Bernoulli_number#Recursive_definition
  8. use 5.014;
  9. use strict;
  10. use warnings;
  11. use Memoize qw(memoize);
  12. use Math::AnyNum qw(:overload binomial);
  13. memoize('bernoulli');
  14. sub bernoulli {
  15. my ($n) = @_;
  16. return 1/2 if $n == '1';
  17. return 0 if $n % '2';
  18. return 1 if $n == '0';
  19. my $bern = 1/2 - 1 / ($n + 1);
  20. for (my $k = '2' ; $k < $n ; $k += '2') {
  21. $bern -= bernoulli($k) * binomial($n, $k) / ($n - $k + '1');
  22. }
  23. $bern;
  24. }
  25. foreach my $i (0 .. 50) {
  26. printf "B%-3d = %s\n", '2' * $i, bernoulli('2' * $i);
  27. }