bernoulli_numbers_rec.t 969 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #!perl -T
  2. use utf8;
  3. use 5.006;
  4. use strict;
  5. use warnings;
  6. use Test::More;
  7. plan tests => 10;
  8. use Sidef;
  9. my $code = <<'EOT';
  10. func bernoulli_number{}; # must be declared before used
  11. func binomial(n, k) is cached {
  12. (k == 0) || (n == k) ? 1 : (binomial(n - 1, k - 1) + binomial(n - 1, k));
  13. }
  14. func bern_helper(n, k) {
  15. binomial(n, k) * (bernoulli_number(k) / (n - k + 1));
  16. }
  17. func bern_diff(n, k, d) {
  18. n < k ? d : bern_diff(n, k + 1, d - bern_helper(n + 1, k));
  19. }
  20. bernoulli_number = func(n) is cached {
  21. n.is_one && return 1/2;
  22. n.is_odd && return 0;
  23. n > 0 ? bern_diff(n - 1, 0, 1) : 1;
  24. }
  25. EOT
  26. my $sidef = Sidef->new(name => 'bernoulli_numbers');
  27. my $bern = $sidef->execute_code($code);
  28. my @bnums = qw(
  29. 1/1
  30. 1/6
  31. -1/30
  32. 1/42
  33. -1/30
  34. 5/66
  35. -691/2730
  36. 7/6
  37. -3617/510
  38. 43867/798
  39. );
  40. foreach my $i (0 .. 9) {
  41. my ($num, $den) = $bern->call(Sidef::Types::Number::Number->new(2 * $i))->nude;
  42. is("$num/$den", "$bnums[$i]");
  43. }