00001 
00002 
00003 #include "cddefines.h"
00004 #include "thirdparty.h"
00005 #include "physconst.h"
00006 
00007 inline double polevl(double x, const double coef[], int N);
00008 inline double p1evl(double x, const double coef[], int N);
00009 inline double chbevl(double, const double[], int);
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00042 
00043 
00044 
00045 bool linfit(
00046         long n,
00047         double x[], 
00048         double y[], 
00049         double &a,
00050         double &siga,
00051         double &b,
00052         double &sigb
00053 )
00054 {
00055 
00056 
00057 
00058 
00059 
00060 
00061 
00062 
00063 
00064 
00065 
00066 
00067 
00068 
00069 
00070 
00071 
00072 
00073 
00074 
00075 
00076 
00077 
00078 
00079 
00080 
00081 
00082 
00083 
00084 
00085 
00086 
00087 
00088 
00089 
00090 
00091 
00092         DEBUG_ENTRY( "linfit()" );
00093 
00094         
00095         a = 0.0;
00096         siga = 0.0;
00097         b = 0.0;
00098         sigb = 0.0;
00099 
00100         
00101         double s1 = 0.0;
00102         double s2 = 0.0;
00103         for( long i=0; i < n; i++ )
00104         {
00105                 s1 += x[i];
00106                 s2 += y[i];
00107         }
00108         double rn = (double)n;
00109         double xavg = s1/rn;
00110         double yavg = s2/rn;
00111         double sxx = 0.0;
00112         double sxy = 0.0;
00113         for( long i=0; i < n; i++ )
00114         {
00115                 x[i] -= xavg;
00116                 y[i] -= yavg;
00117                 sxx += pow2(x[i]);
00118                 sxy += x[i]*y[i];
00119         }
00120 
00121         if( sxy == 0.0 )
00122         {
00123                 return true;
00124         }
00125 
00126         
00127         b = sxy/sxx;
00128 
00129         
00130         a = yavg - b*xavg;
00131 
00132         
00133         double sum1 = 0.0;
00134         for( long i=0; i < n; i++ )
00135                 sum1 += pow2(x[i]*(y[i] - b*x[i]));
00136 
00137         
00138         sigb = sum1/pow2(sxx);
00139 
00140         
00141         for( long i=0; i < n; i++ )
00142                 siga += pow2((y[i] - b*x[i])*(1.0 - rn*xavg*x[i]/sxx));
00143 
00144         
00145         sigb = sqrt(sigb);
00146         siga = sqrt(siga)/rn;
00147 
00148         
00149         for( long i=0; i < n; i++ )
00150         {
00151                 x[i] += xavg;
00152                 y[i] += yavg;
00153         }
00154         return false;
00155 }
00156 
00157 
00158 
00159 
00160 
00161 
00162 
00163 
00164 
00165 static const double pre_factorial[NPRE_FACTORIAL] =
00166 {
00167         1.00000000000000000000e+00,
00168         1.00000000000000000000e+00,
00169         2.00000000000000000000e+00,
00170         6.00000000000000000000e+00,
00171         2.40000000000000000000e+01,
00172         1.20000000000000000000e+02,
00173         7.20000000000000000000e+02,
00174         5.04000000000000000000e+03,
00175         4.03200000000000000000e+04,
00176         3.62880000000000000000e+05,
00177         3.62880000000000000000e+06,
00178         3.99168000000000000000e+07,
00179         4.79001600000000000000e+08,
00180         6.22702080000000000000e+09,
00181         8.71782912000000000000e+10,
00182         1.30767436800000000000e+12,
00183         2.09227898880000000000e+13,
00184         3.55687428096000000000e+14,
00185         6.40237370572800000000e+15,
00186         1.21645100408832000000e+17,
00187         2.43290200817664000000e+18,
00188         5.10909421717094400000e+19,
00189         1.12400072777760768000e+21,
00190         2.58520167388849766400e+22,
00191         6.20448401733239439360e+23,
00192         1.55112100433309859840e+25,
00193         4.03291461126605635592e+26,
00194         1.08888694504183521614e+28,
00195         3.04888344611713860511e+29,
00196         8.84176199373970195470e+30,
00197         2.65252859812191058647e+32,
00198         8.22283865417792281807e+33,
00199         2.63130836933693530178e+35,
00200         8.68331761881188649615e+36,
00201         2.95232799039604140861e+38,
00202         1.03331479663861449300e+40,
00203         3.71993326789901217463e+41,
00204         1.37637530912263450457e+43,
00205         5.23022617466601111726e+44,
00206         2.03978820811974433568e+46,
00207         8.15915283247897734264e+47,
00208         3.34525266131638071044e+49,
00209         1.40500611775287989839e+51,
00210         6.04152630633738356321e+52,
00211         2.65827157478844876773e+54,
00212         1.19622220865480194551e+56,
00213         5.50262215981208894940e+57,
00214         2.58623241511168180614e+59,
00215         1.24139155925360726691e+61,
00216         6.08281864034267560801e+62,
00217         3.04140932017133780398e+64,
00218         1.55111875328738227999e+66,
00219         8.06581751709438785585e+67,
00220         4.27488328406002556374e+69,
00221         2.30843697339241380441e+71,
00222         1.26964033536582759243e+73,
00223         7.10998587804863451749e+74,
00224         4.05269195048772167487e+76,
00225         2.35056133128287857145e+78,
00226         1.38683118545689835713e+80,
00227         8.32098711274139014271e+81,
00228         5.07580213877224798711e+83,
00229         3.14699732603879375200e+85,
00230         1.98260831540444006372e+87,
00231         1.26886932185884164078e+89,
00232         8.24765059208247066512e+90,
00233         5.44344939077443063905e+92,
00234         3.64711109181886852801e+94,
00235         2.48003554243683059915e+96,
00236         1.71122452428141311337e+98,
00237         1.19785716699698917933e+100,
00238         8.50478588567862317347e+101,
00239         6.12344583768860868500e+103,
00240         4.47011546151268434004e+105,
00241         3.30788544151938641157e+107,
00242         2.48091408113953980872e+109,
00243         1.88549470166605025458e+111,
00244         1.45183092028285869606e+113,
00245         1.13242811782062978295e+115,
00246         8.94618213078297528506e+116,
00247         7.15694570462638022794e+118,
00248         5.79712602074736798470e+120,
00249         4.75364333701284174746e+122,
00250         3.94552396972065865030e+124,
00251         3.31424013456535326627e+126,
00252         2.81710411438055027626e+128,
00253         2.42270953836727323750e+130,
00254         2.10775729837952771662e+132,
00255         1.85482642257398439069e+134,
00256         1.65079551609084610774e+136,
00257         1.48571596448176149700e+138,
00258         1.35200152767840296226e+140,
00259         1.24384140546413072522e+142,
00260         1.15677250708164157442e+144,
00261         1.08736615665674307994e+146,
00262         1.03299784882390592592e+148,
00263         9.91677934870949688836e+149,
00264         9.61927596824821198159e+151,
00265         9.42689044888324774164e+153,
00266         9.33262154439441526381e+155,
00267         9.33262154439441526388e+157,
00268         9.42594775983835941673e+159,
00269         9.61446671503512660515e+161,
00270         9.90290071648618040340e+163,
00271         1.02990167451456276198e+166,
00272         1.08139675824029090008e+168,
00273         1.14628056373470835406e+170,
00274         1.22652020319613793888e+172,
00275         1.32464181945182897396e+174,
00276         1.44385958320249358163e+176,
00277         1.58824554152274293982e+178,
00278         1.76295255109024466316e+180,
00279         1.97450685722107402277e+182,
00280         2.23119274865981364576e+184,
00281         2.54355973347218755612e+186,
00282         2.92509369349301568964e+188,
00283         3.39310868445189820004e+190,
00284         3.96993716080872089396e+192,
00285         4.68452584975429065488e+194,
00286         5.57458576120760587943e+196,
00287         6.68950291344912705515e+198,
00288         8.09429852527344373681e+200,
00289         9.87504420083360135884e+202,
00290         1.21463043670253296712e+205,
00291         1.50614174151114087918e+207,
00292         1.88267717688892609901e+209,
00293         2.37217324288004688470e+211,
00294         3.01266001845765954361e+213,
00295         3.85620482362580421582e+215,
00296         4.97450422247728743840e+217,
00297         6.46685548922047366972e+219,
00298         8.47158069087882050755e+221,
00299         1.11824865119600430699e+224,
00300         1.48727070609068572828e+226,
00301         1.99294274616151887582e+228,
00302         2.69047270731805048244e+230,
00303         3.65904288195254865604e+232,
00304         5.01288874827499165889e+234,
00305         6.91778647261948848943e+236,
00306         9.61572319694108900019e+238,
00307         1.34620124757175246000e+241,
00308         1.89814375907617096864e+243,
00309         2.69536413788816277557e+245,
00310         3.85437071718007276916e+247,
00311         5.55029383273930478744e+249,
00312         8.04792605747199194159e+251,
00313         1.17499720439091082343e+254,
00314         1.72724589045463891049e+256,
00315         2.55632391787286558753e+258,
00316         3.80892263763056972532e+260,
00317         5.71338395644585458806e+262,
00318         8.62720977423324042775e+264,
00319         1.31133588568345254503e+267,
00320         2.00634390509568239384e+269,
00321         3.08976961384735088657e+271,
00322         4.78914290146339387432e+273,
00323         7.47106292628289444390e+275,
00324         1.17295687942641442768e+278,
00325         1.85327186949373479574e+280,
00326         2.94670227249503832518e+282,
00327         4.71472363599206132029e+284,
00328         7.59070505394721872577e+286,
00329         1.22969421873944943358e+289,
00330         2.00440157654530257674e+291,
00331         3.28721858553429622598e+293,
00332         5.42391066613158877297e+295,
00333         9.00369170577843736335e+297,
00334         1.50361651486499903974e+300,
00335         2.52607574497319838672e+302,
00336         4.26906800900470527345e+304,
00337         7.25741561530799896496e+306
00338 };
00339 
00340 double factorial( long n )
00341 {
00342         DEBUG_ENTRY( "factorial()" );
00343 
00344         if( n < 0 || n >= NPRE_FACTORIAL )
00345         {
00346                 fprintf( ioQQQ, "factorial: domain error\n" );
00347                 cdEXIT(EXIT_FAILURE);
00348         }
00349 
00350         return pre_factorial[n];
00351 }
00352 
00353 
00354 
00355 class t_lfact : public Singleton<t_lfact>
00356 {
00357         friend class Singleton<t_lfact>;
00358 protected:
00359         t_lfact()
00360         {
00361                 p_lf.reserve( 512 );
00362                 p_lf.push_back( 0. ); 
00363                 p_lf.push_back( 0. ); 
00364         }
00365 private:
00366         vector<double> p_lf;
00367 public:
00368         double get_lfact( unsigned long n )
00369         {
00370                 if( n < p_lf.size() )
00371                 {
00372                         return p_lf[n];
00373                 }
00374                 else
00375                 {
00376                         for( unsigned long i=(unsigned long)p_lf.size(); i <= n; i++ )
00377                                 p_lf.push_back( p_lf[i-1] + log10(static_cast<double>(i)) );
00378                         return p_lf[n];
00379                 }
00380         }
00381 };
00382 
00383 double lfactorial( long n )
00384 {
00385         
00386         
00387         
00388         
00389         
00390         
00391         
00392 
00393         DEBUG_ENTRY( "lfactorial()" );
00394 
00395         if( n < 0 )
00396         {
00397                 fprintf( ioQQQ, "lfactorial: domain error\n" );
00398                 cdEXIT(EXIT_FAILURE);
00399         }
00400 
00401         return t_lfact::Inst().get_lfact( static_cast<unsigned long>(n) );
00402 }
00403 
00404 
00405 
00406 
00407 
00408 
00409 
00410 
00411 complex<double> cdgamma(complex<double> x)
00412 {
00413         double xr, xi, wr, wi, ur, ui, vr, vi, yr, yi, t;
00414 
00415         DEBUG_ENTRY( "cdgamma()" );
00416 
00417         xr = x.real();
00418         xi = x.imag();
00419         if(xr < 0)
00420         {
00421                 wr = 1. - xr;
00422                 wi = -xi;
00423         }
00424         else
00425         {
00426                 wr = xr;
00427                 wi = xi;
00428         }
00429         ur = wr + 6.00009857740312429;
00430         vr = ur * (wr + 4.99999857982434025) - wi * wi;
00431         vi = wi * (wr + 4.99999857982434025) + ur * wi;
00432         yr = ur * 13.2280130755055088 + vr * 66.2756400966213521 + 
00433                  0.293729529320536228;
00434         yi = wi * 13.2280130755055088 + vi * 66.2756400966213521;
00435         ur = vr * (wr + 4.00000003016801681) - vi * wi;
00436         ui = vi * (wr + 4.00000003016801681) + vr * wi;
00437         vr = ur * (wr + 2.99999999944915534) - ui * wi;
00438         vi = ui * (wr + 2.99999999944915534) + ur * wi;
00439         yr += ur * 91.1395751189899762 + vr * 47.3821439163096063;
00440         yi += ui * 91.1395751189899762 + vi * 47.3821439163096063;
00441         ur = vr * (wr + 2.00000000000603851) - vi * wi;
00442         ui = vi * (wr + 2.00000000000603851) + vr * wi;
00443         vr = ur * (wr + 0.999999999999975753) - ui * wi;
00444         vi = ui * (wr + 0.999999999999975753) + ur * wi;
00445         yr += ur * 10.5400280458730808 + vr;
00446         yi += ui * 10.5400280458730808 + vi;
00447         ur = vr * wr - vi * wi;
00448         ui = vi * wr + vr * wi;
00449         t = ur * ur + ui * ui;
00450         vr = yr * ur + yi * ui + t * 0.0327673720261526849;
00451         vi = yi * ur - yr * ui;
00452         yr = wr + 7.31790632447016203;
00453         ur = log(yr * yr + wi * wi) * 0.5 - 1;
00454         ui = atan2(wi, yr);
00455         yr = exp(ur * (wr - 0.5) - ui * wi - 3.48064577727581257) / t;
00456         yi = ui * (wr - 0.5) + ur * wi;
00457         ur = yr * cos(yi);
00458         ui = yr * sin(yi);
00459         yr = ur * vr - ui * vi;
00460         yi = ui * vr + ur * vi;
00461         if(xr < 0)
00462         {
00463                 wr = xr * 3.14159265358979324;
00464                 wi = exp(xi * 3.14159265358979324);
00465                 vi = 1 / wi;
00466                 ur = (vi + wi) * sin(wr);
00467                 ui = (vi - wi) * cos(wr);
00468                 vr = ur * yr + ui * yi;
00469                 vi = ui * yr - ur * yi;
00470                 ur = 6.2831853071795862 / (vr * vr + vi * vi);
00471                 yr = ur * vr;
00472                 yi = ur * vi;
00473         }
00474         return complex<double>( yr, yi );
00475 }
00476 
00477 
00478 
00479 
00480 
00481 
00482 
00483 
00484 
00485 
00486 
00487 
00488 
00489 
00490 
00491 
00492 
00493 
00494 
00495 
00496 
00497 
00498 
00499 
00500 
00501 
00502 
00503 
00504 
00505 
00506 
00507 
00508 
00509 
00510 
00511 
00512 
00513 
00514 
00515 
00516 
00517 
00518 
00519 
00520 
00521 
00522 
00523 
00524 
00525 
00526 
00527 
00528 
00529 
00530 
00531 
00532 
00533 
00534 
00535 
00536 
00537 
00538 
00539 
00540 
00541 
00542 
00543 
00544 
00545 
00546 
00547 
00548 
00549 
00550 
00551 
00552 
00553 
00554 
00555 
00556 
00557 
00558 
00559 
00560 
00561 
00562 
00563 
00564 
00565 
00566 
00567 
00568 
00569 
00570 
00571 
00572 
00573 
00574 
00575 
00576 
00577 
00578 
00579 
00580 
00581 
00582 
00583 
00584 
00585 
00586 
00587 
00588 
00589 
00590 
00591 static const double b0_PP[7] = {
00592         7.96936729297347051624e-4,
00593         8.28352392107440799803e-2,
00594         1.23953371646414299388e0,
00595         5.44725003058768775090e0,
00596         8.74716500199817011941e0,
00597         5.30324038235394892183e0,
00598         9.99999999999999997821e-1,
00599 };
00600 
00601 static const double b0_PQ[7] = {
00602         9.24408810558863637013e-4,
00603         8.56288474354474431428e-2,
00604         1.25352743901058953537e0,
00605         5.47097740330417105182e0,
00606         8.76190883237069594232e0,
00607         5.30605288235394617618e0,
00608         1.00000000000000000218e0,
00609 };
00610 
00611 static const double b0_QP[8] = {
00612         -1.13663838898469149931e-2,
00613         -1.28252718670509318512e0,
00614         -1.95539544257735972385e1,
00615         -9.32060152123768231369e1,
00616         -1.77681167980488050595e2,
00617         -1.47077505154951170175e2,
00618         -5.14105326766599330220e1,
00619         -6.05014350600728481186e0,
00620 };
00621 
00622 static const double b0_QQ[7] = {
00623         
00624         6.43178256118178023184e1,
00625         8.56430025976980587198e2,
00626         3.88240183605401609683e3,
00627         7.24046774195652478189e3,
00628         5.93072701187316984827e3,
00629         2.06209331660327847417e3,
00630         2.42005740240291393179e2,
00631 };
00632 
00633 static const double b0_YP[8] = {
00634         1.55924367855235737965e4,
00635         -1.46639295903971606143e7,
00636         5.43526477051876500413e9,
00637         -9.82136065717911466409e11,
00638         8.75906394395366999549e13,
00639         -3.46628303384729719441e15,
00640         4.42733268572569800351e16,
00641         -1.84950800436986690637e16,
00642 };
00643 
00644 static const double b0_YQ[7] = {
00645         
00646         1.04128353664259848412e3,
00647         6.26107330137134956842e5,
00648         2.68919633393814121987e8,
00649         8.64002487103935000337e10,
00650         2.02979612750105546709e13,
00651         3.17157752842975028269e15,
00652         2.50596256172653059228e17,
00653 };
00654 
00655 
00656 static const double DR1 = 5.78318596294678452118e0;
00657 
00658 static const double DR2 = 3.04712623436620863991e1;
00659 
00660 static double b0_RP[4] = {
00661         -4.79443220978201773821e9,
00662         1.95617491946556577543e12,
00663         -2.49248344360967716204e14,
00664         9.70862251047306323952e15,
00665 };
00666 
00667 static double b0_RQ[8] = {
00668         
00669         4.99563147152651017219e2,
00670         1.73785401676374683123e5,
00671         4.84409658339962045305e7,
00672         1.11855537045356834862e10,
00673         2.11277520115489217587e12,
00674         3.10518229857422583814e14,
00675         3.18121955943204943306e16,
00676         1.71086294081043136091e18,
00677 };
00678 
00679 static const double TWOOPI = 2./PI;
00680 static const double SQ2OPI = sqrt(2./PI);
00681 static const double PIO4 = PI/4.;
00682 
00683 double bessel_j0(double x)
00684 {
00685         double w, z, p, q, xn;
00686 
00687         DEBUG_ENTRY( "bessel_j0()" );
00688 
00689         if( x < 0 )
00690                 x = -x;
00691 
00692         if( x <= 5.0 )
00693         {
00694                 z = x * x;
00695                 if( x < 1.0e-5 )
00696                         return 1.0 - z/4.0;
00697 
00698                 p = (z - DR1) * (z - DR2);
00699                 p = p * polevl( z, b0_RP, 3)/p1evl( z, b0_RQ, 8 );
00700                 return p;
00701         }
00702 
00703         w = 5.0/x;
00704         q = 25.0/(x*x);
00705         p = polevl( q, b0_PP, 6)/polevl( q, b0_PQ, 6 );
00706         q = polevl( q, b0_QP, 7)/p1evl( q, b0_QQ, 7 );
00707         xn = x - PIO4;
00708         p = p * cos(xn) - w * q * sin(xn);
00709         return p * SQ2OPI / sqrt(x);
00710 }
00711 
00712 
00713 
00714 
00715 
00716 
00717 
00718 
00719 
00720 
00721 double bessel_y0(double x)
00722 {
00723         double w, z, p, q, xn;
00724 
00725         DEBUG_ENTRY( "bessel_y0()" );
00726 
00727         if( x <= 5.0 )
00728         {
00729                 if( x <= 0.0 )
00730                 {
00731                         fprintf( ioQQQ, "bessel_y0: domain error\n" );
00732                         cdEXIT(EXIT_FAILURE);
00733                 }
00734                 z = x * x;
00735                 w = polevl( z, b0_YP, 7 ) / p1evl( z, b0_YQ, 7 );
00736                 w += TWOOPI * log(x) * bessel_j0(x);
00737                 return w;
00738         }
00739 
00740         w = 5.0/x;
00741         z = 25.0 / (x * x);
00742         p = polevl( z, b0_PP, 6)/polevl( z, b0_PQ, 6 );
00743         q = polevl( z, b0_QP, 7)/p1evl( z, b0_QQ, 7 );
00744         xn = x - PIO4;
00745         p = p * sin(xn) + w * q * cos(xn);
00746         return p * SQ2OPI / sqrt(x);
00747 }
00748 
00749 
00750 
00751 
00752 
00753 
00754 
00755 
00756 
00757 
00758 
00759 
00760 
00761 
00762 
00763 
00764 
00765 
00766 
00767 
00768 
00769 
00770 
00771 
00772 
00773 
00774 
00775 
00776 
00777 
00778 
00779 
00780 
00781 
00782 
00783 
00784 
00785 
00786 
00787 
00788 
00789 
00790 
00791 
00792 
00793 
00794 
00795 
00796 
00797 
00798 
00799 
00800 
00801 
00802 
00803 
00804 
00805 
00806 
00807 
00808 
00809 
00810 
00811 
00812 
00813 
00814 
00815 
00816 
00817 
00818 
00819 
00820 
00821 
00822 
00823 
00824 
00825 
00826 
00827 static const double b1_RP[4] = {
00828         -8.99971225705559398224e8,
00829         4.52228297998194034323e11,
00830         -7.27494245221818276015e13,
00831         3.68295732863852883286e15,
00832 };
00833 
00834 static const double b1_RQ[8] = {
00835         
00836         6.20836478118054335476e2,
00837         2.56987256757748830383e5,
00838         8.35146791431949253037e7,
00839         2.21511595479792499675e10,
00840         4.74914122079991414898e12,
00841         7.84369607876235854894e14,
00842         8.95222336184627338078e16,
00843         5.32278620332680085395e18,
00844 };
00845 
00846 static const double b1_PP[7] = {
00847         7.62125616208173112003e-4,
00848         7.31397056940917570436e-2,
00849         1.12719608129684925192e0,
00850         5.11207951146807644818e0,
00851         8.42404590141772420927e0,
00852         5.21451598682361504063e0,
00853         1.00000000000000000254e0,
00854 };
00855 
00856 static const double b1_PQ[7] = {
00857         5.71323128072548699714e-4,
00858         6.88455908754495404082e-2,
00859         1.10514232634061696926e0,
00860         5.07386386128601488557e0,
00861         8.39985554327604159757e0,
00862         5.20982848682361821619e0,
00863         9.99999999999999997461e-1,
00864 };
00865 
00866 static const double b1_QP[8] = {
00867         5.10862594750176621635e-2,
00868         4.98213872951233449420e0,
00869         7.58238284132545283818e1,
00870         3.66779609360150777800e2,
00871         7.10856304998926107277e2,
00872         5.97489612400613639965e2,
00873         2.11688757100572135698e2,
00874         2.52070205858023719784e1,
00875 };
00876 
00877 static const double b1_QQ[7] = {
00878         
00879         7.42373277035675149943e1,
00880         1.05644886038262816351e3,
00881         4.98641058337653607651e3,
00882         9.56231892404756170795e3,
00883         7.99704160447350683650e3,
00884         2.82619278517639096600e3,
00885         3.36093607810698293419e2,
00886 };
00887 
00888 static const double b1_YP[6] = {
00889         1.26320474790178026440e9,
00890         -6.47355876379160291031e11,
00891         1.14509511541823727583e14,
00892         -8.12770255501325109621e15,
00893         2.02439475713594898196e17,
00894         -7.78877196265950026825e17,
00895 };
00896 
00897 static const double b1_YQ[8] = {
00898         
00899         5.94301592346128195359E2,
00900         2.35564092943068577943E5,
00901         7.34811944459721705660E7,
00902         1.87601316108706159478E10,
00903         3.88231277496238566008E12,
00904         6.20557727146953693363E14,
00905         6.87141087355300489866E16,
00906         3.97270608116560655612E18,
00907 };
00908 
00909 static const double Z1 = 1.46819706421238932572E1;
00910 static const double Z2 = 4.92184563216946036703E1;
00911 
00912 static const double THPIO4 = 3.*PI/4.;
00913 
00914 double bessel_j1(double x)
00915 {
00916         double w, z, p, q, xn;
00917 
00918         DEBUG_ENTRY( "bessel_j1()" );
00919 
00920         w = x;
00921         if( x < 0 )
00922                 w = -x;
00923 
00924         if( w <= 5.0 )
00925         {
00926                 z = x * x;      
00927                 w = polevl( z, b1_RP, 3 ) / p1evl( z, b1_RQ, 8 );
00928                 w = w * x * (z - Z1) * (z - Z2);
00929                 return w;
00930         }
00931 
00932         w = 5.0/x;
00933         z = w * w;
00934         p = polevl( z, b1_PP, 6)/polevl( z, b1_PQ, 6 );
00935         q = polevl( z, b1_QP, 7)/p1evl( z, b1_QQ, 7 );
00936         xn = x - THPIO4;
00937         p = p * cos(xn) - w * q * sin(xn);
00938         return p * SQ2OPI / sqrt(x);
00939 }
00940 
00941 double bessel_y1(double x)
00942 {
00943         double w, z, p, q, xn;
00944 
00945         DEBUG_ENTRY( "bessel_y1()" );
00946 
00947         if( x <= 5.0 )
00948         {
00949                 if( x <= 0.0 )
00950                 {
00951                         fprintf( ioQQQ, "bessel_y1: domain error\n" );
00952                         cdEXIT(EXIT_FAILURE);
00953                 }
00954                 z = x * x;
00955                 w = x * (polevl( z, b1_YP, 5 ) / p1evl( z, b1_YQ, 8 ));
00956                 w += TWOOPI * ( bessel_j1(x) * log(x)  -  1.0/x );
00957                 return w;
00958         }
00959 
00960         w = 5.0/x;
00961         z = w * w;
00962         p = polevl( z, b1_PP, 6 )/polevl( z, b1_PQ, 6 );
00963         q = polevl( z, b1_QP, 7 )/p1evl( z, b1_QQ, 7 );
00964         xn = x - THPIO4;
00965         p = p * sin(xn) + w * q * cos(xn);
00966         return p * SQ2OPI / sqrt(x);
00967 }
00968 
00969 
00970 
00971 
00972 
00973 
00974 
00975 
00976 
00977 
00978 
00979 
00980 
00981 
00982 
00983 
00984 
00985 
00986 
00987 
00988 
00989 
00990 
00991 
00992 
00993 
00994 
00995 
00996 
00997 
00998 
00999 
01000 
01001 
01002 
01003 
01004 
01005 
01006 
01007 
01008 
01009 
01010 
01011 
01012 
01013 
01014 
01015 
01016 
01017 double bessel_jn(int n, double x)
01018 {
01019         double pkm2, pkm1, pk, xk, r, ans;
01020         int k, sign;
01021 
01022         DEBUG_ENTRY( "bessel_jn()" );
01023 
01024         if( n < 0 )
01025         {
01026                 n = -n;
01027                 if( (n & 1) == 0 )      
01028                         sign = 1;
01029                 else
01030                         sign = -1;
01031         }
01032         else
01033                 sign = 1;
01034 
01035         if( x < 0.0 )
01036         {
01037                 if( n & 1 )
01038                         sign = -sign;
01039                 x = -x;
01040         }
01041 
01042         if( n == 0 )
01043         {
01044                 return sign * bessel_j0(x);
01045         }
01046         if( n == 1 )
01047         {
01048                 return sign * bessel_j1(x);
01049         }
01050         if( n == 2 )
01051         {
01052                 return sign * (2.0 * bessel_j1(x) / x  -  bessel_j0(x));
01053         }
01054 
01055         if( x < DBL_EPSILON )
01056         {
01057                 return 0.0;
01058         }
01059 
01060         
01061         k = 52;
01062 
01063         pk = 2 * (n + k);
01064         ans = pk;
01065         xk = x * x;
01066 
01067         do
01068         {
01069                 pk -= 2.0;
01070                 ans = pk - (xk/ans);
01071         }
01072         while( --k > 0 );
01073         ans = x/ans;
01074 
01075         
01076         pk = 1.0;
01077         pkm1 = 1.0/ans;
01078         k = n-1;
01079         r = 2 * k;
01080 
01081         do
01082         {
01083                 pkm2 = (pkm1 * r  -  pk * x) / x;
01084                 pk = pkm1;
01085                 pkm1 = pkm2;
01086                 r -= 2.0;
01087         }
01088         while( --k > 0 );
01089 
01090         if( fabs(pk) > fabs(pkm1) )
01091                 ans = bessel_j1(x)/pk;
01092         else
01093                 ans = bessel_j0(x)/pkm1;
01094         return sign * ans;
01095 }
01096 
01097 
01098 
01099 
01100 
01101 
01102 
01103 
01104 
01105 
01106 
01107 
01108 
01109 
01110 
01111 
01112 
01113 
01114 
01115 
01116 
01117 
01118 
01119 
01120 
01121 
01122 
01123 
01124 
01125 
01126 
01127 
01128 
01129 
01130 
01131 
01132 
01133 
01134 
01135 
01136 
01137 
01138 
01139 
01140 
01141 
01142 
01143 
01144 
01145 
01146 
01147 
01148 
01149 
01150 
01151 double bessel_yn(int n, double x)
01152 {
01153         double an, anm1, anm2, r;
01154         int k, sign;
01155 
01156         DEBUG_ENTRY( "bessel_yn()" );
01157 
01158         if( n < 0 )
01159         {
01160                 n = -n;
01161                 if( (n & 1) == 0 )      
01162                         sign = 1;
01163                 else
01164                         sign = -1;
01165         }
01166         else
01167                 sign = 1;
01168 
01169         if( n == 0 )
01170         {
01171                 return sign * bessel_y0(x);
01172         }
01173         if( n == 1 )
01174         {
01175                 return sign * bessel_y1(x);
01176         }
01177 
01178         
01179         if( x <= 0.0 )
01180         {
01181                 fprintf( ioQQQ, "bessel_yn: domain error\n" );
01182                 cdEXIT(EXIT_FAILURE);
01183         }
01184 
01185         
01186         anm2 = bessel_y0(x);
01187         anm1 = bessel_y1(x);
01188         k = 1;
01189         r = 2 * k;
01190         do
01191         {
01192                 an = r * anm1 / x  -  anm2;
01193                 anm2 = anm1;
01194                 anm1 = an;
01195                 r += 2.0;
01196                 ++k;
01197         }
01198         while( k < n );
01199         return sign * an;
01200 }
01201 
01202 
01203 
01204 
01205 
01206 
01207 
01208 
01209 
01210 
01211 
01212 
01213 
01214 
01215 
01216 
01217 
01218 
01219 
01220 
01221 
01222 
01223 
01224 
01225 
01226 
01227 
01228 
01229 
01230 
01231 
01232 
01233 
01234 
01235 
01236 
01237 
01238 
01239 
01240 
01241 
01242 
01243 
01244 
01245 
01246 
01247 
01248 
01249 
01250 
01251 
01252 
01253 
01254 
01255 
01256 
01257 
01258 
01259 
01260 
01261 
01262 
01263 
01264 
01265 
01266 
01267 
01268 
01269 
01270 
01271 
01272 
01273 
01274 
01275 
01276 
01277 
01278 
01279 
01280 
01281 
01282 
01283 
01284 
01285 static const double k0_A[] =
01286 {
01287         1.37446543561352307156e-16,
01288         4.25981614279661018399e-14,
01289         1.03496952576338420167e-11,
01290         1.90451637722020886025e-9,
01291         2.53479107902614945675e-7,
01292         2.28621210311945178607e-5,
01293         1.26461541144692592338e-3,
01294         3.59799365153615016266e-2,
01295         3.44289899924628486886e-1,
01296         -5.35327393233902768720e-1
01297 };
01298 
01299 
01300 
01301 
01302 
01303 
01304 
01305 static const double k0_B[] = {
01306         5.30043377268626276149e-18,
01307         -1.64758043015242134646e-17,
01308         5.21039150503902756861e-17,
01309         -1.67823109680541210385e-16,
01310         5.51205597852431940784e-16,
01311         -1.84859337734377901440e-15,
01312         6.34007647740507060557e-15,
01313         -2.22751332699166985548e-14,
01314         8.03289077536357521100e-14,
01315         -2.98009692317273043925e-13,
01316         1.14034058820847496303e-12,
01317         -4.51459788337394416547e-12,
01318         1.85594911495471785253e-11,
01319         -7.95748924447710747776e-11,
01320         3.57739728140030116597e-10,
01321         -1.69753450938905987466e-9,
01322         8.57403401741422608519e-9,
01323         -4.66048989768794782956e-8,
01324         2.76681363944501510342e-7,
01325         -1.83175552271911948767e-6,
01326         1.39498137188764993662e-5,
01327         -1.28495495816278026384e-4,
01328         1.56988388573005337491e-3,
01329         -3.14481013119645005427e-2,
01330         2.44030308206595545468e0
01331 };
01332 
01333 double bessel_k0(double x)
01334 {
01335         double y, z;
01336 
01337         DEBUG_ENTRY( "bessel_k0()" );
01338 
01339         if( x <= 0.0 )
01340         {
01341                 fprintf( ioQQQ, "bessel_k0: domain error\n" );
01342                 cdEXIT(EXIT_FAILURE);
01343         }
01344 
01345         if( x <= 2.0 )
01346         {
01347                 y = x * x - 2.0;
01348                 y = chbevl( y, k0_A, 10 ) - log( 0.5 * x ) * bessel_i0(x);
01349                 return y;
01350         }
01351         z = 8.0/x - 2.0;
01352         y = exp(-x) * chbevl( z, k0_B, 25 ) / sqrt(x);
01353         return y;
01354 }
01355 
01356 double bessel_k0_scaled(double x)
01357 {
01358         double y;
01359 
01360         DEBUG_ENTRY( "bessel_k0_scaled()" );
01361 
01362         if( x <= 0.0 )
01363         {
01364                 fprintf( ioQQQ, "bessel_k0_scaled: domain error\n" );
01365                 cdEXIT(EXIT_FAILURE);
01366         }
01367 
01368         if( x <= 2.0 )
01369         {
01370                 y = x * x - 2.0;
01371                 y = chbevl( y, k0_A, 10 ) - log( 0.5 * x ) * bessel_i0(x);
01372                 return y * exp(x);
01373         }
01374         return chbevl( 8.0/x - 2.0, k0_B, 25 ) / sqrt(x);
01375 }
01376 
01377 
01378 
01379 
01380 
01381 
01382 
01383 
01384 
01385 
01386 
01387 
01388 
01389 
01390 
01391 
01392 
01393 
01394 
01395 
01396 
01397 
01398 
01399 
01400 
01401 
01402 
01403 
01404 
01405 
01406 
01407 
01408 
01409 
01410 
01411 
01412 
01413 
01414 
01415 
01416 
01417 
01418 
01419 
01420 
01421 
01422 
01423 
01424 
01425 
01426 
01427 
01428 
01429 
01430 
01431 
01432 
01433 
01434 
01435 
01436 
01437 
01438 
01439 
01440 
01441 
01442 
01443 
01444 
01445 
01446 
01447 
01448 
01449 
01450 
01451 
01452 
01453 
01454 
01455 
01456 
01457 
01458 
01459 static const double k1_A[] =
01460 {
01461         -7.02386347938628759343e-18,
01462         -2.42744985051936593393e-15,
01463         -6.66690169419932900609e-13,
01464         -1.41148839263352776110e-10,
01465         -2.21338763073472585583e-8,
01466         -2.43340614156596823496e-6,
01467         -1.73028895751305206302e-4,
01468         -6.97572385963986435018e-3,
01469         -1.22611180822657148235e-1,
01470         -3.53155960776544875667e-1,
01471         1.52530022733894777053e0
01472 };
01473 
01474 
01475 
01476 
01477 
01478 
01479 
01480 static const double k1_B[] =
01481 {
01482         -5.75674448366501715755e-18,
01483         1.79405087314755922667e-17,
01484         -5.68946255844285935196e-17,
01485         1.83809354436663880070e-16,
01486         -6.05704724837331885336e-16,
01487         2.03870316562433424052e-15,
01488         -7.01983709041831346144e-15,
01489         2.47715442448130437068e-14,
01490         -8.97670518232499435011e-14,
01491         3.34841966607842919884e-13,
01492         -1.28917396095102890680e-12,
01493         5.13963967348173025100e-12,
01494         -2.12996783842756842877e-11,
01495         9.21831518760500529508e-11,
01496         -4.19035475934189648750e-10,
01497         2.01504975519703286596e-9,
01498         -1.03457624656780970260e-8,
01499         5.74108412545004946722e-8,
01500         -3.50196060308781257119e-7,
01501         2.40648494783721712015e-6,
01502         -1.93619797416608296024e-5,
01503         1.95215518471351631108e-4,
01504         -2.85781685962277938680e-3,
01505         1.03923736576817238437e-1,
01506         2.72062619048444266945e0
01507 };
01508 
01509 double bessel_k1(double x)
01510 {
01511         double y, z;
01512 
01513         DEBUG_ENTRY( "bessel_k1()" );
01514 
01515         z = 0.5 * x;
01516         if( z <= 0.0 )
01517         {
01518                 fprintf( ioQQQ, "bessel_k1: domain error\n" );
01519                 cdEXIT(EXIT_FAILURE);
01520         }
01521 
01522         if( x <= 2.0 )
01523         {
01524                 y = x * x - 2.0;
01525                 y =  log(z) * bessel_i1(x)  +  chbevl( y, k1_A, 11 ) / x;
01526                 return y;
01527         }
01528         return exp(-x) * chbevl( 8.0/x - 2.0, k1_B, 25 ) / sqrt(x);
01529 }
01530 
01531 double bessel_k1_scaled(double x)
01532 {
01533         double y;
01534 
01535         DEBUG_ENTRY( "bessel_k1_scaled()" );
01536 
01537         if( x <= 0.0 )
01538         {
01539                 fprintf( ioQQQ, "bessel_k1_scaled: domain error\n" );
01540                 cdEXIT(EXIT_FAILURE);
01541         }
01542 
01543         if( x <= 2.0 )
01544         {
01545                 y = x * x - 2.0;
01546                 y =  log( 0.5 * x ) * bessel_i1(x)  +  chbevl( y, k1_A, 11 ) / x;
01547                 return y * exp(x);
01548         }
01549         return chbevl( 8.0/x - 2.0, k1_B, 25 ) / sqrt(x);
01550 }
01551 
01552 
01553 
01554 
01555 
01556 
01557 
01558 
01559 
01560 
01561 
01562 
01563 
01564 
01565 
01566 
01567 
01568 
01569 
01570 
01571 
01572 
01573 
01574 
01575 
01576 
01577 
01578 
01579 
01580 
01581 
01582 
01583 
01584 
01585 
01586 
01587 
01588 
01589 
01590 
01591 
01592 
01593 
01594 
01595 
01596 
01597 
01598 
01599 
01600 
01601 
01602 
01603 
01604 
01605 
01606 
01607 
01608 
01609 
01610 
01611 
01612 
01613 
01614 
01615 
01616 
01617 
01618 
01619 
01620 
01621 
01622 
01623 
01624 
01625 
01626 
01627 
01628 
01629 
01630 
01631 static const double i0_A[] =
01632 {
01633         -4.41534164647933937950e-18,
01634         3.33079451882223809783e-17,
01635         -2.43127984654795469359e-16,
01636         1.71539128555513303061e-15,
01637         -1.16853328779934516808e-14,
01638         7.67618549860493561688e-14,
01639         -4.85644678311192946090e-13,
01640         2.95505266312963983461e-12,
01641         -1.72682629144155570723e-11,
01642         9.67580903537323691224e-11,
01643         -5.18979560163526290666e-10,
01644         2.65982372468238665035e-9,
01645         -1.30002500998624804212e-8,
01646         6.04699502254191894932e-8,
01647         -2.67079385394061173391e-7,
01648         1.11738753912010371815e-6,
01649         -4.41673835845875056359e-6,
01650         1.64484480707288970893e-5,
01651         -5.75419501008210370398e-5,
01652         1.88502885095841655729e-4,
01653         -5.76375574538582365885e-4,
01654         1.63947561694133579842e-3,
01655         -4.32430999505057594430e-3,
01656         1.05464603945949983183e-2,
01657         -2.37374148058994688156e-2,
01658         4.93052842396707084878e-2,
01659         -9.49010970480476444210e-2,
01660         1.71620901522208775349e-1,
01661         -3.04682672343198398683e-1,
01662         6.76795274409476084995e-1
01663 };
01664 
01665 
01666 
01667 
01668 
01669 
01670 
01671 static const double i0_B[] =
01672 {
01673         -7.23318048787475395456e-18,
01674         -4.83050448594418207126e-18,
01675         4.46562142029675999901e-17,
01676         3.46122286769746109310e-17,
01677         -2.82762398051658348494e-16,
01678         -3.42548561967721913462e-16,
01679         1.77256013305652638360e-15,
01680         3.81168066935262242075e-15,
01681         -9.55484669882830764870e-15,
01682         -4.15056934728722208663e-14,
01683         1.54008621752140982691e-14,
01684         3.85277838274214270114e-13,
01685         7.18012445138366623367e-13,
01686         -1.79417853150680611778e-12,
01687         -1.32158118404477131188e-11,
01688         -3.14991652796324136454e-11,
01689         1.18891471078464383424e-11,
01690         4.94060238822496958910e-10,
01691         3.39623202570838634515e-9,
01692         2.26666899049817806459e-8,
01693         2.04891858946906374183e-7,
01694         2.89137052083475648297e-6,
01695         6.88975834691682398426e-5,
01696         3.36911647825569408990e-3,
01697         8.04490411014108831608e-1
01698 };
01699 
01700 double bessel_i0(double x)
01701 {
01702         double y;
01703 
01704         DEBUG_ENTRY( "bessel_i0()" );
01705 
01706         if( x < 0 )
01707                 x = -x;
01708 
01709         if( x <= 8.0 )
01710         {
01711                 y = (x/2.0) - 2.0;
01712                 return exp(x) * chbevl( y, i0_A, 30 );
01713         }
01714         return exp(x) * chbevl( 32.0/x - 2.0, i0_B, 25 ) / sqrt(x);
01715 }
01716 
01717 double bessel_i0_scaled(double x)
01718 {
01719         double y;
01720 
01721         DEBUG_ENTRY( "bessel_i0_scaled()" );
01722 
01723         if( x < 0 )
01724                 x = -x;
01725 
01726         if( x <= 8.0 )
01727         {
01728                 y = (x/2.0) - 2.0;
01729                 return chbevl( y, i0_A, 30 );
01730         }
01731         return chbevl( 32.0/x - 2.0, i0_B, 25 ) / sqrt(x);
01732 }
01733 
01734 
01735 
01736 
01737 
01738 
01739 
01740 
01741 
01742 
01743 
01744 
01745 
01746 
01747 
01748 
01749 
01750 
01751 
01752 
01753 
01754 
01755 
01756 
01757 
01758 
01759 
01760 
01761 
01762 
01763 
01764 
01765 
01766 
01767 
01768 
01769 
01770 
01771 
01772 
01773 
01774 
01775 
01776 
01777 
01778 
01779 
01780 
01781 
01782 
01783 
01784 
01785 
01786 
01787 
01788 
01789 
01790 
01791 
01792 
01793 
01794 
01795 
01796 
01797 
01798 
01799 
01800 
01801 
01802 
01803 
01804 
01805 
01806 
01807 
01808 
01809 
01810 
01811 
01812 
01813 
01814 static double i1_A[] =
01815 {
01816         2.77791411276104639959e-18,
01817         -2.11142121435816608115e-17,
01818         1.55363195773620046921e-16,
01819         -1.10559694773538630805e-15,
01820         7.60068429473540693410e-15,
01821         -5.04218550472791168711e-14,
01822         3.22379336594557470981e-13,
01823         -1.98397439776494371520e-12,
01824         1.17361862988909016308e-11,
01825         -6.66348972350202774223e-11,
01826         3.62559028155211703701e-10,
01827         -1.88724975172282928790e-9,
01828         9.38153738649577178388e-9,
01829         -4.44505912879632808065e-8,
01830         2.00329475355213526229e-7,
01831         -8.56872026469545474066e-7,
01832         3.47025130813767847674e-6,
01833         -1.32731636560394358279e-5,
01834         4.78156510755005422638e-5,
01835         -1.61760815825896745588e-4,
01836         5.12285956168575772895e-4,
01837         -1.51357245063125314899e-3,
01838         4.15642294431288815669e-3,
01839         -1.05640848946261981558e-2,
01840         2.47264490306265168283e-2,
01841         -5.29459812080949914269e-2,
01842         1.02643658689847095384e-1,
01843         -1.76416518357834055153e-1,
01844         2.52587186443633654823e-1
01845 };
01846 
01847 
01848 
01849 
01850 
01851 
01852 
01853 static double i1_B[] =
01854 {
01855         7.51729631084210481353e-18,
01856         4.41434832307170791151e-18,
01857         -4.65030536848935832153e-17,
01858         -3.20952592199342395980e-17,
01859         2.96262899764595013876e-16,
01860         3.30820231092092828324e-16,
01861         -1.88035477551078244854e-15,
01862         -3.81440307243700780478e-15,
01863         1.04202769841288027642e-14,
01864         4.27244001671195135429e-14,
01865         -2.10154184277266431302e-14,
01866         -4.08355111109219731823e-13,
01867         -7.19855177624590851209e-13,
01868         2.03562854414708950722e-12,
01869         1.41258074366137813316e-11,
01870         3.25260358301548823856e-11,
01871         -1.89749581235054123450e-11,
01872         -5.58974346219658380687e-10,
01873         -3.83538038596423702205e-9,
01874         -2.63146884688951950684e-8,
01875         -2.51223623787020892529e-7,
01876         -3.88256480887769039346e-6,
01877         -1.10588938762623716291e-4,
01878         -9.76109749136146840777e-3,
01879         7.78576235018280120474e-1
01880 };
01881 
01882 double bessel_i1(double x)
01883 { 
01884         double y, z;
01885 
01886         DEBUG_ENTRY( "bessel_i1()" );
01887 
01888         z = fabs(x);
01889         if( z <= 8.0 )
01890         {
01891                 y = (z/2.0) - 2.0;
01892                 z = chbevl( y, i1_A, 29 ) * z * exp(z);
01893         }
01894         else
01895         {
01896                 z = exp(z) * chbevl( 32.0/z - 2.0, i1_B, 25 ) / sqrt(z);
01897         }
01898         if( x < 0.0 )
01899                 z = -z;
01900         return z;
01901 }
01902 
01903 double bessel_i1_scaled(double x)
01904 { 
01905         double y, z;
01906 
01907         DEBUG_ENTRY( "bessel_i1_scaled()" );
01908 
01909         z = fabs(x);
01910         if( z <= 8.0 )
01911         {
01912                 y = (z/2.0) - 2.0;
01913                 z = chbevl( y, i1_A, 29 ) * z;
01914         }
01915         else
01916         {
01917                 z = chbevl( 32.0/z - 2.0, i1_B, 25 ) / sqrt(z);
01918         }
01919         if( x < 0.0 )
01920                 z = -z;
01921         return z;
01922 }
01923 
01924 
01925 
01926 
01927 
01928 
01929 
01930 
01931 
01932 
01933 
01934 
01935 
01936 
01937 
01938 
01939 
01940 
01941 
01942 
01943 
01944 
01945 
01946 
01947 
01948 
01949 
01950 
01951 
01952 
01953 
01954 
01955 
01956 
01957 
01958 
01959 
01960 
01961 
01962 
01963 
01964 
01965 
01966 
01967 
01968 
01969 
01970 
01971 
01972 
01973 
01974 
01975 
01976 
01977 
01978 
01979 
01980 
01981 
01982 
01983 static const double elk_P[] =
01984 {
01985         1.37982864606273237150e-4,
01986         2.28025724005875567385e-3,
01987         7.97404013220415179367e-3,
01988         9.85821379021226008714e-3,
01989         6.87489687449949877925e-3,
01990         6.18901033637687613229e-3,
01991         8.79078273952743772254e-3,
01992         1.49380448916805252718e-2,
01993         3.08851465246711995998e-2,
01994         9.65735902811690126535e-2,
01995         1.38629436111989062502e0
01996 };
01997 
01998 static const double elk_Q[] =
01999 {
02000         2.94078955048598507511e-5,
02001         9.14184723865917226571e-4,
02002         5.94058303753167793257e-3,
02003         1.54850516649762399335e-2,
02004         2.39089602715924892727e-2,
02005         3.01204715227604046988e-2,
02006         3.73774314173823228969e-2,
02007         4.88280347570998239232e-2,
02008         7.03124996963957469739e-2,
02009         1.24999999999870820058e-1,
02010         4.99999999999999999821e-1
02011 };
02012 
02013 static const double C1 = 1.3862943611198906188e0; 
02014 
02015 double ellpk(double x)
02016 {
02017         DEBUG_ENTRY( "ellpk()" );
02018 
02019         if( x < 0.0 || x > 1.0 )
02020         {
02021                 fprintf( ioQQQ, "ellpk: domain error\n" );
02022                 cdEXIT(EXIT_FAILURE);
02023         }
02024 
02025         if( x > DBL_EPSILON )
02026         {
02027                 return polevl(x,elk_P,10) - log(x) * polevl(x,elk_Q,10);
02028         }
02029         else
02030         {
02031                 if( x == 0.0 )
02032                 {
02033                         fprintf( ioQQQ, "ellpk: domain error\n" );
02034                         cdEXIT(EXIT_FAILURE);
02035                 }
02036                 else
02037                 {
02038                         return C1 - 0.5 * log(x);
02039                 }
02040         }
02041 }
02042 
02043 
02044 
02045 
02046 
02047 
02048 
02049 
02050 
02051 
02052 
02053 
02054 
02055 
02056 
02057 
02058 
02059 
02060 
02061 
02062 
02063 
02064 
02065 
02066 
02067 
02068 
02069 
02070 
02071 
02072 
02073 
02074 
02075 
02076 
02077 
02078 
02079 
02080 
02081 
02082 
02083 
02084 
02085 
02086 
02087 
02088 
02089 
02090 
02091 static const double MAXLOG = log(DBL_MAX);
02092 static const double BIG = 1.44115188075855872E+17; 
02093 
02094 double expn(int n, double x)
02095 {
02096         double ans, r, t, yk, xk;
02097         double pk, pkm1, pkm2, qk, qkm1, qkm2;
02098         double psi, z;
02099         int i, k;
02100 
02101         DEBUG_ENTRY( "expn()" );
02102 
02103         if( n < 0 || x < 0. )
02104         {
02105                 fprintf( ioQQQ, "expn: domain error\n" );
02106                 cdEXIT(EXIT_FAILURE);
02107         }
02108 
02109         if( x > MAXLOG )
02110         {
02111                 return 0.0;
02112         }
02113 
02114         if( x == 0.0 )
02115         {
02116                 if( n < 2 )
02117                 {
02118                         fprintf( ioQQQ, "expn: domain error\n" );
02119                         cdEXIT(EXIT_FAILURE);
02120                 }
02121                 else
02122                 {
02123                         return 1.0/((double)n-1.0);
02124                 }
02125         }
02126 
02127         if( n == 0 )
02128         {
02129                 return exp(-x)/x;
02130         }
02131 
02132         
02133         if( n > 5000 )
02134         {
02135                 xk = x + n;
02136                 yk = 1.0 / (xk * xk);
02137                 t = n;
02138                 ans = yk * t * (6.0 * x * x  -  8.0 * t * x  +  t * t);
02139                 ans = yk * (ans + t * (t  -  2.0 * x));
02140                 ans = yk * (ans + t);
02141                 ans = (ans + 1.0) * exp( -x ) / xk;
02142                 return ans;
02143         }
02144 
02145         if( x <= 1.0 )
02146         {
02147                 
02148                 psi = -EULER - log(x);
02149                 for( i=1; i < n; i++ )
02150                         psi = psi + 1.0/i;
02151 
02152                 z = -x;
02153                 xk = 0.0;
02154                 yk = 1.0;
02155                 pk = 1.0 - n;
02156                 if( n == 1 )
02157                         ans = 0.0;
02158                 else
02159                         ans = 1.0/pk;
02160                 do
02161                 {
02162                         xk += 1.0;
02163                         yk *= z/xk;
02164                         pk += 1.0;
02165                         if( pk != 0.0 )
02166                         {
02167                                 ans += yk/pk;
02168                         }
02169                         if( ans != 0.0 )
02170                                 t = fabs(yk/ans);
02171                         else
02172                                 t = 1.0;
02173                 }
02174                 while( t > DBL_EPSILON );
02175                 ans = powi(z,n-1)*psi/factorial(n-1) - ans;
02176                 return ans;
02177         }
02178         else
02179         {
02180                 
02181                 k = 1;
02182                 pkm2 = 1.0;
02183                 qkm2 = x;
02184                 pkm1 = 1.0;
02185                 qkm1 = x + n;
02186                 ans = pkm1/qkm1;
02187 
02188                 do
02189                 {
02190                         k += 1;
02191                         if( is_odd(k) )
02192                         {
02193                                 yk = 1.0;
02194                                 xk = static_cast<double>(n + (k-1)/2);
02195                         }
02196                         else
02197                         {
02198                                 yk = x;
02199                                 xk = static_cast<double>(k/2);
02200                         }
02201                         pk = pkm1 * yk  +  pkm2 * xk;
02202                         qk = qkm1 * yk  +  qkm2 * xk;
02203                         if( qk != 0 )
02204                         {
02205                                 r = pk/qk;
02206                                 t = fabs( (ans - r)/r );
02207                                 ans = r;
02208                         }
02209                         else
02210                                 t = 1.0;
02211                         pkm2 = pkm1;
02212                         pkm1 = pk;
02213                         qkm2 = qkm1;
02214                         qkm1 = qk;
02215                         if( fabs(pk) > BIG )
02216                         {
02217                                 pkm2 /= BIG;
02218                                 pkm1 /= BIG;
02219                                 qkm2 /= BIG;
02220                                 qkm1 /= BIG;
02221                         }
02222                 }
02223                 while( t > DBL_EPSILON );
02224 
02225                 ans *= exp( -x );
02226                 return ans;
02227         }
02228 }
02229 
02230 
02231 
02232 
02233 
02234 
02235 
02236 
02237 
02238 
02239 
02240 
02241 
02242 
02243 
02244 
02245 
02246 
02247 
02248 
02249 
02250 
02251 
02252 
02253 
02254 
02255 
02256 
02257 
02258 
02259 
02260 
02261 
02262 
02263 
02264 
02265 
02266 
02267 
02268 
02269 
02270 
02271 
02272 
02273 
02274 
02275 
02276 
02277 
02278 
02279 
02280 inline double polevl(double x, const double coef[], int N)
02281 {
02282         double ans;
02283         int i;
02284         const double *p = coef;
02285 
02286         ans = *p++;
02287         i = N;
02288 
02289         do
02290                 ans = ans * x  +  *p++;
02291         while( --i );
02292 
02293         return ans;
02294 }
02295 
02296 
02297 
02298 
02299 
02300 
02301 
02302 inline double p1evl(double x, const double coef[], int N)
02303 {
02304         double ans;
02305         const double *p = coef;
02306         int i;
02307 
02308         ans = x + *p++;
02309         i = N-1;
02310 
02311         do
02312                 ans = ans * x  + *p++;
02313         while( --i );
02314 
02315         return ans;
02316 }
02317 
02318 
02319 
02320 
02321 
02322 
02323 
02324 
02325 
02326 
02327 
02328 
02329 
02330 
02331 
02332 
02333 
02334 
02335 
02336 
02337 
02338 
02339 
02340 
02341 
02342 
02343 
02344 
02345 
02346 
02347 
02348 
02349 
02350 
02351 
02352 
02353 
02354 
02355 
02356 
02357 
02358 
02359 
02360 
02361 
02362 
02363 
02364 
02365 
02366 
02367 
02368 
02369 
02370 
02371 
02372 
02373 
02374 
02375 
02376 inline double chbevl(double x, const double array[], int n)
02377 {
02378         double b0, b1, b2;
02379         const double *p = array;
02380         int i;
02381 
02382         b0 = *p++;
02383         b1 = 0.0;
02384         i = n - 1;
02385 
02386         do
02387         {
02388                 b2 = b1;
02389                 b1 = b0;
02390                 b0 = x * b1  -  b2  + *p++;
02391         }
02392         while( --i );
02393 
02394         return 0.5*(b0-b2);
02395 }
02396 
02397 
02398 
02399 
02400 
02401 
02402 
02403 
02404 
02405 
02406 
02407 
02408 
02409 
02410 
02411 
02412 
02413 
02414 
02415 
02416 
02417 
02418 
02419 
02420 
02421 
02422 
02423 
02424 
02425 
02426 
02427 
02428 
02429 
02430 
02431 
02432 
02433 
02434 
02435 
02436 
02437 
02438 
02439 
02440 
02441 
02442 
02443 
02444 
02445 
02446 
02447 
02448 
02449 
02450   
02451 #define N 624
02452 #define M 397
02453 #define MATRIX_A 0x9908b0dfUL   
02454 #define UMASK 0x80000000UL 
02455 #define LMASK 0x7fffffffUL 
02456 #define MIXBITS(u,v) ( ((u) & UMASK) | ((v) & LMASK) )
02457 #define TWIST(u,v) ((MIXBITS(u,v) >> 1) ^ ((v)&1UL ? MATRIX_A : 0UL))
02458 
02459 static unsigned long state[N]; 
02460 static int nleft = 1;
02461 static int initf = 0;
02462 static unsigned long *next;
02463 
02464 
02465 void init_genrand(unsigned long s)
02466 {
02467     int j;
02468     state[0]= s & 0xffffffffUL;
02469     for (j=1; j<N; j++) {
02470         state[j] = (1812433253UL * (state[j-1] ^ (state[j-1] >> 30)) + j); 
02471         
02472         
02473         
02474         
02475         state[j] &= 0xffffffffUL;  
02476     }
02477     nleft = 1; initf = 1;
02478 }
02479 
02480 
02481 
02482 
02483 
02484 void init_by_array(unsigned long init_key[], int key_length)
02485 {
02486     int i, j, k;
02487     init_genrand(19650218UL);
02488     i=1; j=0;
02489     k = (N>key_length ? N : key_length);
02490     for (; k; k--) {
02491         state[i] = (state[i] ^ ((state[i-1] ^ (state[i-1] >> 30)) * 1664525UL))
02492           + init_key[j] + j; 
02493         state[i] &= 0xffffffffUL; 
02494         i++; j++;
02495         if (i>=N) { state[0] = state[N-1]; i=1; }
02496         if (j>=key_length) j=0;
02497     }
02498     for (k=N-1; k; k--) {
02499         state[i] = (state[i] ^ ((state[i-1] ^ (state[i-1] >> 30)) * 1566083941UL))
02500           - i; 
02501         state[i] &= 0xffffffffUL; 
02502         i++;
02503         if (i>=N) { state[0] = state[N-1]; i=1; }
02504     }
02505 
02506     state[0] = 0x80000000UL;  
02507     nleft = 1; initf = 1;
02508 }
02509 
02510 static void next_state(void)
02511 {
02512     unsigned long *p=state;
02513     int j;
02514 
02515     
02516     
02517     if (initf==0) init_genrand(5489UL);
02518 
02519     nleft = N;
02520     next = state;
02521     
02522     for (j=N-M+1; --j; p++) 
02523         *p = p[M] ^ TWIST(p[0], p[1]);
02524 
02525     for (j=M; --j; p++) 
02526         *p = p[M-N] ^ TWIST(p[0], p[1]);
02527 
02528     *p = p[M-N] ^ TWIST(p[0], state[0]);
02529 }
02530 
02531 
02532 unsigned long genrand_int32(void)
02533 {
02534     unsigned long y;
02535 
02536     if (--nleft == 0) next_state();
02537     y = *next++;
02538 
02539     
02540     y ^= (y >> 11);
02541     y ^= (y << 7) & 0x9d2c5680UL;
02542     y ^= (y << 15) & 0xefc60000UL;
02543     y ^= (y >> 18);
02544 
02545     return y;
02546 }
02547 
02548 
02549 long genrand_int31(void)
02550 {
02551     unsigned long y;
02552 
02553     if (--nleft == 0) next_state();
02554     y = *next++;
02555 
02556     
02557     y ^= (y >> 11);
02558     y ^= (y << 7) & 0x9d2c5680UL;
02559     y ^= (y << 15) & 0xefc60000UL;
02560     y ^= (y >> 18);
02561 
02562     return (long)(y>>1);
02563 }
02564 
02565 
02566 double genrand_real1(void)
02567 {
02568     unsigned long y;
02569 
02570     if (--nleft == 0) next_state();
02571     y = *next++;
02572 
02573     
02574     y ^= (y >> 11);
02575     y ^= (y << 7) & 0x9d2c5680UL;
02576     y ^= (y << 15) & 0xefc60000UL;
02577     y ^= (y >> 18);
02578 
02579     return (double)y * (1.0/4294967295.0); 
02580      
02581 }
02582 
02583 
02584 double genrand_real2(void)
02585 {
02586     unsigned long y;
02587 
02588     if (--nleft == 0) next_state();
02589     y = *next++;
02590 
02591     
02592     y ^= (y >> 11);
02593     y ^= (y << 7) & 0x9d2c5680UL;
02594     y ^= (y << 15) & 0xefc60000UL;
02595     y ^= (y >> 18);
02596 
02597     return (double)y * (1.0/4294967296.0); 
02598     
02599 }
02600 
02601 
02602 double genrand_real3(void)
02603 {
02604     unsigned long y;
02605 
02606     if (--nleft == 0) next_state();
02607     y = *next++;
02608 
02609     
02610     y ^= (y >> 11);
02611     y ^= (y << 7) & 0x9d2c5680UL;
02612     y ^= (y << 15) & 0xefc60000UL;
02613     y ^= (y >> 18);
02614 
02615     return ((double)y + 0.5) * (1.0/4294967296.0); 
02616     
02617 }
02618 
02619 
02620 double genrand_res53(void) 
02621 { 
02622     unsigned long a=genrand_int32()>>5, b=genrand_int32()>>6; 
02623     return(a*67108864.0+b)*(1.0/9007199254740992.0); 
02624 } 
02625 
02626 
02627 
02628 
02629 
02630