ROOT logo

From $ROOTSYS/tutorials/math/binomial.C

// tutorial illustrating the use of TMath::Binomial
//  can be run with:
// root > .x binomial.C
// root > .x binomial.C+ with ACLIC
//Author: Federico Carminati
   
#include <TMath.h>
#include <TRandom.h>

void binomialSimple() {
  //
  // Simple test for the binomial distribution
  //
  printf("\nTMath::Binomial simple test\n");
  printf("Build the Tartaglia triangle\n");
  printf("============================\n");
  const Int_t max=13;
  Int_t j;
  for(Int_t i=0;i<max;i++) {
    printf("n=%2d",i);
    for(j=0;j<(max-i);j++) printf("  ");
    for(j=0;j<i+1;j++) printf("%4d",TMath::Nint(TMath::Binomial(i,j)));
    printf("\n");
  }
}

void binomialFancy() {
  Double_t x;
  Double_t y;
  Double_t res1;
  Double_t res2;
  Double_t err;
  Double_t serr=0;
  const Int_t nmax=10000;
  printf("\nTMath::Binomial fancy test\n");
  printf("Verify Newton formula for (x+y)^n\n");
  printf("x,y in [-2,2] and n from 0 to 9  \n");
  printf("=================================\n");
  TRandom r;
  for(Int_t i=0; i<nmax; i++) {
    do {
        x=2*(1-2*r.Rndm());
        y=2*(1-2*r.Rndm());
    } while (TMath::Abs(x+y)<0.75); //Avoid large cancellations
    for(Int_t j=0; j<10; j++) {
       res1=TMath::Power(x+y,j);
       res2=0;
       for(Int_t k=0; k<=j; k++)
          res2+=TMath::Power(x,k)*TMath::Power(y,j-k)*TMath::Binomial(j,k);
       if((err=TMath::Abs(res1-res2)/TMath::Abs(res1))>1e-10)
 	      printf("res1=%e res2=%e x=%e y=%e err=%e j=%d\n",res1,res2,x,y,err,j);
       serr +=err;
     }
  }
  printf("Average Error = %e\n",serr/nmax);
}

void binomial () {
   binomialSimple();
   binomialFancy();
}

 binomial.C:1
 binomial.C:2
 binomial.C:3
 binomial.C:4
 binomial.C:5
 binomial.C:6
 binomial.C:7
 binomial.C:8
 binomial.C:9
 binomial.C:10
 binomial.C:11
 binomial.C:12
 binomial.C:13
 binomial.C:14
 binomial.C:15
 binomial.C:16
 binomial.C:17
 binomial.C:18
 binomial.C:19
 binomial.C:20
 binomial.C:21
 binomial.C:22
 binomial.C:23
 binomial.C:24
 binomial.C:25
 binomial.C:26
 binomial.C:27
 binomial.C:28
 binomial.C:29
 binomial.C:30
 binomial.C:31
 binomial.C:32
 binomial.C:33
 binomial.C:34
 binomial.C:35
 binomial.C:36
 binomial.C:37
 binomial.C:38
 binomial.C:39
 binomial.C:40
 binomial.C:41
 binomial.C:42
 binomial.C:43
 binomial.C:44
 binomial.C:45
 binomial.C:46
 binomial.C:47
 binomial.C:48
 binomial.C:49
 binomial.C:50
 binomial.C:51
 binomial.C:52
 binomial.C:53
 binomial.C:54
 binomial.C:55
 binomial.C:56
 binomial.C:57
 binomial.C:58
 binomial.C:59
 binomial.C:60
 binomial.C:61
 binomial.C:62
 binomial.C:63