pascal_bernoulli_numbers.t 875 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. #!perl -T
  2. use 5.006;
  3. use strict;
  4. use warnings;
  5. use Test::More;
  6. BEGIN {
  7. eval { require Math::AnyNum };
  8. plan skip_all => "Math::AnyNum is not installed"
  9. if $@;
  10. plan skip_all => "Math::AnyNum >= 0.38 is needed"
  11. if ($Math::AnyNum::VERSION < 0.38);
  12. }
  13. plan tests => 7;
  14. use Math::MatrixLUP;
  15. use Math::AnyNum qw(:overload binomial factorial);
  16. sub pascal_bernoulli_number {
  17. my ($n) = @_;
  18. my $A = Math::MatrixLUP->build(
  19. $n,
  20. sub {
  21. my ($i, $k) = @_;
  22. $k > $i + 1 ? 0 : binomial($i + 2, $k);
  23. }
  24. );
  25. $A->det / factorial($n + 1);
  26. }
  27. is(pascal_bernoulli_number(0), 1);
  28. is(pascal_bernoulli_number(1), 1 / 2);
  29. is(pascal_bernoulli_number(2), 1 / 6);
  30. is(pascal_bernoulli_number(3), 0);
  31. is(pascal_bernoulli_number(4), -1 / 30);
  32. is(pascal_bernoulli_number(5), 0);
  33. is(pascal_bernoulli_number(6), 1 / 42);