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