bernoulli_numbers_from_factorials.pl 953 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #!/usr/bin/perl
  2. # Author: Daniel "Trizen" Șuteu
  3. # Date: 02 December 2017
  4. # https://github.com/trizen
  5. # A new algorithm for computing Bernoulli numbers.
  6. # Inspired from Norman J. Wildberger video lecture:
  7. # https://www.youtube.com/watch?v=qmMs6tf8qZ8
  8. # See also:
  9. # https://en.wikipedia.org/wiki/Bernoulli_number#Connection_with_Pascal’s_triangle
  10. use 5.010;
  11. use strict;
  12. use warnings;
  13. use Math::AnyNum qw(:overload factorial bernfrac);
  14. sub bernoulli_numbers {
  15. my ($n) = @_;
  16. my @B = (1);
  17. foreach my $i (1 .. $n) {
  18. foreach my $k (0 .. $i - 1) {
  19. $B[$i] //= 0;
  20. $B[$i] -= $B[$k] / factorial($i - $k + 1);
  21. }
  22. }
  23. map { $B[$_] * factorial($_) } 0 .. $#B;
  24. }
  25. my @B = bernoulli_numbers(100); # first 100 Bernoulli numbers
  26. foreach my $i (0 .. $#B) {
  27. # Verify the results
  28. if ($i > 1 and $B[$i] != bernfrac($i)) {
  29. die "error for i=$i";
  30. }
  31. say "B($i) = $B[$i]";
  32. }