00001 
00010 #include "mt.h"
00011 
00012 
00013 
00014 double   EPS = 1.0e-6;
00015 
00016 
00017 
00024 double  power(double x, double y)
00025 {
00026     if (y==0.0)      return 1.0;
00027     else if (x==0.0) return 0.0;
00028     else return exp((y)*log(x));
00029 }
00030 
00031 
00032 
00039 double  fact(int n)
00040 {
00041     int    i;
00042     double ret = 1.0;
00043 
00044     if (n>0) for (i=1; i<=n; i++)  ret = ret*(double)i;
00045     return ret;
00046 }
00047     
00048 
00049 
00056 double  perm(int n, int m)
00057 {
00058     int    i;
00059     double p;
00060 
00061     if (m>n || n<=0 || m<=0) return 0.;
00062 
00063     p = 1.0;
00064     for (i=n-m+1; i<=n; i++) p = p*(double)i;
00065 
00066     return p;
00067 }
00068 
00069 
00070 
00077 double  comb(int n, int m)
00078 {
00079     int    i;
00080     double c, p;
00081 
00082     if (m>n || n<=0 || m<=0) return 0.;
00083 
00084     p = c = 1.0;
00085     for (i=n-m+1; i<=n; i++) p = p*(double)i;
00086     for (i=1;     i<=m; i++) c = c*(double)i;
00087 
00088     return p/c;
00089 }
00090 
00091 
00092 
00093 #define  MAX_ITRTN_NEWTON_METHOD  30    
00094 
00095 
00109 int    newton_method(PTR_DFFUNC func, PTR_DFFUNC dfunc, double* t0, double eps)
00110 {
00111     double tt  = *t0;
00112     double ff  = (*func)(tt);
00113 
00114     int n = 1;
00115     while (n<MAX_ITRTN_NEWTON_METHOD && Xabs(ff)>eps) {
00116         
00117         double df = (*dfunc)(tt);
00118         if (Xabs(df)<eps) return 0;
00119 
00120         tt = tt - ff/df;
00121         ff = (*func)(tt);
00122         n++;
00123     }
00124 
00125     if (n==MAX_ITRTN_NEWTON_METHOD) return 0;
00126     *t0 = tt;
00127     return n;
00128 }
00129