use strict;
use warnings;
use SOOT ':all';
sub _binomialSimple {
#
# Simple test for the binomial distribution
#
printf("\nTMath:::Binomial simple test\n");
printf("Build the Tartaglia triangle\n");
printf("============================\n");
use constant max => 13;
foreach my $i (0..max-1) {
printf "n=%2d", $i;
print " " x (max-$i);
for my $j (0..$i) {
my $bin = TMath::Nint( TMath::Binomial($i,$j));
printf("%4d", $bin);
}
print "\n";
}
}
sub _binomialFancy {
my $serr = 0;
use constant nmax => 10000;
print <<'VERBATIM';
TMath:::Binomial fancy test
Verify Newton formula for (x+y)^n
x,y in [-2,2] and n from 0 to 9
=================================
VERBATIM
my $val = 0.;
my ($x, $y);
for (0..nmax-1) {
do {
$x = 2 * (1 - 2*rand());
$y = 2 * (1 - 2*rand());
$val = abs($x+$y)*1.;
} while ($val < 0.75); # Avoid large cancellations
foreach my $j (0..9) {
my $res1 = ($x+$y) ** $j;
my $res2 = 0;
foreach my $k (0..$j) {
$res2 += $x**$k
* $y**($j-$k)
* TMath::Binomial($j,$k);
}
my $err = abs($res1-$res2)/abs($res1);
print "res1=$res1 res2=$res2 x=$x y=$y err=$err j=$j\n" if $err > 1e-10;
$serr += $err;
}
}
print "Average Error = ". $serr/nmax . "\n";
}
_binomialSimple;
_binomialFancy;