Geant4  10.02.p03
MyGamma Class Reference

#include <Gamma.hh>

Collaboration diagram for MyGamma:

Public Member Functions

 MyGamma ()
 
 ~MyGamma ()
 
double Gamma (double z)
 
double Gamma (double a, double x)
 

Private Member Functions

double GamCf (double a, double x)
 
double GamSer (double a, double x)
 

Static Private Member Functions

static short Abs (short d)
 
static int Abs (int d)
 
static long Abs (long d)
 
static float Abs (float d)
 
static double Abs (double d)
 
static double LnGamma (double z)
 
static double Log (double x)
 
static double Exp (double x)
 

Detailed Description

Definition at line 46 of file Gamma.hh.

Constructor & Destructor Documentation

◆ MyGamma()

MyGamma::MyGamma ( )

Definition at line 37 of file Gamma.cc.

37 {}

◆ ~MyGamma()

MyGamma::~MyGamma ( )

Definition at line 39 of file Gamma.cc.

39 {}

Member Function Documentation

◆ Abs() [1/5]

static short MyGamma::Abs ( short  d)
inlinestaticprivate

Definition at line 62 of file Gamma.hh.

62 { return (d > 0) ? d : -d; }
Float_t d
Here is the caller graph for this function:

◆ Abs() [2/5]

static int MyGamma::Abs ( int  d)
inlinestaticprivate

Definition at line 63 of file Gamma.hh.

63 { return (d > 0) ? d : -d; }
Float_t d

◆ Abs() [3/5]

static long MyGamma::Abs ( long  d)
inlinestaticprivate

Definition at line 64 of file Gamma.hh.

64 { return (d > 0) ? d : -d; }
Float_t d

◆ Abs() [4/5]

static float MyGamma::Abs ( float  d)
inlinestaticprivate

Definition at line 65 of file Gamma.hh.

65 { return (d > 0) ? d : -d; }
Float_t d

◆ Abs() [5/5]

static double MyGamma::Abs ( double  d)
inlinestaticprivate

Definition at line 66 of file Gamma.hh.

66 { return (d > 0) ? d : -d; }
Float_t d
Here is the call graph for this function:

◆ Exp()

static double MyGamma::Exp ( double  x)
inlinestaticprivate

Definition at line 69 of file Gamma.hh.

69 { return std::exp(x); }
Here is the caller graph for this function:

◆ GamCf()

double MyGamma::GamCf ( double  a,
double  x 
)
private

Definition at line 76 of file Gamma.cc.

77 {
78  // Computation of the incomplete gamma function P(a,x)
79  // via its continued fraction representation.
80  //
81  // The algorithm is based on the formulas and code as denoted in
82  // Numerical Recipes 2nd ed. on p. 210-212 (W.H.Press et al.).
83  //
84  //--- Nve 14-nov-1998 UU-SAP Utrecht
85 
86  int itmax = 100; // Maximum number of iterations
87  double eps = 3.e-7; // Relative accuracy
88  double fpmin = 1.e-30; // Smallest double value allowed here
89 
90  if (a <= 0 || x <= 0) return 0;
91 
92  double gln = LnGamma(a);
93  double b = x+1-a;
94  double c = 1/fpmin;
95  double d = 1/b;
96  double h = d;
97  double an,del;
98  for (int i=1; i<=itmax; i++) {
99  an = double(-i)*(double(i)-a);
100  b += 2;
101  d = an*d+b;
102  if (Abs(d) < fpmin) d = fpmin;
103  c = b+an/c;
104  if (Abs(c) < fpmin) c = fpmin;
105  d = 1/d;
106  del = d*c;
107  h = h*del;
108  if (Abs(del-1) < eps) break;
109  //if (i==itmax) cout << "*GamCf(a,x)* a too large or itmax too small" << endl;
110  }
111  double v = Exp(-x+a*Log(x)-gln)*h;
112  return (1-v);
113 }
Float_t d
static const G4double eps
static short Abs(short d)
Definition: Gamma.hh:62
static double Exp(double x)
Definition: Gamma.hh:69
static double Log(double x)
Definition: Gamma.hh:68
static double LnGamma(double z)
Definition: Gamma.cc:147
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Gamma() [1/2]

double MyGamma::Gamma ( double  z)

Definition at line 42 of file Gamma.cc.

43 {
44  // Computation of gamma(z) for all z>0.
45  //
46  // The algorithm is based on the article by C.Lanczos [1] as denoted in
47  // Numerical Recipes 2nd ed. on p. 207 (W.H.Press et al.).
48  //
49  // [1] C.Lanczos, SIAM Journal of Numerical Analysis B1 (1964), 86.
50  //
51  //--- Nve 14-nov-1998 UU-SAP Utrecht
52 
53  if (z<=0) return 0;
54 
55  double v = LnGamma(z);
56  return std::exp(v);
57 }
static double LnGamma(double z)
Definition: Gamma.cc:147
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Gamma() [2/2]

double MyGamma::Gamma ( double  a,
double  x 
)

Definition at line 60 of file Gamma.cc.

61 {
62  // Computation of the incomplete gamma function P(a,x)
63  //
64  // The algorithm is based on the formulas and code as denoted in
65  // Numerical Recipes 2nd ed. on p. 210-212 (W.H.Press et al.).
66  //
67  //--- Nve 14-nov-1998 UU-SAP Utrecht
68 
69  if (a <= 0 || x <= 0) return 0;
70 
71  if (x < (a+1)) return GamSer(a,x);
72  else return GamCf(a,x);
73 }
double GamCf(double a, double x)
Definition: Gamma.cc:76
double GamSer(double a, double x)
Definition: Gamma.cc:116
Here is the call graph for this function:

◆ GamSer()

double MyGamma::GamSer ( double  a,
double  x 
)
private

Definition at line 116 of file Gamma.cc.

117 {
118  // Computation of the incomplete gamma function P(a,x)
119  // via its series representation.
120  //
121  // The algorithm is based on the formulas and code as denoted in
122  // Numerical Recipes 2nd ed. on p. 210-212 (W.H.Press et al.).
123  //
124  //--- Nve 14-nov-1998 UU-SAP Utrecht
125 
126  int itmax = 100; // Maximum number of iterations
127  double eps = 3.e-7; // Relative accuracy
128 
129  if (a <= 0 || x <= 0) return 0;
130 
131  double gln = LnGamma(a);
132  double ap = a;
133  double sum = 1/a;
134  double del = sum;
135  for (int n=1; n<=itmax; n++) {
136  ap += 1;
137  del = del*x/ap;
138  sum += del;
139  if (MyGamma::Abs(del) < Abs(sum*eps)) break;
140  //if (n==itmax) cout << "*GamSer(a,x)* a too large or itmax too small" << endl;
141  }
142  double v = sum*Exp(-x+a*Log(x)-gln);
143  return v;
144 }
static const G4double eps
static short Abs(short d)
Definition: Gamma.hh:62
Char_t n[5]
static double Exp(double x)
Definition: Gamma.hh:69
static double Log(double x)
Definition: Gamma.hh:68
static double LnGamma(double z)
Definition: Gamma.cc:147
Here is the call graph for this function:
Here is the caller graph for this function:

◆ LnGamma()

double MyGamma::LnGamma ( double  z)
staticprivate

Definition at line 147 of file Gamma.cc.

148 {
149  // Computation of ln[gamma(z)] for all z>0.
150  //
151  // The algorithm is based on the article by C.Lanczos [1] as denoted in
152  // Numerical Recipes 2nd ed. on p. 207 (W.H.Press et al.).
153  //
154  // [1] C.Lanczos, SIAM Journal of Numerical Analysis B1 (1964), 86.
155  //
156  // The accuracy of the result is better than 2e-10.
157  //
158  //--- Nve 14-nov-1998 UU-SAP Utrecht
159 
160  if (z<=0) return 0;
161 
162  // Coefficients for the series expansion
163  double c[7] = { 2.5066282746310005, 76.18009172947146, -86.50532032941677
164  ,24.01409824083091, -1.231739572450155, 0.1208650973866179e-2
165  ,-0.5395239384953e-5};
166 
167  double x = z;
168  double y = x;
169  double tmp = x+5.5;
170  tmp = (x+0.5)*Log(tmp)-tmp;
171  double ser = 1.000000000190015;
172  for (int i=1; i<7; i++) {
173  y += 1;
174  ser += c[i]/y;
175  }
176  double v = tmp+Log(c[0]*ser/x);
177  return v;
178 }
Float_t tmp
Double_t y
static double Log(double x)
Definition: Gamma.hh:68
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Log()

static double MyGamma::Log ( double  x)
inlinestaticprivate

Definition at line 68 of file Gamma.hh.

68 { return std::log(x); }
Here is the caller graph for this function:

The documentation for this class was generated from the following files: