8double compute_unit_ball_volume(
unsigned n)
10 static std::vector<double> cache;
18 while (n > cache.size())
19 cache.push_back(*(cache.end()-2) * TWO_PI/cache.size());
23double compute_ball_volume(
unsigned n,
double R)
25 return compute_unit_ball_volume(n)*pow(R,(
double)n);
28double compute_unit_sphere_area(
unsigned n)
32 return TWO_PI*compute_unit_ball_volume(n-1);
35double compute_sphere_area(
unsigned n,
double R)
37 return compute_unit_sphere_area(n)*pow(R,(
double)(n-1));
43double gamma_ln(
const double xx)
47 static const double cof[14]={57.1562356658629235,-59.5979603554754912,
48 14.1360979747417471,-0.491913816097620199,.339946499848118887e-4,
49 .465236289270485756e-4,-.983744753048795646e-4,.158088703224912494e-3,
50 -.210264441724104883e-3,.217439618115212643e-3,-.164318106536763890e-3,
51 .844182239838527433e-4,-.261908384015814087e-4,.368991826595316234e-5};
54 tmp = x+5.24218750000000000;
55 tmp = (x+0.5)*log(tmp)-tmp;
56 ser = 0.999999999999997092;
57 for (j=0;j<14;j++) ser += cof[j]/++y;
58 return tmp+log(2.5066282746310005*ser/x);
64double fac(
const int n)
67 assert(n >=0 && n <171);
70 for(
int i = 1; i <= n;i++)
77double fac_ln(
const int n)
79 assert(n >=0 && n <171);
82 for(
int i = 1; i <=n;i++)
89double beta(
const double z,
const double w)
91 return std::exp(gamma_ln(z)+gamma_ln(w)-gamma_ln(z+w));
96double nchoosek(
const int n,
const int k)
98 assert (n>=0 && k>=0 && k<=n);
100 return ::floor(0.5+fac(n)/(fac(k)*fac(n-k)));
101 return ::floor(0.5+exp(fac_ln(n)-fac_ln(k)-fac_ln(n-k)));