#!perl -T
use
5.006;
plan
tests
=> 10;
my
$code
=
<<'EOT';
func bernoulli_number{}; # must be declared before used
func binomial(n, k) is cached {
(k == 0) || (n == k) ? 1 : (binomial(n - 1, k - 1) + binomial(n - 1, k));
}
func bern_helper(n, k) {
binomial(n, k) * (bernoulli_number(k) / (n - k + 1));
}
func bern_diff(n, k, d) {
n < k ? d : bern_diff(n, k + 1, d - bern_helper(n + 1, k));
}
bernoulli_number = func(n) is cached {
n.is_one && return 1/2;
n.is_odd && return 0;
n > 0 ? bern_diff(n - 1, 0, 1) : 1;
}
EOT
my
$sidef
= Sidef->new(
name
=>
'bernoulli_numbers'
);
my
$bern
=
$sidef
->execute_code(
$code
);
my
@bnums
=
qw(
1/1
1/6
-1/30
1/42
-1/30
5/66
-691/2730
7/6
-3617/510
43867/798
)
;
foreach
my
$i
(0 .. 9) {
my
(
$num
,
$den
) =
$bern
->call(Sidef::Types::Number::Number->new(2 *
$i
))->nude;
is(
"$num/$den"
,
"$bnums[$i]"
);
}