bernoulli_and_euler_numbers.t 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #!perl -T
  2. use 5.006;
  3. use strict;
  4. use warnings;
  5. use Test::More;
  6. plan tests => 41;
  7. use Math::AnyNum qw(:overload sum binomial bernoulli bernreal lnbern euler faulhaber_sum irand secant_number tangent_number);
  8. # Bernoulli numbers
  9. {
  10. my %results = qw(
  11. 0 1
  12. 1 1/2
  13. 2 1/6
  14. 3 0
  15. 4 -1/30
  16. 5 0
  17. 6 1/42
  18. 10 5/66
  19. 12 -691/2730
  20. 20 -174611/330
  21. 22 854513/138
  22. );
  23. #
  24. ## bernfrac()
  25. #
  26. foreach my $i (keys %results) {
  27. is(Math::AnyNum->new($i)->bernfrac->stringify, $results{$i});
  28. }
  29. is((-2)->bernfrac, NaN); # make sure we check for even correctly
  30. is(bernoulli('-2'), NaN); # make sure we check for even correctly
  31. #<<<
  32. is(bernoulli('41'), '0');
  33. is(bernoulli('52'), '-801165718135489957347924991853/1590');
  34. is(bernoulli('106'), '36373903172617414408151820151593427169231298640581690038930816378281879873386202346572901/642');
  35. #>>>
  36. #
  37. ## bernreal()
  38. #
  39. is(bernreal(-2), NaN); # check for negative values
  40. is(bernreal(1), 0.5);
  41. is(bernreal(0), 1);
  42. is(bernreal(3), 0);
  43. is(bernreal(2)->round(-10), '0.1666666667');
  44. is(bernreal(14)->round(-25), '1.1666666666666666666666667');
  45. is(bernreal(52)->round(-10), '-503877810148106891413789303.0522012579');
  46. #
  47. ## lnbern()
  48. #
  49. is(lnbern(-2), NaN);
  50. is(lnbern(5), -Inf);
  51. is(lnbern(6), log(bernreal(6)));
  52. is(lnbern(42), log(bernreal(42)));
  53. is(lnbern(100), log(bernreal(100)));
  54. }
  55. {
  56. my $n = irand(2, 100);
  57. my $x = irand(2, 100);
  58. is(sum(map { my $k = $_; binomial($n, $k) * euler($k) / 2**$k * ($x - 1 / 2)**($n - $k) } 0 .. $n), euler($n, $x));
  59. is(sum(map { my $k = $_; binomial($n, $k) * (-1)**($n - $k) * bernoulli($n - $k) * $x**$k } 0 .. $n), bernoulli($n, $x));
  60. is(2**$n * (2**($n + 1) / ($n + 1)) * (bernoulli($n + 1, 3 / 4) - bernoulli($n + 1, 1 / 4)), euler($n));
  61. is((bernoulli($x + 1, $n + 1) - bernoulli($x + 1)) / ($x + 1), faulhaber_sum($n, $x));
  62. is(euler($n, $x) + (1 / 2 * sum(map { my $k = $_; binomial($n, $k) * euler($k, $x) } 0 .. $n - 1)), $x**$n);
  63. is(sum(map { my $k = $_; binomial($n + 1, $k) * bernoulli($k, $x) } 0 .. $n) / ($n + 1), $x**$n);
  64. is(2**($n + 1) / ($n + 1) * (bernoulli($n + 1, ($x + 1) / 2) - bernoulli($n + 1, $x / 2)), euler($n, $x));
  65. is(2**$n * euler($n, 1 / 2), euler($n));
  66. }
  67. is(euler(-2), NaN);
  68. #<<<
  69. is(join(', ', map { my $n = $_; euler($n) } 0 .. 10), "1, 0, -1, 0, 5, 0, -61, 0, 1385, 0, -50521");
  70. is(join(', ', map { my $n = $_; 2 * $n * euler(2 * $n - 1, 0) } 1 .. 10), "-1, 1, -3, 17, -155, 2073, -38227, 929569, -28820619, 1109652905");
  71. #>>>
  72. is(join(', ', map { secant_number($_) } 0 .. 9), '1, 1, 5, 61, 1385, 50521, 2702765, 199360981, 19391512145, 2404879675441');
  73. is(join(', ', map { tangent_number($_) } 0 .. 9), '0, 1, 2, 16, 272, 7936, 353792, 22368256, 1903757312, 209865342976');