From 75f77481a03769e445b27ebabbf257fb1383a968 Mon Sep 17 00:00:00 2001 From: jzmaddock Date: Fri, 18 Oct 2019 17:58:31 +0100 Subject: [PATCH] Update Lanczos generator program. Add lanczos approximations for multiprecision types up to 100 digit precision. Add tests for new approximations. --- .../boost/math/special_functions/lanczos.hpp | 1973 ++++++++++++++++- test/Jamfile.v2 | 1 + test/test_1F1.cpp | 2 +- test/test_gamma_mp.cpp | 179 ++ test/tgamma_mp_data.hpp | 417 ++++ tools/lanczos_generator.cpp | 925 +++++++- 6 files changed, 3451 insertions(+), 46 deletions(-) create mode 100644 test/test_gamma_mp.cpp create mode 100644 test/tgamma_mp_data.hpp diff --git a/include/boost/math/special_functions/lanczos.hpp b/include/boost/math/special_functions/lanczos.hpp index 8f506ae13..d37b17143 100644 --- a/include/boost/math/special_functions/lanczos.hpp +++ b/include/boost/math/special_functions/lanczos.hpp @@ -1244,6 +1244,1971 @@ struct lanczos24m113 : public mpl::int_<113> static double g(){ return 20.3209821879863739013671875; } }; +// +// Lanczos Coefficients for N=32 G=2.1471552819013595581054687500000000000000000e+01 +// Max experimental error (with 40 digit precision arithmetic) 4.3871855787077623312177313715826599434111453e-39 +// Generated with compiler: Microsoft Visual C++ version 14.2 on Win32 at Oct 14 2019 +// Type precision was 134 bits or 43 max_digits10 +// +struct lanczos32MP : public mpl::int_<134> +{ + template + static T lanczos_sum(const T& z) + { + static const T num[32] = { + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.5570588792269726580426965328821299006241260e+42)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 2.1774633762992816326945208100096848962840570e+42)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.4729248542870148408945035000721777267825674e+42)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 6.4187209355291098195390045608656819929546438e+41)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 2.0248306413899929430368029054268103901281039e+41)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 4.9257678361460200143521812997589499752976231e+40)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 9.6124719365239930504906027891035869583753288e+39)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.5454747713027643957043517109001371929077089e+39)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 2.0864696676761302003121425399683010735367223e+38)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 2.3986590841584046388095075457448938071498037e+37)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 2.3730272176307717941787236450736722205208718e+36)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 2.0364763054036420066290166982737191399230330e+35)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.5251577656813796428428395564637209124879141e+34)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.0012588845037002389721073745460292782912025e+33)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 5.7802279869271138404361989987596881149322644e+31)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 2.9402720678039082125732480764868685957396877e+30)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.3191712125257631604053220568076491847333218e+29)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 5.2201606453728489193256459039591784247070127e+27)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.8201383870559727838136908091985005180163020e+26)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 5.5806105013691586921928194185346247254008596e+24)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.4998261429327606587262540663611193050275961e+23)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 3.5175518216952441498193267690845732518664615e+21)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 7.1558306683405617426954019692046993902758157e+19)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.2526529449739780296036175515849964203851625e+18)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.8671408513624251160128760408315369701624440e+16)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 2.3367482193223363697833634493247948824157616e+14)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 2.4092037586229976036163287167214501623150351e+12)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.9923609136198492516415716991452463530279321e+10)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.2704580842864713292739934791084236962038214e+08)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 5.8637257952414489194330242306329389356743799e+05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.7432900891411285513294395078026439443163899e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 2.5066282746310005024157652848110452530069853e+00)) + }; + static const T denom[32] = { + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 0.0000000000000000000000000000000000000000000e+00)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 2.6525285981219105863630848000000000000000000e+32)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.0596817613895338599493271552000000000000000e+33)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.9028937852409282099982165606400000000000000e+33)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 2.0707922020245946836608666419200000000000000e+33)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.5477949752547197371117812531200000000000000e+33)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 8.5189988850542311250318425141248000000000000e+32)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 3.6093078815883681280561453887897600000000000e+32)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.2136536667474513652307465210240000000000000e+32)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 3.3114629767614997850763390570240000000000000e+31)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 7.4541614716906607001396551577600000000000000e+30)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.4019376240868075016911422397440000000000000e+30)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 2.2245742324696206305840307600000000000000000e+29)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 3.0006513636556697864066736800000000000000000e+28)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 3.4602661104938986779113940000000000000000000e+27)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 3.4256361393293766065270064000000000000000000e+26)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 2.9197210605623737977801375000000000000000000e+25)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 2.1458832493345014521397750000000000000000000e+24)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.3605580871196332287117500000000000000000000e+23)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 7.4359416261117272348550000000000000000000000e+21)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 3.4960054586805754087500000000000000000000000e+20)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.4090257524223082475000000000000000000000000e+19)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 4.8433867667953267500000000000000000000000000e+17)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.4097793282984515000000000000000000000000000e+16)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 3.4409270792812500000000000000000000000000000e+14)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 6.9491892473250000000000000000000000000000000e+12)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.1400943144500000000000000000000000000000000e+11)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.4803212690000000000000000000000000000000000e+09)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.4631225000000000000000000000000000000000000e+07)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.0338500000000000000000000000000000000000000e+05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 4.6500000000000000000000000000000000000000000e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.0000000000000000000000000000000000000000000e+00)) + }; + return boost::math::tools::evaluate_rational(num, denom, z); + } + + template + static T lanczos_sum_expG_scaled(const T& z) + { + static const T num[32] = { + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 7.3676354398462675075959984137356365580662550e+32)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.0303243219777652371982632367487187515581930e+33)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 6.9695330738315109132895792451395673621363046e+32)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 3.0371873841126513851737915789350097633065208e+32)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 9.5810211111592336765499877083050083223251925e+31)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 2.3307571834445765987280306477823996158240302e+31)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 4.5483950445870222746510194590139013118104375e+30)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 7.3128221728465167159919234074383914011057504e+29)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 9.8726824481851158990505892727571391497920715e+28)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.1349889148269349577271512140093856701260605e+28)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.1228605200219708164439121714303738845598879e+27)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 9.6361256470584159095341545227609851733775758e+25)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 7.2166868932853575755146911619588166896783547e+24)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 4.7377209303689212354445666628772172811909754e+23)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 2.7350675774071094836814884499810988826239303e+22)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.3912674066825924538916027148038869739001663e+21)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 6.2420070983154004111449116807024523016395065e+19)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 2.4700569185690640515452949188152438288912426e+18)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 8.6124656329989777592191745322776627796111867e+16)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 2.6406132905056437989704993228158312134178284e+15)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 7.0968236279962512789710882617045613206867906e+13)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.6644225731453470304909038926424696324288813e+12)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 3.3859703275819088757835059385783332958674837e+10)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 5.9272583422150418041465884118526583443207265e+08)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 8.8348702102467259218213323557081872404861389e+06)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.1056941535328594779262418139203368431235554e+05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.1399784061251411774918201133708617903068477e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 9.4273820161750809875685215118516360445304050e+00)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 6.0115080627363704378364976159119115750197259e-02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 2.7745767713042344487490571988087795152219347e-04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 8.2488376091888795863984895909744485000401866e-07)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.1860773896913111295543391748504025973928588e-09)) + }; + static const T denom[32] = { + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 0.0000000000000000000000000000000000000000000e+00)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 2.6525285981219105863630848000000000000000000e+32)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.0596817613895338599493271552000000000000000e+33)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.9028937852409282099982165606400000000000000e+33)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 2.0707922020245946836608666419200000000000000e+33)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.5477949752547197371117812531200000000000000e+33)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 8.5189988850542311250318425141248000000000000e+32)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 3.6093078815883681280561453887897600000000000e+32)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.2136536667474513652307465210240000000000000e+32)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 3.3114629767614997850763390570240000000000000e+31)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 7.4541614716906607001396551577600000000000000e+30)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.4019376240868075016911422397440000000000000e+30)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 2.2245742324696206305840307600000000000000000e+29)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 3.0006513636556697864066736800000000000000000e+28)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 3.4602661104938986779113940000000000000000000e+27)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 3.4256361393293766065270064000000000000000000e+26)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 2.9197210605623737977801375000000000000000000e+25)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 2.1458832493345014521397750000000000000000000e+24)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.3605580871196332287117500000000000000000000e+23)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 7.4359416261117272348550000000000000000000000e+21)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 3.4960054586805754087500000000000000000000000e+20)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.4090257524223082475000000000000000000000000e+19)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 4.8433867667953267500000000000000000000000000e+17)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.4097793282984515000000000000000000000000000e+16)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 3.4409270792812500000000000000000000000000000e+14)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 6.9491892473250000000000000000000000000000000e+12)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.1400943144500000000000000000000000000000000e+11)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.4803212690000000000000000000000000000000000e+09)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.4631225000000000000000000000000000000000000e+07)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.0338500000000000000000000000000000000000000e+05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 4.6500000000000000000000000000000000000000000e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.0000000000000000000000000000000000000000000e+00)) + }; + return boost::math::tools::evaluate_rational(num, denom, z); + } + + + template + static T lanczos_sum_near_1(const T& dz) + { + static const T d[31] = { + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 7.8968008940705433227909677660515993038374841e+00)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, -5.6618604605116020762015754929520236835404324e+01)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.8292545018854689128055824823953561237213555e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, -3.5208766506452851610872857905478685024504482e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 4.4977346993761774005199362646328436255151093e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, -4.0215319141694562206816207245107490261482447e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 2.5868485920551737806269221936902170855620396e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, -1.2119342552650938943400026113911660156093453e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 4.1418202444782049081885117917390551996878611e+01)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, -1.0248307330153472190143848702750491768975848e+01)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.8061053255438937388879028538451417962537674e+00)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, -2.2080708594510418170142862951931773430228843e-01)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.8014009027542132302057253782788244298905648e-02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, -9.2759167304556987616725030218164051987480377e-04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 2.7821648880614102293660548885638379600357589e-05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, -4.3159048716588863974468231104830412871370083e-07)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 2.8802059531699177780993451552740605512217594e-09)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, -6.0864938064916182822437411537845427325953853e-12)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 2.3077465050230400693183749778781074723249743e-15)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, -4.4535910089559609770590606433653482492203612e-20)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.8463914918024931651359730176750702440539677e-26)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, -2.6476799036488876225768641543721151210680141e-26)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 2.9859528302828214478942827717619270410965131e-26)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, -2.4164337794361162374639737594212065825014909e-26)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.4264219556008516021575829429243024924344353e-26)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, -6.3654171220500680155015450276084381767112451e-27)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 2.1771337070979387873887155215691051891368210e-27)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, -5.6130349210382862255475637378026742528052158e-28)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.0357425223049510242618626197816013695138258e-28)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, -1.2237222565117372586662393874248709023486029e-29)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 6.9653890134419774710417169916706146555543512e-31)) + }; + T result = 0; + for (unsigned k = 1; k <= sizeof(d) / sizeof(d[0]); ++k) + { + result += (-d[k - 1] * dz) / (k * dz + k * k); + } + return result; + } + + template + static T lanczos_sum_near_2(const T& dz) + { + static const T d[31] = { + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 6.8235732906799716623552488416933899152528589e+01)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, -4.8923760814221749411260475309979161560716608e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.5806466857096723284428938485933849993255433e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, -3.0423661676922237999255010522403805001149858e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 3.8864627302775745934819737805015890258069096e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, -3.4749790611725489418874785394046879079002711e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 2.2352787155916216728704971718263237763940956e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, -1.0472243539148225143721882968062403836164182e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 3.5789194097878442125894349247978066638013227e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, -8.8554944097961585263202464603716331582929738e+01)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.5606436359298279012809323203777498460831161e+01)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, -1.9079793884371809023191793438331090550554931e+00)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.5565785753912199592703963702155052413697331e-01)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, -8.0152581402976896653242934862478024763161144e-03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 2.4040502318727807490297102100258877023641629e-04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, -3.7293447818191967510645955265996052825799609e-06)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 2.4887668661450911754046983982188022868005334e-08)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, -5.2592989400365993333512441603746877766052195e-11)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.9941084528494632503325323388230135305735007e-14)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, -3.8483184600922127060811720536956793306527275e-19)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.5954546450654998035263505446322855520450213e-25)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, -2.2878426485811911877035106634321308368820032e-25)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 2.5801420414749176901982573044724995471338101e-25)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, -2.0880244059892646868604082519013410844174147e-25)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.2325617535559095736858057307295434296584568e-25)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, -5.5003147275337403154295953682157801293504851e-26)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 1.8812468002260686540475204400230633058447779e-26)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, -4.8501862565143035234095815929073455137122638e-27)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 8.9497824575117543406738759847704395400692055e-28)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, -1.0574102876284982539299549303708483236373651e-28)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 134, 6.0187464606086614102031360043044718659169199e-30)), + }; + T result = 0; + T z = dz + 2; + for (unsigned k = 1; k <= sizeof(d) / sizeof(d[0]); ++k) + { + result += (-d[k - 1] * dz) / (z + k * z + k * k - 1); + } + return result; + } + + static double g() { return 2.1471552819013595581054687500000000000000000e+01; } +}; + +// +// Lanczos Coefficients for N=35 G=2.96640371531248092651367187500000000000000000000000000e+01 +// Max experimental error (with 50 digit precision arithmetic) 67eps +// Generated with compiler: Microsoft Visual C++ version 14.2 on Win32 at Oct 14 2019 +// Type precision was 168 bits or 53 max_digits10 +// +struct lanczos35MP : public mpl::int_<168> +{ + template + static T lanczos_sum(const T& z) + { + static const T num[35] = { + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 2.17215050716253100021302249837728942659410271586236104e+50)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 2.51055117651708470336913962553466820524801246971658127e+50)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.40813458996718289733677017073036013655624930344397267e+50)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 5.10569518324826607478187974291222641098997506635019681e+49)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.34502197565331471178368569687788687058240547971732391e+49)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 2.74311603169690571192608960963509140372217014888512918e+48)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 4.50656021978234091874071935392175934984492682009447097e+47)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 6.12703102551730381018400796362603958419580969330315139e+46)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 7.02844698442195350077632196816248435420923619452768200e+45)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 6.90106767379334717236568166816961185224083190775430842e+44)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 5.86371531667026447746284883480888667804130713757839681e+43)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 4.34808948517797782155274346690360992144536507118093783e+42)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 2.83232124439938458545786668616393415008373341980153072e+41)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.62895707563068512468013948922815298700909218398406635e+40)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 8.30384063116420066671650072267242339695473078925159324e+38)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 3.76258309689585811716178198120267186946262194080905971e+37)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.51837231299916455171135124843484994848995300472356341e+36)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 5.46324357690180919340289798257560253430931750807924001e+34)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.75333853376321853646128997503611223620394342435525484e+33)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 5.01719517877315910652307531002686423847077617217874485e+31)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.27861878894319497853745513558138184450369083409359360e+30)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 2.89640024726662067702004632718605032785787967237099607e+28)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 5.81537701811791870172286588846619085013138846074815251e+26)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.03090758312551459302562064161308518889144037164899961e+25)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.60538569869661647274451913615710409703905629234367906e+23)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 2.18176163448730621246454091850022844174919234685832508e+21)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 2.56586635256765282348264053213197702964352373258511008e+19)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 2.58289895656990946427745668670352144404744258615044371e+17)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 2.19373478903102411154024309088124853938046967389531861e+15)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.54192605870424877025476980158698548681325282029269310e+13)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 8.73027427579217615249706012469272147499107562412573337e+10)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 3.82675918536460865549992482360500962016208597062710654e+08)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.21869956201943834772161655315196962519434419814106818e+06)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 2.50897418653428667959996348205296461689142907811767371e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 2.50662827463100050241576528481104525300698674060984055e+00)) + }; + static const T denom[35] = { + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 0.00000000000000000000000000000000000000000000000000000e+00)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 8.68331761881188649551819440128000000000000000000000000e+36)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 3.55043336733310191803732770947072000000000000000000000e+37)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 6.55728779174162547080350866368102400000000000000000000e+37)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 7.37352350419052295388404251629977600000000000000000000e+37)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 5.72117566475005542296335706764492800000000000000000000e+37)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 3.28417720643003773414159612967554252800000000000000000e+37)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.45822739485943139719482682477713244160000000000000000e+37)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 5.16476527817201997988283152951021977600000000000000000e+36)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.49225481668254064104679479029764121600000000000000000e+36)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 3.57726463942545496998486904826347776000000000000000000e+35)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 7.20859297660335343156864734965859840000000000000000000e+34)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.23364307820330543590375511999050240000000000000000000e+34)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.80750015058176473779293385245398400000000000000000000e+33)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 2.28183125026789051815954180232544000000000000000000000e+32)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 2.49437224233918151570015089338400000000000000000000000e+31)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 2.37000480501772121324931003824000000000000000000000000e+30)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.96258640868140652967646352465000000000000000000000000e+29)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.41894262447739018035536664650000000000000000000000000e+28)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 8.96452376168568744680811480000000000000000000000000000e+26)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 4.94875410890088264440962800000000000000000000000000000e+25)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 2.38478815149246067334598000000000000000000000000000000e+24)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.00124085806115519088380000000000000000000000000000000e+23)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 3.65117470518809938644000000000000000000000000000000000e+21)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.15145312544238764840000000000000000000000000000000000e+20)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 3.12192419709374919000000000000000000000000000000000000e+18)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 7.22038661704031100000000000000000000000000000000000000e+16)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.40979763670090400000000000000000000000000000000000000e+15)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 2.29191290647440000000000000000000000000000000000000000e+13)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 3.04437176604000000000000000000000000000000000000000000e+11)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 3.21763644400000000000000000000000000000000000000000000e+09)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 2.60169360000000000000000000000000000000000000000000000e+07)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.51096000000000000000000000000000000000000000000000000e+05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 5.61000000000000000000000000000000000000000000000000000e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.00000000000000000000000000000000000000000000000000000e+00)) + }; + return boost::math::tools::evaluate_rational(num, denom, z); + } + + template + static T lanczos_sum_expG_scaled(const T& z) + { + static const T num[35] = { + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 2.84421398435712762388902267099927585742388886580864424e+37)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 3.28731583799033736725852757551292030085556435695468295e+37)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.84381150359300352571680869181416248982215282642834936e+37)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 6.68539753215772969226355064737523321566208288321687448e+36)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.76117184320624276162478300964159399462275652881271996e+36)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 3.59183627116994441494601110756468114877940946273012852e+35)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 5.90089018057779871758440184258134151304912092733579104e+34)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 8.02273473587728940068021671629793244969348874651645551e+33)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 9.20304883823127369598764418881022021049206245678741573e+32)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 9.03625836242722113759123056762610636251641913153595812e+31)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 7.67794913334462808923359541498599600753842936204419932e+30)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 5.69338859264140114791649895977363900871692586779302150e+29)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 3.70864158121145435408364940074910197916145829346031858e+28)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 2.13295647753179115743895667847873122731507276407230715e+27)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.08730493440263847356723847541024859440843056640671533e+26)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 4.92672649809905793239714364398097142490510744815940192e+24)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.98815678372776973689475889094271298156568135487559824e+23)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 7.15357141696015228406471054927723105303656292491717836e+21)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 2.29582156512528703674984172534752222415664014582498353e+20)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 6.56951562180494343732211791410530161839249714612303326e+18)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.67422350715677024140556410421772283993277946880053914e+17)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 3.79254663081905790190270601146772274854974105071798035e+15)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 7.61465496276608608941993297108655885737613121720232292e+13)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.34987044168298086318822469739196823360923972361455073e+12)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 2.10209211537761991333937729340544738747931371426736883e+10)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 2.85679879496413826670691454915567101976631415248412906e+08)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 3.35974553231926272707704478737590721340254406209650188e+06)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 3.38204802486455055334129565820015244464343854444712513e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 2.87247644413155087645140975008088533286977710080244249e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 2.01899805954981363917258740277358024893572331522514601e+00)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.14314215799519834172753514406176454576793263619287700e-02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 5.01075867159821346256470334018168931185179114379271616e-05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.59576526838074751422330690168945437827562833198707558e-07)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 3.28525092722679899458094768960179796663588010298597603e-10)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 3.28217919006153582429216342066702743329957749672852350e-13)) + }; + static const T denom[35] = { + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 0.00000000000000000000000000000000000000000000000000000e+00)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 8.68331761881188649551819440128000000000000000000000000e+36)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 3.55043336733310191803732770947072000000000000000000000e+37)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 6.55728779174162547080350866368102400000000000000000000e+37)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 7.37352350419052295388404251629977600000000000000000000e+37)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 5.72117566475005542296335706764492800000000000000000000e+37)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 3.28417720643003773414159612967554252800000000000000000e+37)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.45822739485943139719482682477713244160000000000000000e+37)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 5.16476527817201997988283152951021977600000000000000000e+36)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.49225481668254064104679479029764121600000000000000000e+36)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 3.57726463942545496998486904826347776000000000000000000e+35)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 7.20859297660335343156864734965859840000000000000000000e+34)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.23364307820330543590375511999050240000000000000000000e+34)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.80750015058176473779293385245398400000000000000000000e+33)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 2.28183125026789051815954180232544000000000000000000000e+32)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 2.49437224233918151570015089338400000000000000000000000e+31)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 2.37000480501772121324931003824000000000000000000000000e+30)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.96258640868140652967646352465000000000000000000000000e+29)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.41894262447739018035536664650000000000000000000000000e+28)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 8.96452376168568744680811480000000000000000000000000000e+26)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 4.94875410890088264440962800000000000000000000000000000e+25)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 2.38478815149246067334598000000000000000000000000000000e+24)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.00124085806115519088380000000000000000000000000000000e+23)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 3.65117470518809938644000000000000000000000000000000000e+21)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.15145312544238764840000000000000000000000000000000000e+20)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 3.12192419709374919000000000000000000000000000000000000e+18)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 7.22038661704031100000000000000000000000000000000000000e+16)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.40979763670090400000000000000000000000000000000000000e+15)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 2.29191290647440000000000000000000000000000000000000000e+13)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 3.04437176604000000000000000000000000000000000000000000e+11)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 3.21763644400000000000000000000000000000000000000000000e+09)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 2.60169360000000000000000000000000000000000000000000000e+07)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.51096000000000000000000000000000000000000000000000000e+05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 5.61000000000000000000000000000000000000000000000000000e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.00000000000000000000000000000000000000000000000000000e+00)) + }; + return boost::math::tools::evaluate_rational(num, denom, z); + } + + + template + static T lanczos_sum_near_1(const T& dz) + { + static const T d[34] = { + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.09112391094335813989230740596164619994797033481760301e+01)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, -1.11095925828443504625574261745581427703630213518975734e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 5.25795762399049096970854782036824945808150003653799701e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, -1.53596813364794430843820749839089482856771473577902136e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 3.10150518856225197104044336968686219568570379161186763e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, -4.59440015012604275008985164760189204399872934212169290e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 5.17182126100715726914905437099855137991832224176746144e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, -4.52194070233963020921586697582404279809725757428225907e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 3.11287192546142126817144783716567250328231623970392395e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, -1.70029010284498269942986238607675315541449827223720491e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 7.39359986548869257712075354365607803246217579350731025e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, -2.55857186796151318525331772210231419636656738702520247e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 7.01976508569781091139272219093293962106866776273944401e+01)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, -1.51622799316222576708968190643735578161547893435503117e+01)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 2.55114022296440557292153472011659421232773792851704649e+00)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, -3.29558714084043876803654097222727620781593122323144986e-01)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 3.20655790191462561334686083455624901268509187198531392e-02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, -2.29211265190736317625627743320462821391020598683096969e-03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.16547271274032555838193953745182811226836340887412893e-04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, -4.04158977282328622262713955181985365200737836471868621e-06)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 9.04099527601588222217706879074903022432460969180041885e-08)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, -1.21026124816545340223909137077288908237190834054935310e-09)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 8.73486546143800890651761116982457576405090186184403710e-12)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, -2.92426051924806467732549205594664201603409972582813132e-14)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 3.61340208721806452778722682494918504979435178283255061e-17)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, -1.13517996614037348212434679983945901825382670014683797e-20)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 4.61930266547148210568279523485628689044657261784716591e-25)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, -5.78463508004708787795311937422590618909194917033730955e-31)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, -1.53568640059658459444865728826184250691297909350787934e-35)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 6.63117406343686364701920733651409741863929155565374940e-36)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, -2.02296711810469513023726896410540806344003955071812851e-36)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 4.05776322342042086937257880311088879198393056129493081e-37)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, -4.82527152907979058393765521600344474439209706209233775e-38)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 2.61571352467214817635971061532522193500863154360283722e-39)) + }; + T result = 0; + for (unsigned k = 1; k <= sizeof(d) / sizeof(d[0]); ++k) + { + result += (-d[k - 1] * dz) / (k * dz + k * k); + } + return result; + } + + template + static T lanczos_sum_near_2(const T& dz) + { + static const T d[34] = { + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.27149725743552824677345467452765724462183747425698430e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, -1.29461157973340118022513089366929246812794440622918275e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 6.12714892558448280578038020250503421879861075137953016e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, -1.78987853703364598882843888232934449281930468883391335e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 3.61421402429854740596701737352164170551274801368708941e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, -5.35389897687788587032725281528384185518833066402901114e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 6.02677338784735277115375432621012998338558552597357336e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, -5.26946128083650646734645560602832582368091536233949979e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 3.62745979285730759140267927796734683888575236461558969e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, -1.98136451866684089001192332403279162096332022571108845e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 8.61583350640418693864271497678443168377071451407567658e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, -2.98152856924573421857895007425890467500099537012952122e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 8.18020021813066494304354702578430478815286552616366363e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, -1.76687516020609325102781997617812558189956529947937455e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 2.97286840137911020382328323869139629696357829352821391e+01)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, -3.84037960234558373817068181823488833809395626348103188e+00)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 3.73663296826451629159939759241902446349258313114071094e-01)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, -2.67102106498038196040637483025426329160024817197530409e-02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.35813663599770253165594840156807550072235435724240491e-03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, -4.70970369202279764117806847443483943084782006868895857e-05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.05355593279987378383061490338957570599931723523376630e-06)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, -1.41032914996100466638712258076005313289749145071459453e-08)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 1.01788232911919897659739133018267424364933824143275367e-10)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, -3.40766909510419913528326529229511125941552363401838743e-13)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 4.21073243637136845906400015214174112719748429942427344e-16)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, -1.32283620509730411652267827642614145629073466029279697e-19)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 5.38291811911040907926983774874091831690977569145002154e-24)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, -6.74089126429842876230950047383862474772290970041867579e-30)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, -1.78955023078122126762117283369038212754061385626732316e-34)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 7.72737133764019622888917725972972138033556721960526187e-35)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, -2.35738316863436492576730648996735973692694426493195922e-35)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 4.72855077059130427852097715321796484769785970590691282e-36)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, -5.62293563001680479553446157798018614684701661703654843e-37)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 168, 3.04811629504314504274190599430387363985052709041515655e-38)), + }; + T result = 0; + T z = dz + 2; + for (unsigned k = 1; k <= sizeof(d) / sizeof(d[0]); ++k) + { + result += (-d[k - 1] * dz) / (z + k * z + k * k - 1); + } + return result; + } + + static double g() { return 2.96640371531248092651367187500000000000000000000000000e+01; } +}; + +// +// Lanczos Coefficients for N=48 G=2.880805098265409469604492187500000000000000000000000000000000000e+01 +// Max experimental error (with 60-digit precision arithmetic) 51eps +// Generated with compiler: Microsoft Visual C++ version 14.2 on Win32 at Oct 14 2019 +// Type precision was 201 bits or 63 max_digits10 +// +struct lanczos48MP : public mpl::int_<201> +{ + template + static T lanczos_sum(const T& z) + { + static const T num[48] = { + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 5.761757987425932419978923296640371540367427757167447418730589877e+70)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 8.723233313564421930629677035555276136256253817229396631458438691e+70)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 6.460052620548943146316510839385235752729444155384745952604400014e+70)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 3.118620599704657143233902039524163888476114389296433891234019212e+70)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.103553323924588863191816202847384353588419783622786374048756587e+70)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 3.051624469576894078907076790635986076815810433950937821174281248e+69)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 6.865434054315747674202246332480484800778071304068935338977820344e+68)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.291785980379681713553231795767203835753576510251486784293089714e+68)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 2.073927196464385740270105346713079967925505577692095446860826790e+67)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 2.884317172328855613403642857232246924724496526520223674336243586e+66)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 3.515983058669346491005379681336434957516572863544374020968683717e+65)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 3.791988252541273516986153564408477102509671668999707480365384945e+64)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 3.645764905652320236264233988360776875326874810201273735655153182e+63)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 3.144135487589921315512939394666974184673239886993573956770438389e+62)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 2.444700846549614719681016920231266383188819427952261902403138865e+61)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.721099093953481665535866508692670759355705777392277743203856663e+60)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.100969797434901880312682514502493221610943693861105392844971160e+59)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 6.418121506159806547634040503980950792234471035467217702752406105e+57)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 3.417864259432558812733518752689742288284271989351444645566759428e+56)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.665995533734965936996397899459612023184583125575089834552055942e+55)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 7.444766925649844009950058690449625999301860892596426461258095232e+53)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 3.053637791492838551734963920042182131006240650838206322215619662e+52)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.150696853422753584935226676401667305978026730065639035499393518e+51)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 3.985976091763077924792684854305586783380530313659602423780141188e+49)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.269589095786672590317833654141210781129738119237951536741077115e+48)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 3.718300118825405526804849893058410300716988331091767076237827497e+46)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.001037055130874457401651655102738871459032839441218104652569066e+45)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 2.475842513986568687160423191409256650108932454810648362428602348e+43)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 5.620452049086499203878684285356863241396518483154492676811559133e+41)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.169661026157169583693125067814111812572434991018171004040405784e+40)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 2.227918466522161929152413190031319328201533237960827483146218740e+38)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 3.876388843752351291646654793076860108915313255758699513365393870e+36)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 6.145947758366681136606104191450792163942386660344907590963820717e+34)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 8.853323303407534484800459250019301328433169196161471441696806506e+32)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.154628006575221227908667538321556179086649067527404327882584768e+31)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.357526820024103486396860374714568600536209103260198100884104997e+29)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.431529899588725297356982438015035066854198997921929156832870645e+27)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.345565129287503320724079046959642760096964859126850291147857935e+25)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.118851309483567225684739040233675455708538654675741148330404763e+23)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 8.153371780240325463304870847387326315142505274277395976930776452e+20)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 5.146212685927632120682088036018035709941745020823689824280902727e+18)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 2.771109638413640784841091904266004758198074452790973613270876444e+16)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.247775743837944205683004431867637625466576857881195465700397478e+14)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 4.570311375510395966207715903995528566489264305503840005145629111e+11)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.307932649387240491969419239876926639445902586258953887216911993e+09)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 2.743144608535924824275750439447323876880302369055576390115394778e+06)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 3.749690888961891063146468955091435916957208840312184463551812828e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 2.506628274631000502415765284811045253006986740609938316629929233e+00)) + }; + static const T denom[48] = { + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 0.000000000000000000000000000000000000000000000000000000000000000e+00)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 5.502622159812088949850305428800254892961651752960000000000000000e+57)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 2.430336111272256671478593169569751383305061494947840000000000000e+58)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 4.920361290698585974808779016476219830728024276336640000000000000e+58)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 6.149178946896205138947217427059336370288899808821248000000000000e+58)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 5.374105269656119699331051574067858017333550280343552000000000000e+58)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 3.521316226597066883749849655326023294027593332332429312000000000e+58)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.808864152650289891915479515152146571014320216782405632000000000e+58)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 7.514810409642252571378917003183814999063638859346214912000000000e+57)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 2.583350992233550434239775839017811699814141926043903590400000000e+57)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 7.478403249251559174520099458337662519939088809134875607040000000e+56)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.848344883280695333961708798743230793633983609036568330240000000e+56)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 3.943873277267014936040757307088314776495222166971439104000000000e+55)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 7.331069721888505257142927693659482094449571844495257600000000000e+54)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.196124539826947758881834650235619760202156354268084224000000000e+54)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.723744838816127002822609734027860811982593574672547840000000000e+53)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 2.205691767196054136766333529400075228162139411801728000000000000e+52)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 2.517213632743192166819003098472340901249838381523200000000000000e+51)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 2.571722144655713179046526371841394014407124514352640000000000000e+50)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 2.359512744028577584409389641902976782871564427046400000000000000e+49)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.949188285585060392916084953872833077002135851920000000000000000e+48)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.452967188675463645529736303316005271151737332000000000000000000e+47)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 9.790015208782962556675223159728484084908850744000000000000000000e+45)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 5.970673071264242753610155919125826961862567840000000000000000000e+44)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 3.299166890445957751586491053313346243255473500000000000000000000e+43)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.652735578141047520337049888545244673386975000000000000000000000e+42)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 7.508428802270485256066710729742536448661900000000000000000000000e+40)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 3.093294777021479729147119238554967297499000000000000000000000000e+39)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.155176275192359061296447275633302204250000000000000000000000000e+38)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 3.907505708457079284974986712721395225000000000000000000000000000e+36)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.195848283940498442888394846136646210000000000000000000000000000e+35)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 3.305934675041764670409270520636101000000000000000000000000000000e+33)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 8.238840089027488915014959267151000000000000000000000000000000000e+31)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.846167161648076059624793804150000000000000000000000000000000000e+30)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 3.707826341119682695847826052600000000000000000000000000000000000e+28)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 6.648183019818072129964867660000000000000000000000000000000000000e+26)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.059080011923383455919277000000000000000000000000000000000000000e+25)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.490144286132397218940500000000000000000000000000000000000000000e+23)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.838362455658776519186000000000000000000000000000000000000000000e+21)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.970532718044669378600000000000000000000000000000000000000000000e+19)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.814183952293757550000000000000000000000000000000000000000000000e+17)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.413370614847675000000000000000000000000000000000000000000000000e+15)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 9.134958017031000000000000000000000000000000000000000000000000000e+12)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 4.765795079100000000000000000000000000000000000000000000000000000e+10)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.928125650000000000000000000000000000000000000000000000000000000e+08)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 5.675250000000000000000000000000000000000000000000000000000000000e+05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.081000000000000000000000000000000000000000000000000000000000000e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.000000000000000000000000000000000000000000000000000000000000000e+00)) + }; + return boost::math::tools::evaluate_rational(num, denom, z); + } + + template + static T lanczos_sum_expG_scaled(const T& z) + { + static const T num[48] = { + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.775732062655417998910881298714821053061055705608286949609421120e+58)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 2.688437299644448784121592662352787426980194425446481703306505899e+58)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.990941408817264621124181941423397180231807676408175000011574647e+58)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 9.611362716446299768312931282360230566955098878347512701289885826e+57)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 3.401071382066693821667231534775770086983519477562699643517826070e+57)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 9.404885497858970433702192998314287586471872015950314081905843790e+56)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 2.115877029354588030985670444733795075439494699793733843615128537e+56)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 3.981190790128533233774351539949086864384527026303253658346042487e+55)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 6.391693345003088328615594164751621620795026048184784616056424156e+54)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 8.889256530644592752851605934648543064680013184446459552930302708e+53)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.083600502252557317792851907104175947655615832167024966482957198e+53)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.168663303100387254423547467716347840589509950430146037235024663e+52)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.123598327107617380847613820395680616677588511868146055764672247e+51)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 9.689997752127767317102012222013845618089045780981297513260591263e+49)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 7.534390868711924145397558028431517797916157184545344400315049888e+48)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 5.304302698603539256283286371502868034443493795813215278491516590e+47)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 3.393109140624987047793401361048831961769792029208766436336102130e+46)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.978018543190809154654104033779556195143800802618966016721119650e+45)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.053360999285885098804414279382371819392475408561904784568215676e+44)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 5.134477518753880004346650767299407142912151189519394755303948278e+42)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 2.294423222517027804991661400849986263936601088969957809227734095e+41)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 9.411090410120803602405769061472811786006792830932395177026805674e+39)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 3.546364324011365762789375386661337991434000702963811196005801731e+38)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.228448949533845774618310075362255075191314754073111861819975658e+37)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 3.912781600174900095022672513908490962899309128877584272045832513e+35)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.145953154225327686809754524860534768156895534588187817885425867e+34)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 3.085123669861365984774838320924008647858451270384142925874188908e+32)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 7.630367231261397170650842427640465271470437848007390468680241668e+30)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.732182596346604787991836614669276692020582495778773122326853797e+29)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 3.604810530255586389021528105443008249789929772232910820974558737e+27)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 6.866283281281868197964883431828004811500103664332499479032936741e+25)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.194674953754173153419535571352963617418336620849047024493757781e+24)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.894136566262225941799684575793203365634052117390221232065529506e+22)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 2.728530091896234109430773225830735206267902257956559214561779937e+20)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 3.558479853180206010560597094150305393424259777860361999786422123e+18)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 4.183799294403182487629551851184805610521945574359855930862189385e+16)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 4.411871423439005125979602342436157376541872925894678545707600871e+14)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 4.146934230284030660663814250662713645615827253848318877256260252e+12)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 3.448218665084135299794121636822853382005896647323977605040284573e+10)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 2.512810104228409918190743070957013357446861162954554120244345275e+08)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.586025460907685522041021408846741988415862331430490056017676558e+06)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 8.540359114012197595748944623835295064565126012703153392373623351e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 3.845554430040583564794301575257907183920519062724643766057340299e+01)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.408536849955106342184570268692357634552350288861587703063273018e-01)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 4.030953654039823541442226125506893371879437951634029024402619056e-04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 8.454172918244607114802676127860508419821673596398248024962237789e-07)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.155627562127299657410444702080985966726894475302009989071093439e-09)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 7.725246714864934496649491688787278190129598018071339049048385845e-13)) + }; + static const T denom[48] = { + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 0.000000000000000000000000000000000000000000000000000000000000000e+00)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 5.502622159812088949850305428800254892961651752960000000000000000e+57)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 2.430336111272256671478593169569751383305061494947840000000000000e+58)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 4.920361290698585974808779016476219830728024276336640000000000000e+58)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 6.149178946896205138947217427059336370288899808821248000000000000e+58)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 5.374105269656119699331051574067858017333550280343552000000000000e+58)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 3.521316226597066883749849655326023294027593332332429312000000000e+58)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.808864152650289891915479515152146571014320216782405632000000000e+58)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 7.514810409642252571378917003183814999063638859346214912000000000e+57)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 2.583350992233550434239775839017811699814141926043903590400000000e+57)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 7.478403249251559174520099458337662519939088809134875607040000000e+56)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.848344883280695333961708798743230793633983609036568330240000000e+56)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 3.943873277267014936040757307088314776495222166971439104000000000e+55)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 7.331069721888505257142927693659482094449571844495257600000000000e+54)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.196124539826947758881834650235619760202156354268084224000000000e+54)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.723744838816127002822609734027860811982593574672547840000000000e+53)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 2.205691767196054136766333529400075228162139411801728000000000000e+52)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 2.517213632743192166819003098472340901249838381523200000000000000e+51)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 2.571722144655713179046526371841394014407124514352640000000000000e+50)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 2.359512744028577584409389641902976782871564427046400000000000000e+49)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.949188285585060392916084953872833077002135851920000000000000000e+48)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.452967188675463645529736303316005271151737332000000000000000000e+47)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 9.790015208782962556675223159728484084908850744000000000000000000e+45)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 5.970673071264242753610155919125826961862567840000000000000000000e+44)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 3.299166890445957751586491053313346243255473500000000000000000000e+43)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.652735578141047520337049888545244673386975000000000000000000000e+42)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 7.508428802270485256066710729742536448661900000000000000000000000e+40)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 3.093294777021479729147119238554967297499000000000000000000000000e+39)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.155176275192359061296447275633302204250000000000000000000000000e+38)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 3.907505708457079284974986712721395225000000000000000000000000000e+36)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.195848283940498442888394846136646210000000000000000000000000000e+35)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 3.305934675041764670409270520636101000000000000000000000000000000e+33)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 8.238840089027488915014959267151000000000000000000000000000000000e+31)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.846167161648076059624793804150000000000000000000000000000000000e+30)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 3.707826341119682695847826052600000000000000000000000000000000000e+28)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 6.648183019818072129964867660000000000000000000000000000000000000e+26)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.059080011923383455919277000000000000000000000000000000000000000e+25)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.490144286132397218940500000000000000000000000000000000000000000e+23)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.838362455658776519186000000000000000000000000000000000000000000e+21)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.970532718044669378600000000000000000000000000000000000000000000e+19)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.814183952293757550000000000000000000000000000000000000000000000e+17)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.413370614847675000000000000000000000000000000000000000000000000e+15)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 9.134958017031000000000000000000000000000000000000000000000000000e+12)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 4.765795079100000000000000000000000000000000000000000000000000000e+10)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.928125650000000000000000000000000000000000000000000000000000000e+08)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 5.675250000000000000000000000000000000000000000000000000000000000e+05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.081000000000000000000000000000000000000000000000000000000000000e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.000000000000000000000000000000000000000000000000000000000000000e+00)) + }; + return boost::math::tools::evaluate_rational(num, denom, z); + } + + + template + static T lanczos_sum_near_1(const T& dz) + { + static const T d[47] = { + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.059629332377126683204423480567078764834299559082175332563440691e+01)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -1.045539783916612448318159279915745234781500064405838259582295756e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 4.784116147862702971548198855631720823614071322755242269800139953e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -1.347627123899697763041970836639890836066182746484603984701614322e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 2.616287350264343765684251764154979472791739226517501453422663702e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -3.713882062539651653939339395399443747287004395732955159091898814e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 3.991169606573224259776909844091992693404451938778998047720606365e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -3.317302161605094814956529918647229867233820698992970037871348037e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 2.160243421312714521088457044577429625205805822189897013706603525e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -1.109943233027050100899811890306430189301581767622560123811853152e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 4.510589694767723034579229465791750718722450232983242500655372350e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -1.447631000703120050516586541372187152390222336990410786008441418e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 3.650513815713423478665128697883383003943391843803280033790640056e+01)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -7.169833252147741984016531016457108860830636610643268300442548571e+00)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.082891222574188256195988224106955541928146669677565424595939508e+00)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -1.236107424816170540654753273736991964308279435358993150196240041e-01)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.042295614972976540486053879488442847688158698802215145729595300e-02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -6.301008161384761854991230670333450694872613042265540662425668275e-04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 2.626174700692043436308812511757112824553679923076031241653340508e-05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -7.165638597797307942127436742547456896168876912136407736672893749e-07)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.193760947891421842393017150194414897043594152709554867681454093e-08)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -1.102566205604210639065160857917396944102487766555058309172771685e-10)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 4.915816623470797626925445072607835810426224865943397673652473644e-13)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -8.588275837841705058968991523347781566219989845111381889185487327e-16)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 4.200550301285945062259329336559146630395284987411539369061121774e-19)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -3.164333226683698411437894680594408940426530663957731548446585176e-23)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.066415481671710192926882432742434212829003971627792457166443068e-28)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.794259516500627365643093960688415401054083199354112116216326548e-35)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -4.109766027021453750770079684473469373477285891593627979028234104e-35)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 7.857040454431507009464118652247309465880198950544005451066913133e-35)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -1.257636833252205356462338019252188768182918234805529456629813332e-34)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.657386968948568677903872677704817552898314429680193647771915640e-34)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -1.807368757318279512579151153998249666772948741065806312921477647e-34)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.661046240741398691824399424582067048482718145278248186045239803e-34)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -1.310274358393495831279259654715581878034928245769119610060724565e-34)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 8.979289812994200254512860775692570111131240734486735844065571645e-35)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -5.374132043246630393307108400571746261019561481928368054130159659e-35)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 2.807680467889122570534300256450516518962725443297886143108832476e-35)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -1.273791157694681089776609329544693948790210894828257493359951461e-35)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 4.971177216154470328027539744763226999793762414262864963697237346e-36)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -1.645869582759689501568146144102914403686604774258048281344406053e-36)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 4.533836765077295478897031652308024155740827573708543095934776509e-37)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -1.011071482407693628614243045457397049948479637840391111641112292e-37)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.753334959707221495336088007359122169612976692723773645699626150e-38)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -2.217604773736938924265403811396189809599754278055061061653740309e-39)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.819104328189909539214493755590516594857915205552841395610714917e-40)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -7.261124772729210946163851510369531392121538686694430629664292782e-42)) + }; + T result = 0; + for (unsigned k = 1; k <= sizeof(d) / sizeof(d[0]); ++k) + { + result += (-d[k - 1] * dz) / (k * dz + k * k); + } + return result; + } + + template + static T lanczos_sum_near_2(const T& dz) + { + static const T d[47] = { + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.201442621036266842137537764128372139686555918574926377003612763e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -1.185467427150643969519910927764836582205108528009141221591420898e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 5.424388386017623557963301151646679462091516489317860889362683594e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -1.527983998220780910263892115033927387104053611029099941633323011e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 2.966432728352315714505545454293409301356907573727621630702827634e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -4.210921746972897898551337991192707389898034825880579655985363009e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 4.525319492963037163576188790739239848749059077112768508582824310e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -3.761266399512640929192286468240357629226481512485264527650043412e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 2.449355108314973517543246836489412427594992113516547680523282212e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -1.258490177973741431378782429416242097479994678322390199981700552e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 5.114255088752286384038861754183366335220682008583459292808501983e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -1.641371685961506906939690430062582517060728808639566257675679493e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 4.139072742579462987548668350779672609568514018384674745960251434e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -8.129392978890804438983060711164783076784089453197491087525720250e+01)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.227817717944841986447189375517242505918979312023367060292099051e+01)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -1.401539292067249253713639886818857395065226008969910929456090178e+00)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.181789081601278618540976740818676551399023595924451938057596056e-01)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -7.144290488450459735914078985115746320918090890348935029860425141e-03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 2.977643331768050273059868974450773270172308183228656321879824795e-04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -8.124636941696344229278652214634921673116603924841964381194849043e-06)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.353525462444406600575359080915245707387262742058104197063680358e-07)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -1.250125861423094782405286690199652039727315544398975014264972834e-09)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 5.573714720964717327652547152474097356959063887913062262865877352e-12)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -9.737669879005051560419153179757554889911318336987864449783329044e-15)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 4.762722217636305077074994367900679148917691897585712642440813437e-18)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -3.587825185218585020252537180920386716805319681061835516115435092e-22)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.209136980512837161314713015292452549173388035330975386269996826e-27)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 2.034390508507134900778125110328032318737425888723900242108805840e-34)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -4.659788018772143666295222723749466460348336784193790467337277007e-34)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 8.908571128342935499766722474863105091718059244706787068658556651e-34)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -1.425950044120254934054607924023969978647876123112048584684333719e-33)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.879199908120536747953526966437055347446296944118172532473563579e-33)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -2.049254197314637745167349860869170443784687973315125511356920644e-33)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.883348910945891785870183207161008885784794173754432580579430117e-33)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -1.485632203001929498321635338807138918181560966989477820879657556e-33)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.018101439657813295290872898460623215815148336073781084176896879e-33)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -6.093367832078140478972419022586567008505333455627897676553352131e-34)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 3.183440545955440848970303491445824299419388286256245840846211512e-34)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -1.444266348988579122529259208173467560400718346248315966198898381e-34)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 5.636484383471871096369253024129613184534143941833907586683970329e-35)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -1.866141116496477515961611479835778926021343627571438400431425496e-35)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 5.140613382384541819628458619521408963917801187880958447868987984e-36)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -1.146386132171160390143187663792496413753249459594650450672610453e-36)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 1.987988898740147227778865012441676866493607979490727350027458052e-37)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -2.514393298082843730831623322496784440966181704206301582735570257e-38)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, 2.062560373914843383483799612278119836498689222815662595453851079e-39)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 201, -8.232902310328177520527925464546117674377821202617522000849431630e-41)), + }; + T result = 0; + T z = dz + 2; + for (unsigned k = 1; k <= sizeof(d) / sizeof(d[0]); ++k) + { + result += (-d[k - 1] * dz) / (z + k * z + k * k - 1); + } + return result; + } + + static double g() { return 2.880805098265409469604492187500000000000000000000000000000000000e+01; } +}; +// +// Lanczos Coefficients for N=49 G=3.2804746093749997726263245567679405212402343750000000000000000000000000000e+01 +// Max experimental error (with 60-digit precision arithmetic) 88eps +// Generated with compiler: Microsoft Visual C++ version 14.2 on Win32 at Oct 14 2019 +// Type precision was 234 bits or 73 max_digits10 +// +struct lanczos49MP : public mpl::int_<234> +{ + template + static T lanczos_sum(const T& z) + { + static const T num[49] = { + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.5742499367008530642617319352897520430205552639474773193534726699460038382e+74)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.2055424563420473601452029826557352738661904429902299059433513914586136617e+74)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.5124573975150897396579361228988665521507891014129938036244581220575769357e+74)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 6.7657855450073472861630911067774749012357295936579551712546801770340228765e+73)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.2200724511833181761435003548793565030399736349888521665887428093215263908e+73)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 5.6969626159645181170657767707096364240775930310958541253756412108457464465e+72)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.1902838064351166646672468793217979804852505454197638767497901741630038659e+72)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.0815524946284433112181691476757266928589723434617417902816279882371678020e+71)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 3.1085775474754412572785597234367295850853434122501232697548485520290211685e+70)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 4.0248876219420480494671692552535249842631934230477107608175338135254767453e+69)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 4.5717898581583284547576613790182065259217990496576104453319232531339965508e+68)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 4.5987266955225124754687270016251985476100549398788271466921127242855554305e+67)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 4.1277201593916609119851488898621364059725185338025069187337522019022532875e+66)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 3.3266912844842724918464413240523721967983751112927460422203771012324285814e+65)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.4198349306520385923755583127019190414798256355752152907538684107889754415e+64)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.5954968135971263467860541616149005468520952700568675174669869313790120813e+63)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 9.5697573028906337479684490638442403255222113759866980140004921288934014321e+61)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 5.2372180596212313667398562038281895205587396825353276904411403952354592724e+60)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.6216537416683580103634264243351068913266542152026155538733152213171424662e+59)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.2028581946420676660634538276758371308595650705510961727364638531545389749e+58)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 5.0668609223671045472881034712995505846341571161239968651357297157517601241e+56)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.9620881267196496193861934343921326919697524102893094861578977849944522047e+55)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 6.9917155089797622879653341069010820156774380191279115491781432309218621096e+53)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.2942244374439765758128985411022615606270110470067503605960457871147797553e+52)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 6.9351028342882568351470704633625779062510316389795468890729515726996746376e+50)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.9314927110707228066333377498237626208657080992885612416826068446390297282e+49)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 4.9556005176089621449765653988254594966772984328873034691437246673533838584e+47)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.1708002669765411191695114973458120651885979389757503801447241827647515479e+46)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.5453624823926493383313636717841737625222638948016893410076575426986147237e+44)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 5.0870291142516923896770486348199039577071847823857246263136765980806245584e+42)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 9.3337301613565742543387644582305705841930917569470575861418313137426853827e+40)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.5696392889303372910143506267477452989689410812923616782357472172107995484e+39)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.4143864855807616500285749805611035801672647319221651520900664580210701417e+37)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 3.3883950248556863481116504212968387826172322376709179509012607292972789664e+35)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 4.3257340722619328574784440823494550029955992275874284892851081786012219555e+33)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 5.0054658629154523660536922265411423770787857332470130847913952020455172951e+31)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 5.2273347597734780854875327656763513602785317406227796368685036961474823856e+29)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 4.9014441058506987415445336961216002315976811002826148787399813116200761040e+27)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 4.1007719003538290551470147047960192204273669359908829249030378418530058831e+25)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 3.0380905019192393560853564871253022486270254732200016399586810852416299561e+23)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.9744635849298784873006356360567530952404226257040467086536310864153303851e+21)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.1124649237555162417911032704785227088470234269296071198905173077670702197e+19)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 5.3521744565441850034376761928380748678988834367585778746740882700228177944e+16)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.1551192264984335079683102449711150606277601324509245213720618349409077054e+14)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 7.0649463728846790219460420909345995584550543072052058591106589782466481621e+11)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.8110794685236845669275412185521099716923991533427218655037515888279356458e+09)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 3.4051945147325155571782612757500183884572379142638708146516926708747795902e+06)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 4.1761279721833493440329993975995822357104129877086617643903445974526391316e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.5066282746310005024157652848110452530069867406099383166299235756022800280e+00)) + }; + static const T denom[49] = { + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 0.0000000000000000000000000000000000000000000000000000000000000000000000000e+00)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.5862324151116818064296435515361197996919763238912000000000000000000000000e+59)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.1477605944577727245447890951265834050463405543784448000000000000000000000e+60)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.3368731677410579748749120694395208342752220248276992000000000000000000000e+60)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.9393177179482022750532799808826502923430631529093529600000000000000000000e+60)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.5873212662073383100750664140824866318496576298496819200000000000000000000e+60)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.7087596791971826323557398537439095283663043689996772966400000000000000000e+60)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 8.8537931401160691803777386867476912131700643521105494016000000000000000000e+59)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 3.7128473077968876977396389430116077066613422855709615718400000000000000000e+59)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.2893230704461912298064838143702096489032830938340968366080000000000000000e+59)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 3.7731846263715878554484243293204825543527859328977818943488000000000000000e+58)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 9.4350612763444239870720412999269509820736318433853587128320000000000000000e+57)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.0384549286435665533353268142058310243161527793802332119040000000000000000e+57)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 3.8399900970142989644612517467287880620408209836099149824000000000000000000e+56)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 6.3548923093755049924589156254733610823950920495095216128000000000000000000e+55)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 9.2977252822627446721481004001665655765203461552290590720000000000000000000e+54)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.2090496144637581445624377322208214384344648810140669440000000000000000000e+54)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.4036595841089057320815648092220077464036379804960768000000000000000000000e+53)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.4604307712625044108337677046126892768963323598980608000000000000000000000e+52)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.3661432041590027825770657688785384893903477321470720000000000000000000000e+51)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.1520697686278361431114988925105292244781602931070400000000000000000000000e+50)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 8.7781340723597395269058455794580578514153013123200000000000000000000000000e+48)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 6.0542743368034560471670911883883927910588971816800000000000000000000000000e+47)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 3.7852178643724903498642955979619870805662919592000000000000000000000000000e+46)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.1476757456360244186066663869698554305163293290000000000000000000000000000e+45)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.1067024107708881097170625529475996208174256000000000000000000000000000000e+44)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 5.1816971152081755906884039315242368042580680000000000000000000000000000000e+42)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.2046914254271439983058171150950882746907200000000000000000000000000000000e+41)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 8.5226232704255673172404214340314876574740000000000000000000000000000000000e+39)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.9917039581671863252346910306123579600000000000000000000000000000000000000e+38)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 9.5279926429774219665504424895636324120000000000000000000000000000000000000e+36)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.7496375812101278379807519908356136800000000000000000000000000000000000000e+35)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 7.1781895168846844604663013761970710000000000000000000000000000000000000000e+33)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.6915825748773446395251490146656000000000000000000000000000000000000000000e+32)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 3.5888455419743269266732720488720000000000000000000000000000000000000000000e+30)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 6.8324723604341765969313138528000000000000000000000000000000000000000000000e+28)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.1625859075857974372785469560000000000000000000000000000000000000000000000e+27)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.7594478264056101488213120000000000000000000000000000000000000000000000000e+25)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.3541746402920221829579200000000000000000000000000000000000000000000000000e+23)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.7645128331397711271280000000000000000000000000000000000000000000000000000e+21)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.8231991756227354271000000000000000000000000000000000000000000000000000000e+19)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.4784681412721648000000000000000000000000000000000000000000000000000000000e+17)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.8427136416481320000000000000000000000000000000000000000000000000000000000e+15)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.1374881704208000000000000000000000000000000000000000000000000000000000000e+13)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 5.6720141346000000000000000000000000000000000000000000000000000000000000000e+10)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.1948624000000000000000000000000000000000000000000000000000000000000000000e+08)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 6.1833200000000000000000000000000000000000000000000000000000000000000000000e+05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.1280000000000000000000000000000000000000000000000000000000000000000000000e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.0000000000000000000000000000000000000000000000000000000000000000000000000e+00)) + }; + return boost::math::tools::evaluate_rational(num, denom, z); + } + + template + static T lanczos_sum_expG_scaled(const T& z) + { + static const T num[49] = { + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 8.9156595384723483714761513394165493705512008185104458104037189919966679583e+59)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.2490942626049052041642905803851633038401948356209065994820093902482046488e+60)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 8.5657016133969059292054137486140786946523144967749946090276991389460410256e+59)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 3.8317575261281828541202228096164333127703313535243593976139496326255603885e+59)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.2573232282907489549580534670684496645767812633106925447384772399512629009e+59)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 3.2264367876545276188760221330510623567338280567044843125670581811561508361e+58)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 6.7410929642927466039608438519399985289266866350365951941371580436768272283e+57)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.1788733746089745519939950216688781077254011132768568000829003039800512115e+57)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.7605221646260701306188822826505483714178735327624200723152581930359377597e+56)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.2794682649344687478785548483237660272987192396957769664741689026760236827e+55)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.5892026994266264487972781655291611074377224857532819461836222961458821278e+54)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.6044581976409422084009086165534449955654966215396670231211076839220955529e+53)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.3377067867856641370165698166594859838986332949917530009978864573093452852e+52)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.8840494251009843798733373985085724953611000664053469151896413377742842585e+51)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.3704573764322216880093728898018690177362850852138123977146826586562660042e+50)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 9.0359898089375286965109471568127438755772335943188122764617864358438172366e+48)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 5.4197682330664983610360781372995395147813463692379312665516728111546651975e+47)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.9660635239520142135892297007271080519825235074724441273950199516718744758e+46)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.4847561142331378363753305417832438611221296838300212519621989387291450611e+45)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 6.8123071733863185211372790750342775813125583218947155817719674827525929182e+43)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.8695828952857913310728321803468643286198192850402657393713980287261259638e+42)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.1112155264857128661506293440611411838336453876178977662636328219208269490e+41)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 3.9597114546218224309028736968589856884375435031334606638164700453351137400e+39)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.2993187112308342042984815542969104496107563160266146124117192158716725839e+38)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 3.9276492438289459104440745719026053099029450534209231660211458499968839130e+36)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.0938880168568707970634270396301729019623679984385010064117584299386152912e+35)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.8065713069852021979452626742757704686014267992443726831364663812595589478e+33)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 6.6307492378187334600766084298235996134621924808224715558467640454423842655e+31)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.4415490682866089784509877074414842364885644695603000622810515902853301434e+30)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.8810050162690958474575145223002401297790616292489104417882204295223485358e+28)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 5.2860958353933214242194744963395870718749107497800918932121607454081905640e+26)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 8.8895474422826652624342608217034044478811180021465482602156553101973142851e+24)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.3673716858987747316948988327383411119224741422002091782489841976044254452e+23)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.9189949269921720477131833122497011042624119182630703457459218878350720360e+21)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.4498506458943304056122167501858896499220570899589497703614276271780187559e+19)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.8348122127750881334333964077955476539118633228361300065573128691903485670e+17)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.9604661829895068017545272035886457795302072787311442846001622570781400887e+15)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.7759001843251065234667097315555616424286286440771094985162292676933917344e+13)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.3224448199826427582356965293979283708473565146649764333289536983716495991e+11)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.7206022964144885856033111994076522875074747824871090843993137657458226608e+09)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.1182242847179807470291498763391918222721736346452719834560856782062915656e+07)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 6.3003709115482840946768994349442745995208542698397935766566883071074706882e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 3.0311683127686139178455785110448360190741004055855567244689436514834230540e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.2205374026276431316033131273698903101132908812758212963153267146702515001e+00)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 4.0011852660581895977871209152278420195617235126960126683426738428884540341e-03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.0256927799097601645189517227865464454408483715314872385869625463116763013e-05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.9285092060573954544191464750091257510108951419853791428165851425157303961e-08)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.3651222287552713546296738256776548189076669986821606599921179638781057448e-11)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.4196122080178359418232367999588103764109880361922878363699332724809241837e-14)) + }; + static const T denom[49] = { + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 0.0000000000000000000000000000000000000000000000000000000000000000000000000e+00)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.5862324151116818064296435515361197996919763238912000000000000000000000000e+59)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.1477605944577727245447890951265834050463405543784448000000000000000000000e+60)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.3368731677410579748749120694395208342752220248276992000000000000000000000e+60)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.9393177179482022750532799808826502923430631529093529600000000000000000000e+60)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.5873212662073383100750664140824866318496576298496819200000000000000000000e+60)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.7087596791971826323557398537439095283663043689996772966400000000000000000e+60)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 8.8537931401160691803777386867476912131700643521105494016000000000000000000e+59)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 3.7128473077968876977396389430116077066613422855709615718400000000000000000e+59)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.2893230704461912298064838143702096489032830938340968366080000000000000000e+59)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 3.7731846263715878554484243293204825543527859328977818943488000000000000000e+58)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 9.4350612763444239870720412999269509820736318433853587128320000000000000000e+57)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.0384549286435665533353268142058310243161527793802332119040000000000000000e+57)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 3.8399900970142989644612517467287880620408209836099149824000000000000000000e+56)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 6.3548923093755049924589156254733610823950920495095216128000000000000000000e+55)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 9.2977252822627446721481004001665655765203461552290590720000000000000000000e+54)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.2090496144637581445624377322208214384344648810140669440000000000000000000e+54)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.4036595841089057320815648092220077464036379804960768000000000000000000000e+53)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.4604307712625044108337677046126892768963323598980608000000000000000000000e+52)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.3661432041590027825770657688785384893903477321470720000000000000000000000e+51)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.1520697686278361431114988925105292244781602931070400000000000000000000000e+50)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 8.7781340723597395269058455794580578514153013123200000000000000000000000000e+48)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 6.0542743368034560471670911883883927910588971816800000000000000000000000000e+47)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 3.7852178643724903498642955979619870805662919592000000000000000000000000000e+46)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.1476757456360244186066663869698554305163293290000000000000000000000000000e+45)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.1067024107708881097170625529475996208174256000000000000000000000000000000e+44)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 5.1816971152081755906884039315242368042580680000000000000000000000000000000e+42)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.2046914254271439983058171150950882746907200000000000000000000000000000000e+41)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 8.5226232704255673172404214340314876574740000000000000000000000000000000000e+39)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.9917039581671863252346910306123579600000000000000000000000000000000000000e+38)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 9.5279926429774219665504424895636324120000000000000000000000000000000000000e+36)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.7496375812101278379807519908356136800000000000000000000000000000000000000e+35)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 7.1781895168846844604663013761970710000000000000000000000000000000000000000e+33)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.6915825748773446395251490146656000000000000000000000000000000000000000000e+32)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 3.5888455419743269266732720488720000000000000000000000000000000000000000000e+30)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 6.8324723604341765969313138528000000000000000000000000000000000000000000000e+28)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.1625859075857974372785469560000000000000000000000000000000000000000000000e+27)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.7594478264056101488213120000000000000000000000000000000000000000000000000e+25)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.3541746402920221829579200000000000000000000000000000000000000000000000000e+23)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.7645128331397711271280000000000000000000000000000000000000000000000000000e+21)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.8231991756227354271000000000000000000000000000000000000000000000000000000e+19)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.4784681412721648000000000000000000000000000000000000000000000000000000000e+17)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.8427136416481320000000000000000000000000000000000000000000000000000000000e+15)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.1374881704208000000000000000000000000000000000000000000000000000000000000e+13)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 5.6720141346000000000000000000000000000000000000000000000000000000000000000e+10)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.1948624000000000000000000000000000000000000000000000000000000000000000000e+08)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 6.1833200000000000000000000000000000000000000000000000000000000000000000000e+05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.1280000000000000000000000000000000000000000000000000000000000000000000000e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.0000000000000000000000000000000000000000000000000000000000000000000000000e+00)) + }; + return boost::math::tools::evaluate_rational(num, denom, z); + } + + + template + static T lanczos_sum_near_1(const T& dz) + { + static const T d[48] = { + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.2066789802575522178795921101394468758895980798225454578416417743837821182e+01)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -1.3679788352265125219923749199991620615257401271523573821302279091870986385e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 7.2630033804072373059579276357751429378169881873880556882995810292143631169e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -2.3999752086438541157776701982236284193725611536088710297195418612889088941e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 5.5326869500703014940743489551921365917396663139743104045090175695793718397e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -9.4539806536100390983482685579769998888148275478188901957443850396223701663e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.2418837249375022042463276831798225069762119451024109889652570545798197307e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -1.2837532371348753406818677898802253115337338144774680681639085300947433821e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.0603676137809014970843333435453530863140601935101507289758344098164636049e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -7.0675156715558786066521224677848991893948220792765278914746791001795702147e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 3.8231576762102015440131857562883207655276091648820750106248419664382342083e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -1.6828357670521487851037941818117892204609675060095269337474530867886953446e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 6.0263919393474265394410446439494942658409182482953883911882462037294240391e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -1.7511174204844870012138672336839720481677091590654128683087419414952818657e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 4.1077240937707245791059934044373222445269304780721564415689327491376493334e+01)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -7.7197427650993388314150434222790763404096237849031957731092258677118877326e+00)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.1502942251829477374710555866529647619927300737021040120015632037419548655e+00)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -1.3407293979752550880132165447474755706150471817851620226242890535888257338e-01)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.2014334746887994911502478644617408322636134206225589060774099980181312765e-02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -8.0983646402105726518672426329015155996093741444426226630025345020847577111e-04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 3.9942365899792195557178345302806016444352718230344395806792868608352214871e-05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -1.3916756170744060855799456788870481671060079696580348774412746337324507629e-06)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 3.2738029264164285805306112157985005833945884241358728352406636162060451936e-08)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -4.9005795832591317070122324350352498562565929180970558213118848371143071658e-10)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 4.3120237284050523317140903263269508807725654665206264201337566990649593815e-12)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -1.9993164488488861127293338637233872747923249255635013388317575640760246175e-14)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 4.1770960183589659510713725797228496911736699917131125983799031646762143273e-17)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -3.1067143632180728240506803448567684891294208768806045480286272494772691950e-20)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 5.6244126131167038529019905678720925754781858101865433373489388749513540167e-24)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -1.2602412034992451089948288841723108481473094784377158526788906759478344724e-28)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 8.5993275050503412644261961442095022244184843038273154020407386192200117900e-35)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.2376677581089123203915935849311668028430409001498177367770610457728550321e-39)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -1.8150848887085059253468109780286976776338724012461857375172227849044365287e-39)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.2888861291942792803542790121202831584212092799440963290014968720997192671e-39)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -2.4367686092860277330824120317504561350242498766190734227637416697402218133e-39)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.1658834966582889258321173900424691594425653659844978485212529673045052341e-39)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -1.6078489664179099912530462853749930668959707942650569176553871936075352345e-39)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.0044570187922899426305396174281740469543589839974788550682447627990764739e-39)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -5.3214978442929458907632954943316397146183013077035413667972521651417588659e-40)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.3990788346383540827394552555896039808285381860296208830197355311239959128e-40)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -9.1813962257175782149431101470253920074573257556345440519764098954533396958e-41)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.9566302522237219982311281591833653462640003193980940062047608523626590962e-41)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -7.8844939069206979681852040267695059179818896523029249336074241598129744909e-42)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.6980186103098555864348162964443149317288303456071195638226831779183346735e-42)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -2.8409438292612321309493446423416582883045091540877596567806910261300252610e-43)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 3.4666144269083503254700296220598377304876489203081567665937809718753144311e-44)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -2.7449599736044707057960973836294763832382889203992176649603299199814964095e-45)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.0585685375038567471031307628591396658405283305367035292669018178549132199e-46)) + }; + T result = 0; + for (unsigned k = 1; k <= sizeof(d) / sizeof(d[0]); ++k) + { + result += (-d[k - 1] * dz) / (k * dz + k * k); + } + return result; + } + + template + static T lanczos_sum_near_2(const T& dz) + { + static const T d[48] = { + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.5455231550124674608383465879384903101217726809855880053735498558660305251e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -1.7521171744934997797979463716947798398649024826461953154035391579443199892e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 9.3025071978608000907597512615615521968983853964414599121560447447486249179e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -3.0739055847506874449724863962235222139048946552417933333489374601444889442e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 7.0863054140081769874319573695951392605490718603916106954837774653056576623e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -1.2108726717088904191265369690298547113580473039391314603986085479556111007e+05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.5906136463190712486212821488571957306185167770225864012898706881699647057e+05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -1.6442404200085453327213398272100872399623441451383083438265316066112956103e+05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.3581264998698427315063870744999865373965234956609066658837559718999590062e+05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -9.0521251281527290170664891261612911437995934455165647349853355253750334406e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 4.8967279703383588010975605180679227794424995039989024281878608594596616855e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -2.1553882073152030175586351692198830408611546985761579133373632331779244638e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 7.7186463308194716629084448574149234823489365098510570780593191406061889318e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -2.2428438423008152181399734545002360362921592139304278927551479335858821905e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 5.2612026936693838529789647834479279275034238291000514930718615542291190074e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -9.8875023012785484029602598574637362767234771045911074782572204578687659312e+01)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.4733051533871237880957666174363507890599952187881138769651021452363258297e+01)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -1.7172158984110335489611392604457344891052843492969255546784144895328933329e+00)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.5388046735862609465152559757953131111281278387717331973511139237319990770e-01)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -1.0372443934101018493930850177650436102881381002613480220638309361418767946e-02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 5.1158470789748281012838916430380981653860595791320888251473386188428788856e-04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -1.7824681838708087799263224394519010740357745634535755030787340328399772549e-05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 4.1931104382411821412587448903202613576618187938526144451753089437172395491e-07)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -6.2766977322268088075311831528842893348256386710249195361734612266778385323e-09)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 5.5228711415779960574453455948991424203497366984285083000319325448210101974e-11)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -2.5607389508299290889393825247382548268608977769597750095981719736417860627e-13)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 5.3500547558276404981577111880189245551703390604657164900460067017086475257e-16)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -3.9791021994420737378470356651659599587167405408055854179971153565586792084e-19)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 7.2037883058679724499875763987161800762132311085398211645162684109748694340e-23)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -1.6141260374761318937819974670878746263129124551434880143657761001893177100e-27)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.1014080790364138694339981796904397090336135156681914457153169895058123962e-33)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.5852138055486955162695207029733124482316515915389725207819834510328826882e-38)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -2.3247738377057606447050864939101938086522392428747461590714144146282468974e-38)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.9316218892795919921760137631186915684395320376859960566984260379803979907e-38)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -3.1210308380902232855988541317886447706766253774127605015790322866153349557e-38)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.7740792289514179382145837836403663560484901236914958039358936821942590582e-38)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -2.0593445713551373294655454085927889987266290706104795764516423812212247302e-38)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.2865158059079907658671256163529513022184187924172645112729579745062723961e-38)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -6.8158128816897517506937531950420472376185024126168447501964316612370015014e-39)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 3.0727575024490003112672747176557026577347452778581212406977128868690751231e-39)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -1.1759598612683119428775753540097890056929269067220807101660487076215190882e-39)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 3.7868733858667171123449703661037140974108364228765817302050018596960416788e-40)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -1.0098516753892371349956889909483048597911093401064123370095186647248754503e-40)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 2.1748345026411581847490576071466694584307900894689508331424519370338054748e-41)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -3.6387013796128814207293408288388785778364579569320260571422484577307186443e-42)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 4.4400648009494470795051094944915668879009266928618607576647564429190022802e-43)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, -3.5157645638963794722990984515235056341682398223940346512667816730324057574e-44)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 234, 1.3558222299776027787073219176369904651832196778690432544150792644775402371e-45)), + }; + T result = 0; + T z = dz + 2; + for (unsigned k = 1; k <= sizeof(d) / sizeof(d[0]); ++k) + { + result += (-d[k - 1] * dz) / (z + k * z + k * k - 1); + } + return result; + } + + static double g() { return 3.2804746093749997726263245567679405212402343750000000000000000000000000000e+01; } +}; +// +// Lanczos Coefficients for N=49 G=3.71521093750000019895196601282805204391479492187500000000000000000000000000000000000e+01 +// Max experimental error (with 80-digit precision arithmetic) 75eps +// Generated with compiler: Microsoft Visual C++ version 14.2 on Win32 at Oct 14 2019 +// Type precision was 267 bits or 83 max_digits10 +// +struct lanczos49MP_2 : public mpl::int_<267> +{ + template + static T lanczos_sum(const T& z) + { + static const T num[49] = { + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.29576393886533812647621748658593518049105182771886345672193119325886860615058992916e+76)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.64940250521075704286553287922703978233859608760738220959805633167660346858918484441e+76)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.02782279850582131264593341856583603623569135771086732311690891701018783486399941058e+76)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 4.17871318833644489595452604622172623859528919270761702889241650479860350523603645576e+75)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.24636895901125366174317752785594004344350462222105593541765135970641727807408046603e+75)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.90766536403132277814150094353285923029162708480029761430241108404154368124040257524e+74)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 5.52382781721986299602475060387708982171655203328511435511051797995280492002324724681e+73)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 8.78482374388380268613213967834073614067861524793728730151201542394918426634868617345e+72)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.19325027080949586393337406155391099309209314019751861163367432285571050834050337943e+72)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.40545316209557907826875120370637029196186181048557227564363347693674382156389673345e+71)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.45248231502915687322615277256109191586795311001308546524559632502753988355826682144e+70)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.32951710710760475384871665492267398285929602882057694753684715739127717537388087360e+69)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.08609708232067139682194681883946299264352243218047148918541516101215386723695461807e+68)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 7.96790018517492120048938623906554309076682107791064003018940091271134763465693455777e+66)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 5.27669033307366420506859833929956397578574575080825866111910129757118415016658467329e+65)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 3.16802337748974823514819525636942825363065912689755393017268041605495575074123213602e+64)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.73054387508326490801862749035024819220968371854706600225017512476962193917082134622e+63)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 8.62670382432299595501509896985706425528571034019439577742070022359804568860138431456e+61)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 3.93419603580003232059946064747952976400826625336761312144282727389088893514776127326e+60)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.64477326525726493380322761443767318183513031346169727378679051953394311858102484110e+59)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 6.31417565379195208375864005040359979626430954027274059125918083665481151874801228147e+57)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.22873281009357235993917586746434823288058696112725892939606733669981526181084161579e+56)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 7.24038151344262567906410045463097784963500265667230009248051943941184141216283364012e+54)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.16635103397331843098281133679963613292528445793288854356269441338108669168034969473e+53)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 5.97226028792130808404381304085761534201244857265870272466382244177818968609788744866e+51)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.51722539705401822010051258989781033530766592277336923172687967760117181597042914505e+50)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 3.55143196851124103497589961680541188447723645252871343011474640057780989215029733411e+48)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 7.65631576916353367608977102104279419518759334245125488959476099210969778356845251386e+46)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.51913643147679636800192101181821796326331285929097206716389984328795132228290343736e+45)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.77142070954017798440735921701401232362942654167866941640116269309928860707230400223e+43)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 4.64265304588830405590756890757870027959619641212378439580733250347485559404826031214e+41)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 7.12961287129418300922993605074391681508051626956297216905205033442654279681009631622e+39)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.00163852645278376379452857266851549886004284453902427442045925921205957134756527439e+38)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.28416298426892934885339736163488241290345416925540130172490965458139411097784230624e+36)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.49793255972439978183906387866659603599388803095306163216192230005161964280456557158e+34)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.58404837985235629013707612365235872533571223333496498253968477010731743022987544752e+32)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.51210388163173191310089232642285522934883375636207281562370177051035472857070373332e+30)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.29625175202138639315345810129285907904834629385738665013524881366645746417930602439e+28)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 9.91704411637684940906309546543695853685028152118727394684725500498007979899474115290e+25)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 6.71980627815396304296720837491060731114276254036666247979635295719640774180255608217e+23)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 3.99515302992882524356421852289147703799628458429164679118485650618041455793969699036e+21)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.05962638033903929635201902285319054754141795004681756534441119215276710860621598251e+19)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 9.06860641169958199340995275230206293988239276251216776246763641876943705626715807705e+16)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 3.34257282855413383182163862298720605042203946165367698145431759335580579509759239742e+14)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.00325103633255410612780052993328410422609156975902055798191507344081921284741604327e+12)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.35516908008075882088679988477934347017452660082246021362543874768562840957846903854e+09)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 4.05605466237751558310956675128455566243720955874966620350919363272463056561354608608e+06)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 4.55729572460925281137543520027396380407277254872226907448088245735142585109299314309e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.50662827463100050241576528481104525300698674060993831662992357634350984153163470001e+00)) + }; + static const T denom[49] = { + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.58623241511168180642964355153611979969197632389120000000000000000000000000000000000e+59)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.14776059445777272454478909512658340504634055437844480000000000000000000000000000000e+60)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.33687316774105797487491206943952083427522202482769920000000000000000000000000000000e+60)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.93931771794820227505327998088265029234306315290935296000000000000000000000000000000e+60)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.58732126620733831007506641408248663184965762984968192000000000000000000000000000000e+60)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.70875967919718263235573985374390952836630436899967729664000000000000000000000000000e+60)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 8.85379314011606918037773868674769121317006435211054940160000000000000000000000000000e+59)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 3.71284730779688769773963894301160770666134228557096157184000000000000000000000000000e+59)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.28932307044619122980648381437020964890328309383409683660800000000000000000000000000e+59)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 3.77318462637158785544842432932048255435278593289778189434880000000000000000000000000e+58)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 9.43506127634442398707204129992695098207363184338535871283200000000000000000000000000e+57)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.03845492864356655333532681420583102431615277938023321190400000000000000000000000000e+57)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 3.83999009701429896446125174672878806204082098360991498240000000000000000000000000000e+56)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 6.35489230937550499245891562547336108239509204950952161280000000000000000000000000000e+55)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 9.29772528226274467214810040016656557652034615522905907200000000000000000000000000000e+54)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.20904961446375814456243773222082143843446488101406694400000000000000000000000000000e+54)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.40365958410890573208156480922200774640363798049607680000000000000000000000000000000e+53)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.46043077126250441083376770461268927689633235989806080000000000000000000000000000000e+52)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.36614320415900278257706576887853848939034773214707200000000000000000000000000000000e+51)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.15206976862783614311149889251052922447816029310704000000000000000000000000000000000e+50)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 8.77813407235973952690584557945805785141530131232000000000000000000000000000000000000e+48)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 6.05427433680345604716709118838839279105889718168000000000000000000000000000000000000e+47)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 3.78521786437249034986429559796198708056629195920000000000000000000000000000000000000e+46)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.14767574563602441860666638696985543051632932900000000000000000000000000000000000000e+45)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.10670241077088810971706255294759962081742560000000000000000000000000000000000000000e+44)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 5.18169711520817559068840393152423680425806800000000000000000000000000000000000000000e+42)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.20469142542714399830581711509508827469072000000000000000000000000000000000000000000e+41)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 8.52262327042556731724042143403148765747400000000000000000000000000000000000000000000e+39)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.99170395816718632523469103061235796000000000000000000000000000000000000000000000000e+38)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 9.52799264297742196655044248956363241200000000000000000000000000000000000000000000000e+36)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.74963758121012783798075199083561368000000000000000000000000000000000000000000000000e+35)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 7.17818951688468446046630137619707100000000000000000000000000000000000000000000000000e+33)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.69158257487734463952514901466560000000000000000000000000000000000000000000000000000e+32)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 3.58884554197432692667327204887200000000000000000000000000000000000000000000000000000e+30)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 6.83247236043417659693131385280000000000000000000000000000000000000000000000000000000e+28)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.16258590758579743727854695600000000000000000000000000000000000000000000000000000000e+27)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.75944782640561014882131200000000000000000000000000000000000000000000000000000000000e+25)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.35417464029202218295792000000000000000000000000000000000000000000000000000000000000e+23)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.76451283313977112712800000000000000000000000000000000000000000000000000000000000000e+21)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.82319917562273542710000000000000000000000000000000000000000000000000000000000000000e+19)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.47846814127216480000000000000000000000000000000000000000000000000000000000000000000e+17)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.84271364164813200000000000000000000000000000000000000000000000000000000000000000000e+15)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.13748817042080000000000000000000000000000000000000000000000000000000000000000000000e+13)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 5.67201413460000000000000000000000000000000000000000000000000000000000000000000000000e+10)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.19486240000000000000000000000000000000000000000000000000000000000000000000000000000e+08)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 6.18332000000000000000000000000000000000000000000000000000000000000000000000000000000e+05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.12800000000000000000000000000000000000000000000000000000000000000000000000000000000e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.00000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00)) + }; + return boost::math::tools::evaluate_rational(num, denom, z); + } + + template + static T lanczos_sum_expG_scaled(const T& z) + { + static const T num[49] = { + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 9.49663610130791477461794140374370924490696733744664264226063545477852907120064438588e+59)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.20884482942845999689198014205795770851399772847436497410154319183860398480228326286e+60)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 7.53289916571146966947513241858798999095967787802671792160665282347073321227016292403e+59)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 3.06257315326410705497495763375336857281692495321204603919284336971479478405381409540e+59)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 9.13462097275260056500457419367381935327442299676685171001942731892832408882413435566e+58)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.13102394952914002112762425649207244062991186339070382885956481064589709031894816496e+58)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 4.04840581629048620249901745346405131124091439055732548308528857701167494671648257347e+57)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 6.43838524961944675350746734141447316445830054880306039896637689653198992735066081474e+56)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 8.74531483688910159100344151068655208511626316424159676205726034341092475816888011372e+55)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.03005469109920428385867124264753643595038929217266678155910599078268836953793159656e+55)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.06452229265586101928934888140259774581544836837635812825070642317924068191237940651e+54)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 9.74401260751298616807064335204160985098707747263556384563576228484205922370857356950e+52)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 7.95999059097413995107763881990067736638605879036860399501004480843044798852321320153e+51)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 5.83966309607370356019329894907872727851559431468853382195539375506355518522739451561e+50)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 3.86727909378079977412627692901220876068535926169729765468023963613209750668440883454e+49)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.32183997980385285815563935626564558737112327901896765866420315909089479889407291483e+48)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.26831322790199691523763382147990685271332413931335425536077401693909941536685446004e+47)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 6.32249937786475248948857177694117967417864070990756190329454700663693499608768713815e+45)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.88336686819032307424839603734550094343459546588744595045643380205822126447806151375e+44)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.20545206582813581050133859680698140274276251798965738445951215893805514854794850980e+43)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 4.62765065960304045423639870153223988753806599339881709607153712409175486794708548715e+41)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.63343521375027791107490012004281169470903074417529835343633992756599689706467597925e+40)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 5.30646566133119269769508008116142168214781437395136629206311256865360022042754477332e+38)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.58771569575797497748917749020901655508364490119697350339089287796185236358536233400e+37)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 4.37706135782308791418825498038425839394113136784263252755599976807797063043875082698e+35)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.11197240850069894333209760920904406397403024207197696391699562264322296386093323413e+34)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.60283960927607800898139439849090533043340726395143638152077844277751805149166560973e+32)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 5.61130330576422804633963440554474730419413739922460725405112412454286488484955915987e+30)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.11337300300297295349076762512699923957438723580465440290334845396273762855836733517e+29)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.03117042948259288566605349078528499682057378893001882806984505986948136392761267006e+27)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 3.40259403730882930955675549420130062238621449273398874217078083754343032954759973357e+25)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 5.22528347572098799721775967384397848588784390912022136506439711506219967445623919686e+23)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 7.34099499566403754037791880900467520578107411723617564672664393961433945628291065109e+21)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 9.41161286449337414692992004461766142962293572495919749372515938105183883550234862604e+19)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.09783271453440804906045665973485276329744852249747400433246982560607811629926185500e+18)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.16094688076417849092104554198103013111536406662498981965117749909832209236913802539e+16)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.10821885688578986410930893219376699456504867926107715594671444282949767588694287037e+14)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 9.50021127722497072888981489155684575207215375480643952454970468046331143014884622646e+11)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 7.26818800470068614566377728536610325478326870447541587095650095821101649087210816040e+09)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 4.92493678677258766132448688907920434402513619957710479626424529957236460471189038381e+07)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.92804216541904692956935385209461325937556277824668580633404375808334363503194457710e+05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.50949734377247428538055873924894146321959030826140132714559567319426159642629912422e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 6.64636917688205569668044105440719648394808067896062765005278597960400006426062506946e+00)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.44976703261974330359141562652121211268881081847095890846270752149427888286399621821e-02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 7.35281305841345486358892992557075736755186129730528304574018484234880523171404766251e-05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.72610018227274377132777187985570646349538821991325846732587180123971090415405994340e-07)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.97267688814850268231161594533176277702963907108885229111755006417082297177116403628e-10)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 3.34003577384307789433517516041141801840291757339440089597599691127216013708701908122e-13)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.83710441782049075320423070384744844199992659460213011403809803120117400852034616312e-16)) + }; + static const T denom[49] = { + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.58623241511168180642964355153611979969197632389120000000000000000000000000000000000e+59)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.14776059445777272454478909512658340504634055437844480000000000000000000000000000000e+60)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.33687316774105797487491206943952083427522202482769920000000000000000000000000000000e+60)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.93931771794820227505327998088265029234306315290935296000000000000000000000000000000e+60)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.58732126620733831007506641408248663184965762984968192000000000000000000000000000000e+60)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.70875967919718263235573985374390952836630436899967729664000000000000000000000000000e+60)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 8.85379314011606918037773868674769121317006435211054940160000000000000000000000000000e+59)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 3.71284730779688769773963894301160770666134228557096157184000000000000000000000000000e+59)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.28932307044619122980648381437020964890328309383409683660800000000000000000000000000e+59)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 3.77318462637158785544842432932048255435278593289778189434880000000000000000000000000e+58)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 9.43506127634442398707204129992695098207363184338535871283200000000000000000000000000e+57)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.03845492864356655333532681420583102431615277938023321190400000000000000000000000000e+57)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 3.83999009701429896446125174672878806204082098360991498240000000000000000000000000000e+56)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 6.35489230937550499245891562547336108239509204950952161280000000000000000000000000000e+55)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 9.29772528226274467214810040016656557652034615522905907200000000000000000000000000000e+54)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.20904961446375814456243773222082143843446488101406694400000000000000000000000000000e+54)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.40365958410890573208156480922200774640363798049607680000000000000000000000000000000e+53)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.46043077126250441083376770461268927689633235989806080000000000000000000000000000000e+52)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.36614320415900278257706576887853848939034773214707200000000000000000000000000000000e+51)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.15206976862783614311149889251052922447816029310704000000000000000000000000000000000e+50)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 8.77813407235973952690584557945805785141530131232000000000000000000000000000000000000e+48)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 6.05427433680345604716709118838839279105889718168000000000000000000000000000000000000e+47)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 3.78521786437249034986429559796198708056629195920000000000000000000000000000000000000e+46)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.14767574563602441860666638696985543051632932900000000000000000000000000000000000000e+45)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.10670241077088810971706255294759962081742560000000000000000000000000000000000000000e+44)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 5.18169711520817559068840393152423680425806800000000000000000000000000000000000000000e+42)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.20469142542714399830581711509508827469072000000000000000000000000000000000000000000e+41)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 8.52262327042556731724042143403148765747400000000000000000000000000000000000000000000e+39)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.99170395816718632523469103061235796000000000000000000000000000000000000000000000000e+38)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 9.52799264297742196655044248956363241200000000000000000000000000000000000000000000000e+36)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.74963758121012783798075199083561368000000000000000000000000000000000000000000000000e+35)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 7.17818951688468446046630137619707100000000000000000000000000000000000000000000000000e+33)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.69158257487734463952514901466560000000000000000000000000000000000000000000000000000e+32)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 3.58884554197432692667327204887200000000000000000000000000000000000000000000000000000e+30)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 6.83247236043417659693131385280000000000000000000000000000000000000000000000000000000e+28)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.16258590758579743727854695600000000000000000000000000000000000000000000000000000000e+27)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.75944782640561014882131200000000000000000000000000000000000000000000000000000000000e+25)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.35417464029202218295792000000000000000000000000000000000000000000000000000000000000e+23)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.76451283313977112712800000000000000000000000000000000000000000000000000000000000000e+21)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.82319917562273542710000000000000000000000000000000000000000000000000000000000000000e+19)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.47846814127216480000000000000000000000000000000000000000000000000000000000000000000e+17)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.84271364164813200000000000000000000000000000000000000000000000000000000000000000000e+15)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.13748817042080000000000000000000000000000000000000000000000000000000000000000000000e+13)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 5.67201413460000000000000000000000000000000000000000000000000000000000000000000000000e+10)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.19486240000000000000000000000000000000000000000000000000000000000000000000000000000e+08)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 6.18332000000000000000000000000000000000000000000000000000000000000000000000000000000e+05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.12800000000000000000000000000000000000000000000000000000000000000000000000000000000e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.00000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00)) + }; + return boost::math::tools::evaluate_rational(num, denom, z); + } + + + template + static T lanczos_sum_near_1(const T& dz) + { + static const T d[48] = { + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.36662594316736437928923771651218082870790219434510733129873815200968646566980996339e+01)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -1.76780165965526893166944674250172218113345269194305352999222919039854748751783233101e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.07970572889193090835848021094044050788957851893559287421136980839960026782217427894e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -4.14103116540076985021820709941614153683990156820041738016476143763552291310864305462e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.11895235901890827822967425840835669339942717903640916537446753898873381005535850448e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -2.26548471357135814759065586133601745345092666805731605105989839308832305900191949768e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 3.56856136042152636864745499626803467747701570337645969278665918810296351408741364840e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -4.48255074360054688238131834296168065172557135920905358164352154448630969015187687499e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 4.56619966800988637898793129440851486107980873809024863561425305126874295268067178801e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -3.81597333294282872581583559942700103331926900424172914177106074836091709159865752408e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.63678053487724707751260697626783885891593791493016491379265204946777211045670615960e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -1.51398164257933964710898171665986511410737733219980979417140085562924634596875563017e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 7.24278345602386851676210506047826420822246500559376040889647916551285989221630819711e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -2.88891626830459350723218099328412217578914954601038686119863249895652809029737934745e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 9.59719898181036663575857261276179540194083274881058286618169370083758218641306764946e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -2.64811367543293387988966817387441229757530457146808054159891759802567729960811992548e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 6.04201418909362106976467138015064536194810537117201428954061434907295912679183849448e+01)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -1.13288541649508118041751198270788445621639048290878149127604057823054487014510567347e+01)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.73151244996618239257199112314250678525910059470480205369884034575880974697338791461e+00)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -2.13522814977566175652818016173551223075398445721839956765100980594656777696996995600e-01)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.09751773607848160413869110673825438505378131216432708718954295924780177394997267064e-02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -1.61580494932170317026139049544442892885812277792439584113117496484172419053879898708e-03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 9.57433012294978946531397728731840486773642836205104228434646630602626154207102575497e-05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -4.26115172606869205202745132493304748075964471479903642930011237303391162925986198072e-06)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.38298958800694421458738651547755286166537642575090914169204625632511624488640442440e-07)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -3.15434025288605144031976010596974001946974995609543721535748916319261879201397044643e-09)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 4.82356872364336815146383574702913568837734092081047520230601339834144374864204220536e-11)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -4.65347968332361614985780283973809979932690029695650403412722596287871272868944164634e-13)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.61330972151984338818972320382872350752985962075827056997941920528654516802241093365e-15)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -7.65712722253446172294321996643259661334528734360491402384245881720504947974618941889e-18)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.00315206806375905680927042642419402837617729582878141293654269070861386455343121457e-20)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -4.67823488694203852929295147942658910943366513902587599688834805295280061153989766567e-24)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 5.42784331030702330814913209805860341549196535898588904124741295988710093967131088558e-28)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -8.48033607088050589024790469649076336393214555653483679072498587123824764496639393119e-33)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 5.38678975538457226036965671734240034395107611196492658679331149986658879027568426753e-39)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -3.16374538409167657752796610509153125477921149181502343813699059314745306802450755203e-44)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.81171114010755337144545373726087472870924044681995068325590922531565077520176259988e-44)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -2.12518224599976943855815669111195755470966740275125423482269033756614972278324281875e-44)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.34263635935093852590059444867684742593087836231966301216975070578889017560759389549e-44)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -6.99309631968130547786945826997659785416033441104613988483204974783621090009511212354e-45)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.97679666641473578922997037967978768575315112030381704618978104186395317308038799663e-45)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -1.02914662367729885237175382124322264439002075945431846631322577735558916377073070681e-45)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.86340999808161554465998036301386594999661959859518584115844390884231065866412899967e-46)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -6.29984672974930250076096802152581521034785267762668779142172198560320648227598177519e-47)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.06114476593975974108382448813738674408492134446936551295509200129676957425762855493e-47)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -1.29100594893020385764408454293732511414412187214201378654051353911377525656418964207e-48)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.01295708418471529474900073238291374279037984260859165547005675299775146592711994348e-49)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -3.85645797686287223531258890899878578933576632756354490084215435591125736026369211048e-51)) + }; + T result = 0; + for (unsigned k = 1; k <= sizeof(d) / sizeof(d[0]); ++k) + { + result += (-d[k - 1] * dz) / (k * dz + k * k); + } + return result; + } + + template + static T lanczos_sum_near_2(const T& dz) + { + static const T d[48] = { + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.96888487550957841138585220622994611985377489508130630837700057227501332853802783571e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -2.54685487861380185221232939396911532213815096219473151461939579496835151047360732452e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.55552167748949946948357664110976074745481263569802725437644778906661083814390424521e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -5.96594384244972046908436642965430637119152525028640569187886872989713864303356592740e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.61206392071125071279258677015155474032235397552388756144191669459747349464120963595e+05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -3.26386207619544812116284495283640666091191851380376198408981809802540783149068179434e+05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 5.14119209063000811010153319909166529923295169312754965782286511885151365058895055453e+05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -6.45796781987366173516756643389460485986669456101668857494954730722833100110613651939e+05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 6.57848002216691432249235663216198359909768823927158528746723212875688277777327166892e+05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -5.49763614406879724077940366200859712110749040051198851331880172109188055935892153627e+05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 3.79878440118422879619706786668472072947762184485364412917440713970863702012601831523e+05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -2.18117881690802831493078756446312359535362496025568649851035022806893921424585651770e+05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.04346085879989815616410913816129789693536068884338152664460700712557690664496356491e+05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -4.16203393160809415901576300558568214071599197484753461939177893151363492512491744816e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.38265924315387281787206504282410481919445750548305464376847792250029309946303762942e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -3.81511194797468462062874900113250266465621301462447801385359808929965375229616323251e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 8.70467183357417683453667167003713608362889484387619452881332522389524770233094455619e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -1.63213714284756057716179081387804854162483375452448157161319547511874432644723929936e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 2.49457336262308128548970424731422625668341066112088155314174120975542287189333019758e+01)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -3.07620269531262256257667392994057559249714693275375776469485257399496930680150472549e+00)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 3.02187366435225062095438319574039637826727962739349882824178780109324022923104253736e-01)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -2.32787467733840531952793152972131223922164668925536951733638661285196165517774652382e-02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.37936454861394636073464067115999570083944553260438583828963060925061101644510914088e-03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -6.13900038094091115267314860504732881894801020942472019504308090210210731167345398552e-05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.99245982152457111301991970385956762536902876746714853773765158096202639164545608854e-06)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -4.54442771789078363056076138819579948120113702520046296917694187019851573438477912893e-08)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 6.94926914964866053119681538255564252500374927699409988373657464226793796472537754598e-10)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -6.70422350226445404683228568613754929042955139666562491583132456753472072839819516057e-12)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 3.76497022572067913016091674317545685518824311681605875941103548614928596445142654530e-14)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -1.10315496743460248468022132288915711635897058766184880707096827157196752704473690191e-16)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.44523155331686111418148572564943890979552960547133940740999458361025242160963413278e-19)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -6.73988808644577660977639361852731370450420349068670037458430193432726909116710442573e-23)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 7.81984174508721338476616177429473006273759399181666460057479840823572355207273441830e-27)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -1.22175387586288279410299617080503779059482571464350109824108120007426231737351306256e-31)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 7.76069628266069128881232691561697202264350068700303406802593331217743381427492776348e-38)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -4.55797760012119196385166534789617212222293557097685410066659856245708610260816713241e-43)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 4.05080524465178727911313037718933906722430509738224888801936471543177490693203242080e-43)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -3.06172965819221083679631791380848228306721487317680820361950045678791125133333041491e-43)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.93432331242636842233461846275246262853067820473357196595254072710231999304513059821e-43)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -1.00748867278864769255014599872258605211683566333279390476878762044733272684660155341e-43)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 4.28864237743622222407442194745385245322813091389014701339281732300960497092852607932e-44)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -1.48268166001867959355256619834250603827306390609511540411093653502476081933431007754e-44)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 4.12528729298048868682661828587192615782099352227112063181739468363374124346195882740e-45)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -9.07612869947754202550701651568771230782100517153410159160000452433811651633069544830e-46)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.52878107636588388950021856856509972417665723455977954669464087724444519346925778688e-46)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -1.85993987583058920731606562273777225552135287406894580374509213860879421694626894310e-47)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, 1.45935754590553989061937536984206183886886144778541444482827659230313539351404405283e-48)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 267, -5.55596198187619704372842019685051223079581761704170979479661609332351755409245768399e-50)), + }; + T result = 0; + T z = dz + 2; + for (unsigned k = 1; k <= sizeof(d) / sizeof(d[0]); ++k) + { + result += (-d[k - 1] * dz) / (z + k * z + k * k - 1); + } + return result; + } + + static double g() { return 3.71521093750000019895196601282805204391479492187500000000000000000000000000000000000e+01; } +}; +// +// Lanczos Coefficients for N=58 G=4.7377167968750001136868377216160297393798828125000000000000000000000000000000000000000000000000000000000e+01 +// Max experimental error (with 100-digit precision arithmetic) 89eps +// Generated with compiler: Microsoft Visual C++ version 14.2 on Win32 at Oct 14 2019 +// Type precision was 334 bits or 103 max_digits10 +// +struct lanczos58MP : public mpl::int_<334> +{ + template + static T lanczos_sum(const T& z) + { + static const T num[58] = { + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.1113345018281139401900617648632565892997531886271137869532357720305909403460902551816191757935253298297e+96)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.3306998523015859302296206498309765162943025964850544682652937543993544826195909937055933931442768067675e+96)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 7.8268352474100341852641008414682924186512501342670048541149232501353823124314085480609221821688640650080e+95)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 3.0141386651493209831831274089811845202892902987250465018037980182315440505121630111661568734223655786214e+95)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 8.5471258592914542867143021588167696855338160407933457150021303941501653183920330822783098409082225352649e+94)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.9029900619671536896112969373037726527696919271039767737722503312395772965346303367519600397313792277727e+94)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 3.4640693221647807642599419508017238730661097576373283904791677661939143319337033201070793440010339999715e+93)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 5.3008318491825889746629471128738097186407559167000216981000503166575445677111681454415332001004453692360e+92)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 6.9581961997681479620796339921050983411541681934353890086635121221338490738854914613804353855734829750740e+91)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 7.9562812093757389383361734216065083810639336069848105427428961256383580773444097085298844542948261561976e+90)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 8.0204448099875032766488461246324914875195022845573308192494619777200657405252573402181380342443147295173e+89)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 7.1967742477741068422882850261828584111953166907106815923693978537447964053382494347755201222673169434806e+88)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 5.7934308426826323386245296144249798411531042807557571947289014719343462128587532573403065724298496762577e+87)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 4.2112731316363645590406244691358512085700135781552933145962419229534561671703452680159817420544888863655e+86)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.7792875367286636291574914918267428357586601357931867786906344130539973047706286380462771311772443260655e+85)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.6729889167781214645382609228554520670924462597343847547527634847733870633193570419233293354907537898968e+84)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 9.2212896890317209445182351532165347688163702283356828888187120214401748895306876396481747000574259149233e+82)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 4.6696330100177872775181285832060367195698947756070274789550514016487770556676430692662838020948055174819e+81)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.1787790436987713717592679695802576546659292017904142826938775295267502136179724011234775858106585474335e+80)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 9.3897471960941486230091766140467565375262975446763006777927562006563131703283610364746875620601313483057e+78)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 3.7456216276193058883301725852613487104982510349671722342387971953607146505494372335184541893296983766398e+77)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.3855091017101453942895165907767739025127711826384743418432444735139729009897407793448891996393706658957e+76)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 4.7596919543541505311176214833582242571197674817260097288825507658966682365463135538963387631678553863542e+74)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.5205308568827525377048378465545277453459194177597465928758908233213456983481011601239823019085100837607e+73)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 4.5219482007379940303673464060102227421305538751659464891709211634879751289944728765835405235116911964067e+71)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.2529929196659743450833612479027982672526994601606551595908472901860777472333846227605233498599036089780e+70)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 3.2371343799933848311703711400651007221131224388690941908721236718964833912418768528725638940635396117593e+68)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 7.8015422120873735048084230762717970714811562909437854684093754471976926045882197320273930142628411250042e+66)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.7544934847649309554128203553793825206530899558440305080175611169946112759760674627144360103537889679591e+65)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 3.6825279122107455550724823529764700516671135432239079326787536307050166777000218851702259835300111357922e+63)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 7.2137862491643897667607321980849893924427698956617156800113142641018717095876369593791167006646811605785e+61)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.3186571319674830310069793304531422675865920550412368667057521060523822178148626902742473745717612071248e+60)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.2485774541577495056605563690047646700517885331946681444187667959802672435192052254156475697343336771638e+58)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 3.5749708448011926909660539105173117507305781970952738170400845272354829441805660173686553510885012106315e+56)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 5.2957728089076810011933348982855845071484336995217889625353037764527196874992238794680831083872659220534e+54)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 7.3029702073166140154775964636478493296495204191370975362621002042260278819606865308080233433968063616502e+52)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 9.3651754658248543289835755041517884667332033286508690963566578707866450840862377843752246373050313956333e+50)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.1153610110919853077136756888034644015689784357746290647672760493336488593590043112457135368750990637667e+49)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.2317697361001624160827173449861094521356739436250957059660912760537330301205792128544135654641326400704e+47)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.2591336713897064687825047779362333153357928528455245343833435858589598201567338554890557167949204480368e+45)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.1888395650074118534283640535831622534704266864697448915278695723452804398372734472806777342045155424277e+43)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.0342195380047963732482565081644533382537722066923561121178973781344452277931733870503748282543943428982e+41)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 8.2659603644818244197377849119572544438113712679642935412688508428331533577481416745415954979034017913781e+38)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 6.0493876469565505074955014266411916314577665137838261525037575218110760155069631757821913430706010515995e+36)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 4.0380102035661800729809170954585443393379101722448652003355183633039922242269533846456702077836461601594e+34)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.4471701800736812643301636372332435764064729819100848382778186520311589961354650397132342954205946278402e+32)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.3391793076015860668513073429148720023215553662036803736563341850799950224212365984411047979319730267348e+30)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 6.5746079755559823667940853958792940224952894096446926758424644873786146686411034227207764327098030858365e+27)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.8730952802737845263408235958198085714879899902329571556827316641606659145317043632556281422581317630775e+25)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.1068860106460271425431255001071933519142520498723285368106201466148952145283909421951418316204387374823e+23)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 3.7146191714834483705600971071352976348572227109511068140706241351872914486137201205172098597005503434574e+20)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.0693465808661148698636384310734985694414606785941298207428612238748657882890467389962396214120403612061e+18)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.5877812671795420049920049903121324610843253367633375770943367999226546473657225178995404939996916553769e+15)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 5.1199728232559097639450648660234135896472362777482676055586950665599850474720777665093211412423570836354e+12)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 7.9536149625531631518225658997937689548178270704423376010017262234330926444650292977902802706698285898435e+09)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 9.0978434212942028068922584596812569730178537381770594492536210144311893565241511848298648224631091914130e+06)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 6.8136582389003336880560289199735195790527296500214034301547642961678068653936021531092803113827675512051e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.5066282746310005024157652848110452530069867406099383166299235763422936546078420094024669537723756981791e+00)) + }; + static const T denom[58] = { + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 7.1099858780486345185404564746372494973649797888116845868744704000000000000000000000000000000000000000000e+74)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 3.2787481989562818154790285585287083447455750564964755439725051904000000000000000000000000000000000000000e+75)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 6.9814423801545723353305894697802330693700024131737540066597268357120000000000000000000000000000000000000e+75)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 9.2379872707088650213961476468088967648845485386801302969710798700544000000000000000000000000000000000000e+75)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 8.6028610849707118786878466090726746922395786229117545420266938564608000000000000000000000000000000000000e+75)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 6.0438085338641386367983933867412545578566598680906745465073101805977600000000000000000000000000000000000e+75)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 3.3492380371843850750819852073737242436575952022390816483000346566721536000000000000000000000000000000000e+75)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.5102990983560640009327873678307954320470630605324516076646299828695859200000000000000000000000000000000e+75)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 5.6706536806860658574451791386582141941677796433514743219241257405513728000000000000000000000000000000000e+74)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.8043159910377823217375261881225863717725312218178043012454139087028224000000000000000000000000000000000e+74)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 4.9335160303959039103395501372789994167981664930485977399292586960638443520000000000000000000000000000000e+73)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.1723691196565373582067598608574778201485664959896330847068435199126667264000000000000000000000000000000e+73)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.4438352206893499975371296011596621640882812103203541286914698812249866240000000000000000000000000000000e+72)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 4.5035118941062978428961903224471555396129604077556196563177106772688896000000000000000000000000000000000e+71)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 7.3850308579063636618912025850466431356280013115826126911230283854233600000000000000000000000000000000000e+70)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.0836900819838640440767313247219165663768918429617679815795491004563456000000000000000000000000000000000e+70)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.4298706038662999363673291534756645260294395901949985216872998030991360000000000000000000000000000000000e+69)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.7034492632938290783198763770876160868300549275946097010473332643840000000000000000000000000000000000000e+68)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.8389252775111283069889631347879462661235829004870041197088140774400000000000000000000000000000000000000e+67)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.8045026245181087909282578887424942187415211828585867350357833779200000000000000000000000000000000000000e+66)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.6139415015963261948795856116734033680672939822172300204078108032000000000000000000000000000000000000000e+65)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.3187949670862787149323475106066210874520928766305564723661651200000000000000000000000000000000000000000e+64)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 9.8652947935638867544975258598123447770317269214048194873129760000000000000000000000000000000000000000000e+62)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 6.7677767608518504817918794029244339508807996285424723220104640000000000000000000000000000000000000000000e+61)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 4.2641467556495415387682543812562093348191054073538914270730400000000000000000000000000000000000000000000e+60)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.4706517237142185424284275343767027578875512836847707758280000000000000000000000000000000000000000000000e+59)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.3177422716201009039921461100044177449498643771855331909700000000000000000000000000000000000000000000000e+58)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 6.4750611894960504179018603471357527802382408288670161342000000000000000000000000000000000000000000000000e+56)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.9330478552107545132079399426533304480054308936780642545000000000000000000000000000000000000000000000000e+55)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.2252899213008209896248783169149861832238011945022246000000000000000000000000000000000000000000000000000e+54)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 4.7217402128877734970019794026056267173695376012268710000000000000000000000000000000000000000000000000000e+52)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.6785124525594845202965146591601984920001061237741320000000000000000000000000000000000000000000000000000e+51)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 5.5034829951836538559219701088754272365603191632587000000000000000000000000000000000000000000000000000000e+49)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.6637415534451225329152181513653760874075278100800000000000000000000000000000000000000000000000000000000e+48)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 4.6347190324222080575971451540788329488139570600000000000000000000000000000000000000000000000000000000000e+46)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.1887997793364622891010571019581486512880887480000000000000000000000000000000000000000000000000000000000e+45)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.8047716936655096027980248782543659943937913000000000000000000000000000000000000000000000000000000000000e+43)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 6.0790225058170194637643585929666817947860000000000000000000000000000000000000000000000000000000000000000e+41)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.2084757755139694726502828251712490452850000000000000000000000000000000000000000000000000000000000000000e+40)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.1993406165887949960123200495814460898000000000000000000000000000000000000000000000000000000000000000000e+38)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 3.6561413270081694853593737727970949550000000000000000000000000000000000000000000000000000000000000000000e+36)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 5.5369993949587931998758036774526800000000000000000000000000000000000000000000000000000000000000000000000e+34)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 7.6151991880839964140266135934090000000000000000000000000000000000000000000000000000000000000000000000000e+32)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 9.4760566491969897737280290058600000000000000000000000000000000000000000000000000000000000000000000000000e+30)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.0621766041618690022809397383500000000000000000000000000000000000000000000000000000000000000000000000000e+29)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.0668475851162648374876202000000000000000000000000000000000000000000000000000000000000000000000000000000e+27)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 9.5410679744103301927030500000000000000000000000000000000000000000000000000000000000000000000000000000000e+24)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 7.5395191798636166637180000000000000000000000000000000000000000000000000000000000000000000000000000000000e+22)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 5.2147541393617700530500000000000000000000000000000000000000000000000000000000000000000000000000000000000e+20)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 3.1197409850631024000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+18)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.5899910954161520000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+16)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 6.7660425636804000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+13)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.3384219373900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+11)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 6.3043596000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+08)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.2435500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+06)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.5960000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00)) + }; + return boost::math::tools::evaluate_rational(num, denom, z); + } + + template + static T lanczos_sum_expG_scaled(const T& z) + { + static const T num[58] = { + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.9525834451195623352844833708766019251484824420589901934439764663785971607902920873854007890984226025387e+75)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 3.5353913226536305547742063023255223178577430351061832712694094731916543407128432857596013878418835545541e+75)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.0794265040063864629969189140227704423008747481150565046014672784314863153912417986968014303182196879938e+75)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 8.0079363228400099355108372825384509227179448653556047031855632715439781114354847693263728085548142549876e+74)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.2707926617939589278984760255796767920967443801395440059906534121478842405887081438764736244178311493742e+74)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 5.0558467715603214792617326562510713807234351435955730720590956416562782623810902927804516780978093617536e+73)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 9.2033080198136382677487341183423922900647133007317553822084317473855699622210307747112227636535549617309e+72)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.4083202075984620999390260696805188384092629914880295342492703293697714617999890327029040466923272486691e+72)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.8486472680848031160157166025706272700120860759432294711200940780548927766558565495831077710008357816723e+71)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.1138175900123376987163744326763008390621758864911227853169463977789770550938948181501331329408292888705e+70)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.1308645173446504769606114641352353002279158988307024846586220931944095152963117782251173128553590002677e+69)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.9120324679281068850671805700697238886511656051607969710283305054986370771314011765262161774820057407221e+68)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.5391934623114467787956807868296099285488891013887607698670475417480968323895750297127042280725645864237e+67)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.1188472337439846560727348944974065682611782369759313015986429928637543111162293072546541343053710871237e+66)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 7.3839859706266764054133980098731552638450995195061568584278432933554090666516712057667084959928750476621e+64)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 4.4447818108967399523602631725512074937872788923328188245441957349314890139383300142665492699548078016636e+63)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.4499038978543131336483547267337201487870950383856380855972848092343622627255235050078874464565496828787e+62)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.2406238713440761680092008034709525627435037404776653076097934320335762078719054009676170121443275896208e+61)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 5.7885604418978046593206212118683810887087891637289025925672325034976573417819599577035132403057170493687e+59)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.4946595358499347633866345682061171079599164941304972231143049023731630101503606670560705515260702923050e+58)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 9.9513336364509343072555606544850997149882112871146960235297930573184577313990835201997736426755771031690e+56)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 3.6810080403717774179828377811768440096006474456859136430725963485797286723671499145937476199781240726843e+55)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.2645506501577530162354586527854723438171436013868785795302304165655061134281691393986730787208175906833e+54)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 4.0397326173536285938710693563469993609385607650335155744195392582126325319144559249104863671555936627244e+52)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.2013871048927633852181093624593869925193443374649283179426834256685646298857112848793626713837584764108e+51)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 3.3289402473981501234144402953028274630427307351359919167469712295902671507115725494100349633541940933204e+49)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 8.6003893195733192859177412982185685700998370832033861854329854490539688708839874262744736474012759445436e+47)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.0727066732760648460132569879963196679351152547539542083857690449447906448979182035004975167951264229374e+46)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 4.6613224093786683644702502032231164856098499632779487718555251290733786904948988026020403761370171127380e+44)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 9.7837068244515233545220503730640329863081890096623187288769939552653286719974960799952261791747246686408e+42)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.9165522010589216370481372290739111949387650621903781998282461665273890471374114621564713215060999778073e+41)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 3.5033963322756782307786713227898388231893223357237704976668993902202940789294809098147971301691772648755e+39)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 5.9740002270190565366640741207315377496247453294707036602010614289735470303392852115947439612907179897898e+37)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 9.4979501813196320177935632677278886186231320810970746337833403723731191512041559167496248429116298871699e+35)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.4069761263574572480694806529063097871169957005541147202721661005052475351188525148368053997631136759790e+34)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.9402465143351975112300028774197323450509816779255592414045815705522691518043705429706146342655130265366e+32)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.4881313407932962145111410344090747527354995727266179099775181263231061106933689865989301929428200117871e+30)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.9632810384855297696182113289305607179489664745076688933167066674562917487536504070129264115660678482556e+28)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 3.2725546854039254943463934183457508258081242388204842730157719983831445104894295952204798603845536120509e+26)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 3.3452549409942328202733488146109233160716224388189413469297783823577482916724384652184656289642575364301e+24)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 3.1584981954307469031764309294640361429335538748027906889408285804565757617154922327898215115914925102238e+22)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.7477051072463293412749200465569024873771231987242784210248733085001441979676968452992807610739566040156e+20)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.1960928676322401992340089643560231337218499440045721085448636142070840811937842162960498037401931828261e+18)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.6071958343894951054088987834710923196788323800906338042869660264064639861175574231931711270452905023878e+16)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.0728148958446892912836806181637101367297983133466225777574815613761623459000110314136961372678097371209e+14)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 6.5016195836538037540865015222440859129132562974585463183411281203357391116994585543064375504964287033151e+11)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 3.5579194627421707093560391662678700402228252243270030776955569538161088100804816540797427121002521848777e+09)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.7467358958842104945974935265631802960291549549388120971605962335321138414180962067591937089645593587253e+07)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 7.6332135345687020156244092536439323519014928693505240553789259043703120308196994214855462894182573058664e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.9407647340128848401194943791119430377408353392667765444895085026094746239619902099149777694224783951328e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 9.8689665916105177080976558363071196803124010350312199134246436579120098844674440713135687985135098450472e-01)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.8410303167649082918635413442316246381709300383012975083202578569099476956148029095902566747899894260699e-03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 6.8751938471236167190844006303614257144787097468775849169694452270347666880072332030058767126104666814717e-06)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.3602697452963248452045411104106027969968697679097453973063118187262717386356657326020477164267694748313e-08)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.1131092239698914177951080885440635365109643513308304020521218234027520232780450142616357759194523396831e-11)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.4171068051802330111071549877540818528598812224565937952488425520621143590937182779724061728889603469712e-14)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.8102465534711886967772860840717324393645550944967932350301450628070653877586909697550907928519183677886e-17)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 6.6595873110837641575235810188999693348770063449340247652053167124146826554900758076335155425689417108046e-21)) + }; + static const T denom[58] = { + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 7.1099858780486345185404564746372494973649797888116845868744704000000000000000000000000000000000000000000e+74)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 3.2787481989562818154790285585287083447455750564964755439725051904000000000000000000000000000000000000000e+75)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 6.9814423801545723353305894697802330693700024131737540066597268357120000000000000000000000000000000000000e+75)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 9.2379872707088650213961476468088967648845485386801302969710798700544000000000000000000000000000000000000e+75)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 8.6028610849707118786878466090726746922395786229117545420266938564608000000000000000000000000000000000000e+75)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 6.0438085338641386367983933867412545578566598680906745465073101805977600000000000000000000000000000000000e+75)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 3.3492380371843850750819852073737242436575952022390816483000346566721536000000000000000000000000000000000e+75)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.5102990983560640009327873678307954320470630605324516076646299828695859200000000000000000000000000000000e+75)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 5.6706536806860658574451791386582141941677796433514743219241257405513728000000000000000000000000000000000e+74)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.8043159910377823217375261881225863717725312218178043012454139087028224000000000000000000000000000000000e+74)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 4.9335160303959039103395501372789994167981664930485977399292586960638443520000000000000000000000000000000e+73)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.1723691196565373582067598608574778201485664959896330847068435199126667264000000000000000000000000000000e+73)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.4438352206893499975371296011596621640882812103203541286914698812249866240000000000000000000000000000000e+72)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 4.5035118941062978428961903224471555396129604077556196563177106772688896000000000000000000000000000000000e+71)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 7.3850308579063636618912025850466431356280013115826126911230283854233600000000000000000000000000000000000e+70)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.0836900819838640440767313247219165663768918429617679815795491004563456000000000000000000000000000000000e+70)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.4298706038662999363673291534756645260294395901949985216872998030991360000000000000000000000000000000000e+69)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.7034492632938290783198763770876160868300549275946097010473332643840000000000000000000000000000000000000e+68)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.8389252775111283069889631347879462661235829004870041197088140774400000000000000000000000000000000000000e+67)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.8045026245181087909282578887424942187415211828585867350357833779200000000000000000000000000000000000000e+66)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.6139415015963261948795856116734033680672939822172300204078108032000000000000000000000000000000000000000e+65)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.3187949670862787149323475106066210874520928766305564723661651200000000000000000000000000000000000000000e+64)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 9.8652947935638867544975258598123447770317269214048194873129760000000000000000000000000000000000000000000e+62)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 6.7677767608518504817918794029244339508807996285424723220104640000000000000000000000000000000000000000000e+61)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 4.2641467556495415387682543812562093348191054073538914270730400000000000000000000000000000000000000000000e+60)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.4706517237142185424284275343767027578875512836847707758280000000000000000000000000000000000000000000000e+59)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.3177422716201009039921461100044177449498643771855331909700000000000000000000000000000000000000000000000e+58)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 6.4750611894960504179018603471357527802382408288670161342000000000000000000000000000000000000000000000000e+56)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.9330478552107545132079399426533304480054308936780642545000000000000000000000000000000000000000000000000e+55)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.2252899213008209896248783169149861832238011945022246000000000000000000000000000000000000000000000000000e+54)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 4.7217402128877734970019794026056267173695376012268710000000000000000000000000000000000000000000000000000e+52)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.6785124525594845202965146591601984920001061237741320000000000000000000000000000000000000000000000000000e+51)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 5.5034829951836538559219701088754272365603191632587000000000000000000000000000000000000000000000000000000e+49)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.6637415534451225329152181513653760874075278100800000000000000000000000000000000000000000000000000000000e+48)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 4.6347190324222080575971451540788329488139570600000000000000000000000000000000000000000000000000000000000e+46)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.1887997793364622891010571019581486512880887480000000000000000000000000000000000000000000000000000000000e+45)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.8047716936655096027980248782543659943937913000000000000000000000000000000000000000000000000000000000000e+43)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 6.0790225058170194637643585929666817947860000000000000000000000000000000000000000000000000000000000000000e+41)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.2084757755139694726502828251712490452850000000000000000000000000000000000000000000000000000000000000000e+40)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.1993406165887949960123200495814460898000000000000000000000000000000000000000000000000000000000000000000e+38)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 3.6561413270081694853593737727970949550000000000000000000000000000000000000000000000000000000000000000000e+36)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 5.5369993949587931998758036774526800000000000000000000000000000000000000000000000000000000000000000000000e+34)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 7.6151991880839964140266135934090000000000000000000000000000000000000000000000000000000000000000000000000e+32)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 9.4760566491969897737280290058600000000000000000000000000000000000000000000000000000000000000000000000000e+30)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.0621766041618690022809397383500000000000000000000000000000000000000000000000000000000000000000000000000e+29)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.0668475851162648374876202000000000000000000000000000000000000000000000000000000000000000000000000000000e+27)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 9.5410679744103301927030500000000000000000000000000000000000000000000000000000000000000000000000000000000e+24)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 7.5395191798636166637180000000000000000000000000000000000000000000000000000000000000000000000000000000000e+22)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 5.2147541393617700530500000000000000000000000000000000000000000000000000000000000000000000000000000000000e+20)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 3.1197409850631024000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+18)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.5899910954161520000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+16)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 6.7660425636804000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+13)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.3384219373900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+11)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 6.3043596000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+08)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.2435500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+06)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.5960000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00)) + }; + return boost::math::tools::evaluate_rational(num, denom, z); + } + + + template + static T lanczos_sum_near_1(const T& dz) + { + static const T d[57] = { + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.7428115435862376558997260696640294500966442454383057764865555979364261022425976429085092772284462056620e+01)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -2.9098470636910381824837046571049540905024165376037355421260734899535717859205986796003654941175663049821e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.3238837075893790405047962895917439384623673303456004530561387555917370190498457070337183015927777421697e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -1.1818710867341557832686340441113771687173935259473061186027784614571488561024113573068868892276452685792e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 4.2993023860235266500362186023069966658235478225844203105044378872946562122380318851444839578192967323002e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -1.1912180368478885109223112981184136172284705131966546680563227042436992258659147484337283480302880786198e+05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.6139396362168514560020167846095021752825297585055554665973631410697906644150591916500251626224775776603e+05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -4.6634802529570780684302635411632208905442609915247254971321402103134398787017804507333676554065934886041e+05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 6.8912442659385178766302183254171219505160153159736231877672680444314286802452078408167890642564966971613e+05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -8.5495375341789279888846473669676987489917192922529063440714880612919546655027506056499234132070763181503e+05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 8.9953131705119738082952990229447045802828349018683164227185193391425402046621590400831377644280156201943e+05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -8.0869264878440576629536295016426099545140305890893332059172420721937348112425650207439043097833689822279e+05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 6.2468943229845282686806294869840458047361754209121185638286960316366706592206130567941492816463381946909e+05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -4.1630054452110204332042164710368677551444071577885528134258060122924060097997330723219233292551334541916e+05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.3999790605522096466954112874401964638803242076322683502391870253501264993933977365040197484368089793844e+05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -1.1989159366950562464845132094716096217280130489202748985857413544679377185401912495211215199827572320658e+05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 5.1934569461829331860249338515130842345952840084924773082558044904616988546739452572774668343010410556738e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -1.9504509773595632752455387440694137287105978110568834596383152715430739170438241704706104769027458757024e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 6.3443645806133388465801728173699557032879027729815842645734341879259895367471331502957361274245333765268e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -1.7841389657268783911632604958857419096159175608100099391870386517930613345705029477317961997797817456392e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 4.3263071690820256271926147120746615152585668319664536987434389730938667811945831461118672855948398156120e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -9.0147093132626919930705734140711481562906727339902047165060887486522943229634999363817715017657681660287e+01)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.6071102334369619355078667017356321869894503980205853863658685021270881486705453945159213607404060788769e+01)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -2.4383630842681764529222336922814378927628353308340684972787496418846394508904604721467821529575751627808e+00)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 3.1286133930578257063116405165630725640730704580877093703762851704304775232899279568326548372516108061737e-01)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -3.3692644530387989631839105618463769604011314569959807313957135524319268073994325844277072212634894718838e-02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 3.0185001434002208420172349105229077528666279911019323889220715333407026262532945659702898548882557288755e-03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -2.2263062380436433070464690537097677591705999260831413712451347815254366329816629201276858957857633159301e-04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.3353139137616007516399230327860238131259262384241927446052286747295202825849286263834250215682608257253e-05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -6.4195296490132509971486202730620553572364290374630355485943647261186824263045109480840776574102283117802e-07)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.4317122347228636250935502644177076353230092364254437169086888072416523402594888598203831115818706298660e-08)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -7.1116401895712757982110113602984617019673481361481571387831251493876840058692034827601429496435585930404e-10)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.5670513725610592064219547014678059161831695745208975662601768645833855387548399162792665797683105415471e-11)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -2.5260646573782426214538742421235036428884108667170155792319000553615370065204316405736286181192562052741e-13)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.8733941140402994491303889414468143535352703737984260742434438594748723811519620261843045417069155536008e-15)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -2.2056577386533803436177435861654503857156683256162837031477537088773467287029340043192251326622052870465e-17)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.0800931908111468667692114269177968638854301916581458483888602672737990097921789711610932672475861001994e-19)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -3.1394496063229749361320583264730160299755358905685423988290847461006304721866926670065937080941317261860e-22)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 4.9274792450690899704710418936228583371317511924974285800543619049655797337986789330520046119470213637029e-25)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -3.6755223694460581147198804301148887855673388834174147952660909117310772380696272509534022412162907695615e-28)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.0900225572290190698649005514102451202434886376168031607266730359956445823401555519988657304185446296554e-31)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -9.9024654365441546862123770751558932020185466144030552444525982172062830502919077739315180881006251414076e-36)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.8401409342622593684683418781548298452423138616374012775158698166549875044639516398318322746270349752685e-40)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -3.5509630598854356990909041057867643490325454268799807828321700754551551638916414252086883229952366535870e-46)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.9657368621557895021941755410664403576678059155205990324521617023894341207730153756506985102036313160050e-53)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 8.1241524357510805548447946933511907560696760445486904751298400852883111381333879290886698299626153350908e-56)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -4.7964162808880362344077245029516705444495147547810713281233063336303852616170950226238109362470235010501e-56)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.4347533225708328774658804669618167169988215409141087123873615495103598105335608364600471221104934664685e-56)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -1.0479456512751620605515259329413452300868549663188231386090986433707412031359388913176316853836715844262e-56)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 3.7702413521297716432095744498633554542922110264197418721766960511801656053258128107225421844535437414965e-57)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -1.1172472608352701420007786830697096251191397605488453881854169564652213625087310098345004527869954910248e-57)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.6812745632569367999094411216914045337299158629329933113885292569194336792226670477775358040058394820261e-58)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -5.0940899331938988550733986571553993560122282178667089274000678435292023664866549561623149093538369388095e-59)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 7.3990413208296530427672464741601390159299766279095164840741566288983363882627013060272921361169788365065e-60)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -7.7457129143553309783200493485805274806723421714099516756842649457968744562118823820376006640033350414786e-61)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 5.2197041624023821332095587670691140585500743194040476924703015039327636848179534186153838408314119752602e-62)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -1.7047723462914761686649775942852334082321432815609988664912617018852671864913042227323649381537503179251e-63)) + }; + T result = 0; + for (unsigned k = 1; k <= sizeof(d) / sizeof(d[0]); ++k) + { + result += (-d[k - 1] * dz) / (k * dz + k * k); + } + return result; + } + + template + static T lanczos_sum_near_2(const T& dz) + { + static const T d[57] = { + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 3.1662905928411697905258405605703584854097058546117590807018322943510409180314506715189727704455120038255e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -5.2865276330524469503633315971419666291446796012439883450060362841602955272110829770969508625348151344110e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 4.2219660233923727011658095806761811032946810239961697070082822527681712138952842835075740681056558805545e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -2.1471898769829091933140257345448028662421485176900416920959625594396387278224755880120811584841740984425e+05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 7.8108506629663017023576288202278104175560258464862168051112507988271579950339846330515110250714726935097e+05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -2.1641711509053717182383657533380473756042975817599106212749608660372803916254884680397716414106410031258e+06)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 4.7489314096332467747675642425312337606864580547949737826112168114861342185432170188369658631861013639815e+06)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -8.4724786849037234839356479194796060821229710729537665905710787287944594232273268923957076043820505152123e+06)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.2519817172723530341690766298268651248835138906207131843033724432774951682486028564360090931772389689559e+07)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -1.5532557359535150161664447223551521375257233550726531311510295929236015954526292484349276082718903034254e+07)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.6342429895113330905046033016646335037353665731613082814708242545769972330151611687916571207590466290675e+07)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -1.4692098728454232462170975109580416322729103219472916098312631671127459727620998375190829900768135597920e+07)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.1349180467693002337442162064332669746019375174297711955789632954762786417078957693464106665366428215075e+07)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -7.5632302457640823075347957970491681679223652407676639065204661139779189254891918422939089928834865040327e+06)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 4.3602139028787279699176338906645576475531513654199858202869033753097108161316098377414795783646795195944e+06)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -2.1781564770643699404196555460989570673904909639666069579972319801392840126860473187109481731392038690946e+06)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 9.4353253130211266653540571778153094858600293629830279655688388322741879148986220244682882658942335696445e+05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -3.5435240282512309592551076592408102377879926851607713336111442642626445924365822019934119240733876795141e+05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.1526261667865026060062626782458367235346781022115660163078870751778821943822555542992468135865376114967e+05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -3.2413730814968410697200758155304075536237935327710818457186113369696959175294570307981528264101370866348e+04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 7.8599121870734324248863589686279377309239133065805881581800599402339736200679855503773749459170204132791e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -1.6377668257261558531404127005983837331367557885561101077531977908963614729639690754651655156526373276599e+03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.9197523005380738606902261922935494412976764483416941348495962454277708460181544072006267228271644673220e+02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -4.4299489087401028354837196175165054006400597113077360830473379437347868849689360216846724154620950362855e+01)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 5.6839760968600182694175565648725095464923929298411152920412000388870216851203160830044900161240884736073e+00)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -6.1211841186792218837353890586540028399627732652134291573554656108241153104326807995702108419307165078338e-01)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 5.4839254672775355063516929562453773790762108550565402409275434242243168512055903461692839292134763272349e-02)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -4.0446900436498039824930882038167913752019117688189621941029942455212255095042589886820040572146790228293e-03)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.4259604540679199219674266589960434988970631237379997092121152488502215342212782655207033499356597207732e-04)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -1.1662819432736824144566608258931608012907080530838741239388324423687927670373421600053389501450361346193e-05)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 4.4178658338791266451928074758746505934456557516996342163398372684287698861436808924171077524254379083060e-07)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -1.2920226237184384323812413019935857990607979507557513737013812388314162555859654820969350110668735340875e-08)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 2.8469744980165771885329432448423013838689752067078815649758371478630140330027362965330275099502650356588e-10)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -4.5892826398814320794517525606378651211265264604594412375068674574147845337527175224917342725746156587979e-12)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 5.2203009477948187935105053137418678388241808213010074775815651125432941229706488789085110080538814893051e-14)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -4.0071764354709508994124453699849221531650525550222671429443364906737525324879927767883427021892836113984e-16)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.9622826817063220108064709012206725989960307918188611950534485874633362779114658729325037773191270734438e-18)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -5.7036630218461017970632409261270377964650553992557669797810281540623485979537248227679839983488911988094e-21)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 8.9521045677595146905259180949264876791866636312953998390445326640202924376790113203607493358448772833037e-24)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -6.6775848168912941217401852995810450906306734023598389296925437100201008270660133423441040356945585338087e-27)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.9803220730550206978978787593484142931342246644534949059896766020244771367805337770466949634458076040872e-30)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -1.7990518408632014329157379404081596938445109431006332980973114098434711412087164821902160534448534060827e-34)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 3.3431158699278209062613044372715762567352361096055698830148755308547762997581572887297656338501121085689e-39)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -6.4512889953126515222750706142725047033542840408835574821053782432341231211557553861105639807627133237603e-45)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 3.5712949902991134825521996829159928713052863755852691744249239606303690103524531369836280748984998481830e-52)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.4759729775024569614177814940895080213705811461280570147704308137991423094447188671055911764625031287276e-54)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -8.7139930908855290554513295892599839263800779861752158476251019536427498588557825717368115652274945883813e-55)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 4.4233907960475632932218656634142149345608818585031048657672084471779614927408553135306513446078671755098e-55)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -1.9038779434600254520302015223066920881918842711110146920259738288262023701119647715089263879918197432213e-55)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 6.8496675787588211884718935004472008052724911912938728434253127344504858415646126692300012586778132949530e-56)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -2.0297831425771921486916100519977404266947748691416922167961096320991761190057145636867796238254884443749e-56)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 4.8712635957157169685941764659378666193084431023269775678410920776942423498574161990151090862987707496709e-57)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -9.2547981414954593575052648297803007916203550348517241024188916829704035005537638171060497453987203484125e-58)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 1.3442368462845102652888331895188311507347132911248615838604886657492687976498041391593065929847726694329e-58)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -1.4072191583666827552083642053400837423373421659342004966749178938352282349787956685790064733145823615594e-59)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, 9.4830105111768027064991929773116440103527225991506525293838437779387018237471847818347678097555938325901e-61)), + static_cast(BOOST_MATH_BIG_CONSTANT(T, 334, -3.0971820578438671326698299395846141298596444280876893045395714232857615676238866889122426000206260012404e-62)), + }; + T result = 0; + T z = dz + 2; + for (unsigned k = 1; k <= sizeof(d) / sizeof(d[0]); ++k) + { + result += (-d[k - 1] * dz) / (z + k * z + k * k - 1); + } + return result; + } + + static double g() { return 4.7377167968750001136868377216160297393798828125000000000000000000000000000000000000000000000000000000000e+01; } +}; + // // placeholder for no lanczos info available: @@ -1269,7 +3234,13 @@ typedef mpl::list< /* lanczos13, */ lanczos17m64, lanczos24m113, - lanczos22, + lanczos22, + lanczos32MP, + lanczos35MP, + lanczos48MP, + lanczos49MP, + lanczos49MP_2, + lanczos58MP, undefined_lanczos> lanczos_list; template diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 5583bcfa2..95d51dbb1 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -174,6 +174,7 @@ test-suite special_fun : [ run test_expint.cpp test_instances//test_instances pch_light ../../test/build//boost_unit_test_framework ] [ run test_factorials.cpp pch ../../test/build//boost_unit_test_framework ] [ run test_gamma.cpp test_instances//test_instances pch_light ../../test/build//boost_unit_test_framework ] + [ run test_gamma_mp.cpp ../../test/build//boost_unit_test_framework : : : release ] [ run test_hankel.cpp ../../test/build//boost_unit_test_framework ] [ run test_hermite.cpp test_instances//test_instances pch_light ../../test/build//boost_unit_test_framework ] [ run test_ibeta.cpp test_instances//test_instances pch_light ../../test/build//boost_unit_test_framework diff --git a/test/test_1F1.cpp b/test/test_1F1.cpp index df920febf..b8d1af380 100644 --- a/test/test_1F1.cpp +++ b/test/test_1F1.cpp @@ -62,7 +62,7 @@ void expected_results() ".*", // platform "dec_40", // test type(s) "Large.*", // test data group - ".*", 20000000L, 610000L); // test function + ".*", 20000000L, 650000L); // test function add_expected_result( ".*", // compiler ".*", // stdlib diff --git a/test/test_gamma_mp.cpp b/test/test_gamma_mp.cpp new file mode 100644 index 000000000..f5da84e9e --- /dev/null +++ b/test/test_gamma_mp.cpp @@ -0,0 +1,179 @@ +// Copyright John Maddock 2006. +// Copyright Paul A. Bristow 2007, 2009 +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#define BOOST_MATH_OVERFLOW_ERROR_POLICY ignore_error + +#define BOOST_TEST_MAIN +#include +#include +#include +#include +#include +#include +#include +#include +#include "functor.hpp" + +#include "handle_test_result.hpp" +#include "table_type.hpp" + +#ifndef SC_ +#define SC_(x) static_cast::type>(BOOST_STRINGIZE(x)) +#endif + +template +void do_test_gamma(const T& data, const char* type_name, const char* test_name) +{ +#if !(defined(ERROR_REPORTING_MODE) && (!defined(TGAMMA_FUNCTION_TO_TEST) || !defined(LGAMMA_FUNCTION_TO_TEST))) + typedef Real value_type; + + typedef value_type (*pg)(value_type); +#ifdef TGAMMA_FUNCTION_TO_TEST + pg funcp = TGAMMA_FUNCTION_TO_TEST; +#elif defined(BOOST_MATH_NO_DEDUCED_FUNCTION_POINTERS) + pg funcp = boost::math::tgamma; +#else + pg funcp = boost::math::tgamma; +#endif + + boost::math::tools::test_result result; + + std::cout << "Testing " << test_name << " with type " << type_name + << "\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"; + + // + // test tgamma against data: + // + result = boost::math::tools::test_hetero( + data, + bind_func(funcp, 0), + extract_result(1)); + handle_test_result(result, data[result.worst()], result.worst(), type_name, "tgamma", test_name); + // + // test lgamma against data: + // +#ifdef LGAMMA_FUNCTION_TO_TEST + funcp = LGAMMA_FUNCTION_TO_TEST; +#elif defined(BOOST_MATH_NO_DEDUCED_FUNCTION_POINTERS) + funcp = boost::math::lgamma; +#else + funcp = boost::math::lgamma; +#endif + result = boost::math::tools::test_hetero( + data, + bind_func(funcp, 0), + extract_result(2)); + handle_test_result(result, data[result.worst()], result.worst(), type_name, "lgamma", test_name); + + std::cout << std::endl; +#endif +} + +template +void test_gamma(T, const char* name) +{ + // + // The actual test data is rather verbose, so it's in a separate file + // + // The contents are as follows, each row of data contains + // three items, input value, gamma and lgamma: + // + // gamma and lgamma at integer and half integer values: + // boost::array, N> factorials; + // + // gamma and lgamma for z near 0: + // boost::array, N> near_0; + // + // gamma and lgamma for z near 1: + // boost::array, N> near_1; + // + // gamma and lgamma for z near 2: + // boost::array, N> near_2; + // + // gamma and lgamma for z near -10: + // boost::array, N> near_m10; + // + // gamma and lgamma for z near -55: + // boost::array, N> near_m55; + // + // The last two cases are chosen more or less at random, + // except that one is even and the other odd, and both are + // at negative poles. The data near zero also tests near + // a pole, the data near 1 and 2 are to probe lgamma as + // the result -> 0. + // +# include "tgamma_mp_data.hpp" + + do_test_gamma(factorials, name, "factorials"); + do_test_gamma(near_0, name, "near 0"); + do_test_gamma(near_1, name, "near 1"); + do_test_gamma(near_2, name, "near 2"); + do_test_gamma(near_m10, name, "near -10"); + do_test_gamma(near_m55, name, "near -55"); +} + +void expected_results() +{ + // + // Define the max and mean errors expected for + // various compilers and platforms. + // + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + "number >", // test type(s) + ".*", // test data group + "lgamma", 9000, 4000); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + "number >", // test type(s) + ".*", // test data group + "lgamma", 60000, 20000); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + "cpp_bin_float_100|number >", // test type(s) + ".*", // test data group + "lgamma", 600000, 300000); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*", // test data group + "lgamma", 4800, 2500); // test function + add_expected_result( + ".*", // compiler + ".*", // stdlib + ".*", // platform + ".*", // test type(s) + ".*", // test data group + "[tl]gamma", 100, 50); // test function + // + // Finish off by printing out the compiler/stdlib/platform names, + // we do this to make it easier to mark up expected error rates. + // + std::cout << "Tests run with " << BOOST_COMPILER << ", " + << BOOST_STDLIB << ", " << BOOST_PLATFORM << std::endl; +} + +BOOST_AUTO_TEST_CASE(test_main) +{ + expected_results(); + using namespace boost::multiprecision; + test_gamma(number >(0), "number >"); + test_gamma(number >(0), "number >"); + test_gamma(cpp_bin_float_50(0), "cpp_bin_float_50"); + test_gamma(number >(0), "number >"); + test_gamma(number >(0), "number >"); + test_gamma(number >(0), "number >"); + test_gamma(number >(0), "number >"); + test_gamma(cpp_bin_float_100(0), "cpp_bin_float_100"); +} diff --git a/test/tgamma_mp_data.hpp b/test/tgamma_mp_data.hpp new file mode 100644 index 000000000..390286f65 --- /dev/null +++ b/test/tgamma_mp_data.hpp @@ -0,0 +1,417 @@ +static const boost::array, 198> factorials = { + SC_(1), SC_(1), SC_(0), + SC_(2), SC_(1), SC_(0), + SC_(3), SC_(2), SC_(0.69314718055994530941723212145817656807550013436025525412068000949339362196969471560586332699641868754200148102), + SC_(4), SC_(6), SC_(1.7917594692280550008124773583807022727229906921830047058553743431308879151883036824794790818101507763299715101), + SC_(5), SC_(24), SC_(3.1780538303479456196469416012970554088739909609035152140967343621176751591276931136912057358029881514139744721), + SC_(6), SC_(120), SC_(4.7874917427820459942477009345232430483995923151720329360093822535918541468353508783213396138961677622139407751), + SC_(7), SC_(720), SC_(6.5792512120101009950601782929039453211225830073550376418647565967227420620236545608008186957063185385439122852), + SC_(8), SC_(5040), SC_(8.5251613610654143001655310363471250507596677369368988303241467466603219247757238285884771942941900655369739794), + SC_(9), SC_(40320), SC_(10.604602902745250228417227400721654754986168140017664592686186775140502790684807975406067175283446128162978423), + SC_(10), SC_(362880), SC_(12.801827480081469611207717874566706164281149255663163496155575442415491377122025909153298684910910305738918481), + SC_(11), SC_(3628800), SC_(15.104412573075515295225709329251070371882250744291936472188903343383063986799378389389295890000508604080886265), + SC_(12), SC_(39916800), SC_(17.502307845873885839287652907216199671703957598229353647407471052513637610712615102464350598003143395495601991), + SC_(13), SC_(479001600), SC_(19.987214495661886149517362387055078512502448424772613607383525405137919147870613500549693006809712859367574982), + SC_(14), SC_(6227020800), SC_(22.552163853123422885570849828620397117307716369532820723802570915801383815195023679949267670250202348136833174), + SC_(15), SC_(87178291200), SC_(25.191221182738681500093434693521753415020301233474937166382641075232357299916787663342789495834492562671896349), + SC_(16), SC_(1307674368000), SC_(27.899271383840891566089439263670466759193393145566204340029983300344030580843054394846539128741404262259832681), + SC_(17), SC_(20922789888000), SC_(30.671860106080672803758367749503173031495393683007225356512703338317605068721833257269992436727079012427838605), + SC_(18), SC_(355687428096000), SC_(33.505073450136888884007902367376299567083596695592970143809941076199897644522764538182087304764581959946186867), + SC_(19), SC_(6402373705728000), SC_(36.395445208033053576215624962679527544454077945598724301400009752968279852929677187535182141388464825064128406), + SC_(20), SC_(121645100408832000), SC_(39.33988418719949403622465239456738108169145720689785311993796998937757255499387447624934052520420472086116904), + SC_(21), SC_(2432902008176640000), SC_(42.335616460753485029659875970709921857368058829886881350091977899838538786640921672091201057290221706745138305), + SC_(22), SC_(51090942171709440000), SC_(45.380138898476908026160473951075627291652634117291491990286062383413612942611599906752475310691825322526170028), + SC_(23), SC_(1124000727777607680000), SC_(48.471181351835223879639649650498933159549841105589164419625310102037580188494531335433393345690878801482887235), + SC_(24), SC_(25852016738884976640000), SC_(51.606675567764373570446402482309129277992221420429600161623945479520573434479329633631794437843873615837084448), + SC_(25), SC_(620448401733239439360000), SC_(54.784729398112319190093344083606184686866212381333115375720679841638248593607022747323000173646861767251058921), + SC_(26), SC_(15511210043330985984000000), SC_(58.003605222980519939294862750058559965917415089870150819545975624586606569022338276583267929833220988850991527), + SC_(27), SC_(403291461126605635584000000), SC_(61.2617017610020019847655823130820551387981831689906131900857011447434648583164431715887059202701291651622512), + SC_(28), SC_(10888869450418352160768000000), SC_(64.557538627006331058951318023849632252740654842458861545289784145655947737972270072209553184711325431526161287), + SC_(29), SC_(304888344611713860501504000000), SC_(67.889743137181534982891135010209165118528739840761233241990534314580314844663728771208938337292034333603225943), + SC_(30), SC_(8841761993739701954543616000000), SC_(71.257038967168009010074407042571076724023252754683977320912204666223095625801581104502305452109890756249225528), + SC_(31), SC_(265252859812191058636308480000000), SC_(74.658236348830164385487643734177966636271844801135499748680226900828162528697542551611918412013221143379163341), + SC_(32), SC_(8222838654177922817725562880000000), SC_(78.092223553315310631416808058720323846721783731616091720436944973303143945295093783825783243349307773952140278), + SC_(33), SC_(263130836933693530167218012160000000), SC_(81.557959456115037178502968666011206687099284403417367991040345020770112055143567361855099878331401211662147683), + SC_(34), SC_(8683317618811886495518194401280000000), SC_(85.054467017581517413960157480898861691568481815177534617993607063538179972275413041803770341147768091864833438), + SC_(35), SC_(295232799039604140847618609643520000000), SC_(88.580827542197678803626924220230164795232184962123534659411524810913866170046039038321728536181689726925183181), + SC_(36), SC_(10333147966386144929666651337523200000000), SC_(92.136175603687092483333036296899532164394871045973913569783562852325625020505766070739520912862740864718211178), + SC_(37), SC_(371993326789901217467999448150835200000000), SC_(95.719694542143202484957991013660936709840852430339922981494311538587400850882373435698479076483042417378154198), + SC_(38), SC_(13763753091226345046315979581580902400000000), SC_(99.330612454787426929326086684692383873740930017507559145139224219780390597872734501097500610155211078159963151), + SC_(39), SC_(523022617466601111760007224100074291200000000), SC_(102.96819861451381269875234623803841397905380941316694321779786446568307692190662650541752232096736966149900526), + SC_(40), SC_(20397882081197443358640281739902897356800000000), SC_(106.63176026064345912620107891652625828850656791574989978595160430998403588244964565169071273922159123905623349), + SC_(41), SC_(815915283247897734345611269596115894272000000000), SC_(110.32063971475739542905353461412697563225866967309918327022629222993839573606638756313843659830402691248220423), + SC_(42), SC_(33452526613163807108170062053440751665152000000000), SC_(114.03421178146170323292029798716438322063508014249848490384555514019837435247204506910075373967601372352019472), + SC_(43), SC_(1405006117752879898543142606244511569936384000000000), SC_(117.77188139974507153883812808898826522299515556426335079816031963326684213041241801936789132007403602684322793), + SC_(44), SC_(60415263063373835637355132068513997507264512000000000), SC_(121.53308151543863396231097060233411225855429174914490621335200489818970130428540445790548331815803331374073361), + SC_(45), SC_(2658271574788448768043625811014615890319638528000000000), SC_(125.31727114935689512520737842321559469452699887180283389681193262630706217213803060219226468015350548023945229), + SC_(46), SC_(119622220865480194561963161495657715064383733760000000000), SC_(129.12393363912721488259862823028683374334758134171685052219396918505622974628290630056963006787414926861535866), + SC_(47), SC_(5502622159812088949850305428800254892961651752960000000000), SC_(132.95257503561630988282261318355520642986546179091754151831328457203261661423739931437389448702356277051155735), + SC_(48), SC_(258623241511168180642964355153611979969197632389120000000000), SC_(136.80272263732636846964356385332738013876151229293776555151379291883943482774320038698458424045830875146800892), + SC_(49), SC_(12413915592536072670862289047373375038521486354677760000000000), SC_(140.67392364823425939870773757608261211571100338820153601973120729045050360884058821628165330325771559042398488), + SC_(50), SC_(608281864034267560872252163321295376887552831379210240000000000), SC_(144.56574394634488600891844306296897157498517284736525839664998759032566333434472675185697030043345864441010827), + SC_(51), SC_(30414093201713378043612608166064768844377641568960512000000000000), SC_(148.47776695177303206753719385087952342211187569026254909459596338276741493172973699672310138361623655355204235), + SC_(52), SC_(1551118753287382280224243016469303211063259720016986112000000000000), SC_(152.40959258449735783918197370567517566234756926067104333362789545428720180074927724450881200646747158985836064), + SC_(53), SC_(80658175170943878571660636856403766975289505440883277824000000000000), SC_(156.3608363030787851940699253901568474033038374741517609582883009839374537120130768551201133239007984537116218), + SC_(54), SC_(4274883284060025564298013753389399649690343788366813724672000000000000), SC_(160.33112821663090702821439452918590517366381522706297856133643045395545834595656671365477326838671968355373562), + SC_(55), SC_(230843697339241380472092742683027581083278564571807941132288000000000000), SC_(164.32011226319518141181736236141165885568178703489148217066119346436133484758208832988148385982433463745964719), + SC_(56), SC_(12696403353658275925965100847566516959580321051449436762275840000000000000), SC_(168.32744544842765233048006527260297579502909524309741706779240906496608745920298280758667244592014903967432922), + SC_(57), SC_(710998587804863451854045647463724949736497978881168458687447040000000000000), SC_(172.35279713916280156383711438042068522889268037576004401861383924338384818786413622219192092549727662929339535), + SC_(58), SC_(40526919504877216755680601905432322134980384796226602145184481280000000000000), SC_(176.39584840699735171524138704923106447077755019488192228888649381343063518314694247777969506412674861387840601), + SC_(59), SC_(2350561331282878571829474910515074683828862318181142924420699914240000000000000), SC_(180.45629141754377105184189120305115264434756324316492162192884417456680958625448952667892550594102372406640708), + SC_(60), SC_(138683118545689835737939019720389406345902876772687432540821294940160000000000000), SC_(184.53382886144949050245794157677085026841091003249537615144088087162600970051991700403826546574365749307685096), + SC_(61), SC_(8320987112741390144276341183223364380754172606361245952449277696409600000000000000), SC_(188.62817342367159118728841038983591674873500221330715383332958311572447022538557316675374175264340656774879025), + SC_(62), SC_(507580213877224798800856812176625227226004528988036003099405939480985600000000000000), SC_(192.73904728784490243603979949326153149505068395638841489626696676214391003223052189793917095874351034077226315), + SC_(63), SC_(31469973260387937525653122354950764088012280797258232192163168247821107200000000000000), SC_(196.86618167288999399138619593926206527357612302122926212214436484411228507079776784575889911707601565888724156), + SC_(64), SC_(1982608315404440064116146708361898137544773690227268628106279599612729753600000000000000), SC_(201.00931639928152667928203915655029641250818886645662221407314366132485351998705504729378912529135136345624332), + SC_(65), SC_(126886932185884164103433389335161480802865516174545192198801894375214704230400000000000000), SC_(205.1681994826411985357854318852993558209611896726181537387972237182852152518052233409289690872698634887082522), + SC_(66), SC_(8247650592082470666723170306785496252186258551345437492922123134388955774976000000000000000), SC_(209.3425867525368356464396786600908620652920589716468785771289171204228589068372912849586776288035325882774767), + SC_(67), SC_(544344939077443064003729240247842752644293064388798874532860126869671081148416000000000000000), SC_(213.53224149456326119131409959643669363783675651776730045820285917268432044593883168051321141861631815602216393), + SC_(68), SC_(36471110918188685288249859096605464427167635314049524593701628500267962436943872000000000000000), SC_(217.73693411395422725098417159280041638840368942098919579534064330345958895146691857715212560643734364055612613), + SC_(69), SC_(2480035542436830599600990418569171581047399201355367672371710738018221445712183296000000000000000), SC_(221.95644181913033395006817045358989606014289270229545109087924106032866877120723928927594712846768396315847735), + SC_(70), SC_(171122452428141311372468338881272839092270544893520369393648040923257279754140647424000000000000000), SC_(226.19054832372759333227016852232261788323276357495863628461257077144915631041064655434796397543441086630064459), + SC_(71), SC_(11978571669969891796072783721689098736458938142546425857555362864628009582789845319680000000000000000), SC_(230.43904356577695232139351272045016182047094979316927044910528882235430878284006830237161967911188069163567407), + SC_(72), SC_(850478588567862317521167644239926010288584608120796235886430763388588680378079017697280000000000000000), SC_(234.70172344281826774272296725296319591723052631987983655722671462438166028966429866833786300338451582517662042), + SC_(73), SC_(61234458376886086861524070385274672740778091784697328983823014963978384987221689274204160000000000000000), SC_(238.97838956183432305376515409118277703075200783860610122305814332013682974201060074890268449400123606537856492), + SC_(74), SC_(4470115461512684340891257138125051110076800700282905015819080092370422104067183317016903680000000000000000), SC_(243.26884900298271418285726294862131960165676068347769888765384217729861971793119804217901381683609495963259635), + SC_(75), SC_(330788544151938641225953028221253782145683251820934971170611926835411235700971565459250872320000000000000000), SC_(247.57291409618688393664259074111094333363233840500559030541943486798500308689125382318389867750468230795640678), + SC_(76), SC_(24809140811395398091946477116594033660926243886570122837795894512655842677572867409443815424000000000000000000), SC_(251.89040220972319437723935464448584431733103167136537520097942498457085535552517831931778218850477361834430941), + SC_(77), SC_(1.885494701666050254987932260861146558230394535379329335672487982961844043495537923117729972224e+111), SC_(256.22113555000952545608284631929005099071941120138501452775874523996693530152876503924366722631335088922535301), + SC_(78), SC_(1.45183092028285869634070784086308284983740379224208358846781574688061991349156420080065207861248e+113), SC_(260.56494097186320930525014264069836002017820278490429289143670309903508878819407102010638043290385720763313043), + SC_(79), SC_(1.1324281178206297831457521158732046228731749579488251990048962825668835325234200766245086213177344e+115), SC_(264.92164979855280104211610744064438089770646142184750471371112295282944137070678488198543417815449747273236013), + SC_(80), SC_(8.94618213078297528685144171539831652069808216779571907213868063227837990693501860533361810841010176e+116), SC_(269.29109765101982253628905298212579181988000264627011433912329407038924743183121716013137454392857707937066295), + SC_(81), SC_(7.156945704626380229481153372318653216558465734236575257710944505822703925548014884266894486728081408e+118), SC_(273.67312428569370414855874080118468573170760453797965307751866199983700090741765378718496173000743144033863518), + SC_(82), SC_(5.79712602074736798587973423157810910541235724473162595874586504971639017969389205625618453424974594048e+120), SC_(278.06757344036614291413972174887478855029756676927065088445743933438697808029208965467942474926235979549051529), + SC_(83), SC_(4.7536433370128417484213820698940494664381329406799332861716093407674399473489914861300713180847916711936e+122), SC_(282.47429268763039602742371724337037270674947737303020777219738225414035031866744187624760521763076529407050726), + SC_(84), SC_(3.945523969720658651189747118012061057143650340764344627522435752836975156299662933487959194010377087090688e+124), SC_(286.89313329542699395089918946666174315977879042969344414238532571707892930855643248208603251460133872829846), + SC_(85), SC_(3.31424013456535326699938757913013128800066628624204948711884603238305913129171686412988572296871675315617792e+126), SC_(291.32395009427030756623425168994380173021436598581856529082077021964079070846650014795903342199577971916349469), + SC_(86), SC_(2.817104114380550276949479442260611594800566343305742064051019127525600261597959334510402864523409240182751232e+128), SC_(295.76660135076062402108454564104311590532817035267282780003065584899726227197508919350126216812646227748180925), + SC_(87), SC_(2.4227095383672732381765523203441259715284870552429381750838764496720162249742450276789464634901319465571660595e+130), SC_(300.22094864701413175397462027584713950896280667191463846934302112341351506781777034764471749320687825192131641), + SC_(88), SC_(2.1077572983795277172136005186993895952297837380613562123229725112146541157275931740806834232364147935047344718e+132), SC_(304.68685676566871547255313754513157681910481014366013199999938580869379014217423164781170036283846676335528603), + SC_(89), SC_(1.8548264225739843911479684564554628438022096894939934668442158098688956218402819931910014124480450182841663352e+134), SC_(309.1641935801469219448667774874712358231530174006783149375799935463045446319965525077043450518303576173960062), + SC_(90), SC_(1.6507955160908461081216919262453619309839666236496541854913520707833171034378509739399912570787600662729080383e+136), SC_(313.65282994987906178318459302814108504255767778781127430168669112359249852477600875415140860377983336041329436), + SC_(91), SC_(1.4857159644817614973095227336208257378855699612846887669422168637049853930940658765459921313708840596456172345e+138), SC_(318.1526396202093268499930749566705006594537603920855461811894076918350597208905791681346373184968958363312022), + SC_(92), SC_(1.3520015276784029625516656875949514214758686647690667779174173459715367077155999476568528395475044942775116834e+140), SC_(322.66349912672617689115191514167899899389611306642761448606784335243610425096705861532187048052525685209352209), + SC_(93), SC_(1.2438414054641307255475324325873553077577991715875414356840239582938137710983519518443046123837041347353107487e+142), SC_(327.18528770377521720079313221640554824848949364998856073630783874890588474089124634473199822667108904153172227), + SC_(94), SC_(1.1567725070816415747592051623062404362147532295764135351861422812132468071214673152152032895168448453038389963e+144), SC_(331.71788719692847313811754177787043116358692313829190215979925115501836045070740654381947881282090776089266923), + SC_(95), SC_(1.0873661566567430802736528525678660100418680358018287230749737443404519986941792763022910921458341545856086565e+146), SC_(336.26118197919847703435572456910078144055847377467238144712043951131857228618290233203603189325207242939112229), + SC_(96), SC_(1.0329978488239059262599702099394727095397746340117372869212250571234293987594703124871765375385424468563282237e+148), SC_(340.81505887079901786896551133421482261732145439024002798757104763920204397595475738538032415516099193598812922), + SC_(97), SC_(9.9167793487094968920957140154189380115818364865126779544437605483849222280909149998768947603700074898207509474e+149), SC_(345.37940706226685410744691717842823116234644561986405370990914202030650637902183993028325654495681746248610666), + SC_(98), SC_(9.619275968248211985332842594956369871234381391917297615810447731933374561248187549880587917558907265126128419e+151), SC_(349.95411804077023692956363880013219287615536052252283506588537638906668367080002705562553928999109201241305734), + SC_(99), SC_(9.4268904488832477456261857430572424738096937640789516634942387772947070700232237988829761592077291198236058506e+153), SC_(354.53908551944080884919157640847672890350503011604681269692483669843523701827386030680671961416325375394118221), + SC_(1.5), SC_(0.88622692545275801364908374167057259139877472806119356410690389492645564229551609068747532836927233270811341181), SC_(-0.12078223763524522234551844578164721225185272790259946836386847375732473702728167571405169185867383369099657491), + SC_(2.5), SC_(1.3293403881791370204736256125058588870981620920917903461603558423896834634432741360312129925539084990621701177), SC_(0.28468287047291915963249466968270192432013769555989472925014585038677593422163257555370073595863956755497197314), + SC_(3.5), SC_(3.3233509704478425511840640312646472177454052302294758654008896059742086586081853400780324813847712476554252943), SC_(1.2009736023470742248160218814507129957702389154681571970421137323675612999595956245779712870554004908129367951), + SC_(4.5), SC_(11.63172839656744892914422410942626526210891830580316552890311362090973030512864869027311368484669936679398853), SC_(2.4537365708424422205041425034357161573318235106897631313808238728117475407419701767597664586468533302639970083), + SC_(5.5), SC_(52.342777784553520181149008492418193679490132376114244880064011294093786373078919106229011581810147150572948385), SC_(3.9578139676187162938774008558225909985513044919750067807295325305933425052094933949011346412778988202979355854), + SC_(6.5), SC_(287.88527781504436099631954670830006523719572806862834684035206211751582505193405508425956369995580932815121612), SC_(5.6625620598571415285221123123295437302975112115521687018274202302305225071530353923703260222841149241706498303), + SC_(7.5), SC_(1871.2543057977883464760770536039504240417722324460842544622884037638528628375713580476871640497127606329829048), SC_(7.5343642367587329551583676324366857670272790219521205641257857314005935525077508561640373587281857253979065414), + SC_(8.5), SC_(14034.407293483412598570577902029628180313291743345631908467163028228896471281785185357653730372845704747371786), SC_(9.5492672573009977117371400811272225431248707996831324836524479470188732114643228720619236646386787374438413924), + SC_(9.5), SC_(119292.46199460900708784991216725183953266297981843787122197088573994562000589517407554005670816918849035266018), SC_(11.689333420797268482569442577542172510637573677908622016829005675407772165295559437368155205679762997420188173), + SC_(10.5), SC_(1133278.3889487855673345741655888924755602983082751597766087234145294833900560041537176305387276072906583502717), SC_(13.940625219403763633161237887971849479799452804847495581246285902323671245390062010476450262499084205675227326), + SC_(11.5), SC_(11899423.083962248457013028738683370993383132236889177654391595852559575595588043614035120656639876551912677853), SC_(16.292000476567241320244603746879378346008527957891850967319690376405351779391045529531861188904269133914257568), + SC_(12.5), SC_(136843365.46556585725564983049485876642390602072422554302550335230443511934926250156140388755135858034699579531), SC_(18.7343475119364457016341244572313978963754081383720314551976457443949514034061491121243989540608452607264533), + SC_(13.5), SC_(1710542068.3195732156956228811857345802988252590528192878187919038054389918657812695175485943919822543374474413), SC_(21.260076156244701141418411002225596607351110712548811644902261517849915756851769925778803383250785794784384425), + SC_(14.5), SC_(23092317922.314238411890908896007416834034140997213060385553690701373426390188047138486906024291760433555540458), SC_(23.862765841689084906186914591534997153218082251656804745985664509269005014537902110793787320695563373606293032), + SC_(15.5), SC_(334838609873.55645697241817899210754409349504445958937559052851516991468265772668350806013735223052628655533664), SC_(26.536914491115613623952954502438732190637095031219293570786654851418392173706059728481291108517001108710291135), + SC_(16.5), SC_(5189998453040.125083072481774377666933449173189123635321653191985133677581194763594374932128959573157441607718), SC_(29.277754515040814560464886705522912833011533827339630288422692914399979968333916245089292612856669051741266591), + SC_(17.5), SC_(85634974475162.063870695949277231504401911357620539982807277667754705680089713599307186380127832957097786527347), SC_(32.081114895947349486504843398952391269405231104739541661255274947674654263496067209432099748676617244401950865), + SC_(18.5), SC_(1498612053315336.1177371791123515513270334487583594496991273591857073494015699879878757616522370767492112642286), SC_(34.943315776876817856793723354163582070492417054229665317506632979593019491986099526244028798361249694652977381), + SC_(19.5), SC_(27724322986333718.178137813578503699550118802029649819433856144935585963929044777775701590566385919860408388228), SC_(37.861086508961096991744586903736852666316994507037046227030865651292615617006765876037187005036999667892784853), + SC_(20.5), SC_(540624298233507504.47368736478082214122731663957817147896019482624392629661637316662618101604452543727796357046), SC_(40.831500974530798109776087460766520407694252875259747541063925486100180955580090306704514096294802557908011593), + SC_(21.5), SC_(11082798113786903841.710590978006853895159991111352515318683993938000489080635649915836710828912771464198253194), SC_(43.851925860675160604225618712345751427995163210298793920562508386866765950016053097060967910670370681404000601), + SC_(22.5), SC_(238280159446418432596.77770602714735874593980889407907935170586966701051523366647319048928282162458648026244368), SC_(46.919978795808777718281229104233421895478799260820094081633513642296231501919344819992696581757949280759504801), + SC_(23.5), SC_(5361303587544414733427.4983856108155717836457001167792854133820675077365927574956467860088634865531958059049828), SC_(50.033494105019152166255246789846484376223881596373855452894870191552005454094525802764198642482174381593409681), + SC_(24.5), SC_(125990634307293746235546.21206185416593691567395274431320721447858643180992980114769947120829193400010143876709), SC_(53.190494526169265443658965338160481517044431964033824231974698528865430045630632159769025068920501675007859774), + SC_(25.5), SC_(3086770540528696782770882.1955154270654544340118422356735767547253675793432801281186370446031523830024852497938), SC_(56.389167643719946744452438703588664408243101288837291354772798819247196149165075979738478739099826041451981681), + SC_(26.5), SC_(78712648783481767960657495.985643390169088067301977009676207245496873273253643267025244637380385766563373869743), SC_(59.627846095884327206679986436926140080403294724885530339684050881273589396214921511918326034954642390216298491), + SC_(27.5), SC_(2085885192762266850957423643.6195498394808337835023907564194920056671417412215465761689828905802228139294075482), SC_(62.90499082887650373140722345449702128268777234343649268861150034179820040818871665484712265244414493251641083), + SC_(28.5), SC_(57361842800962338401329150199.537620585722929046315745801536030155846397883592530844647029490956127383058707575), SC_(66.219176833549029340652694244230161653959580417282172331622035932909559397839916416946447911543540647189091378), + SC_(29.5), SC_(1634812519827426644437880780686.8221866931034778199987553437768594416223396823871290724403404922496304171731659), SC_(69.56908092082363418263973479158236432776895010204379534777401049346295277115302795692835872317659394423210056), + SC_(30.5), SC_(48226969334909086010917483030261.254507446552595689963282641417353527859020630420307636990044521364097306608394), SC_(72.953471184169408323838553043843885383756796757013994623165367181028759263448760718681835355982809025700542958), + SC_(31.5), SC_(1470922564714727123332983232422968.262477119854168543880120563229282599700129227819382928196357901604967851556), SC_(76.371197867782774263172710025811323561996978365735000431982070817954805448324014734261401235086494111182014369), + SC_(32.5), SC_(46334060788513904384988971821323500.268029275406309132223797741722401890554070676310562238185273900556487324014), SC_(79.821185413614361641651321121641378132853544076602105269790169625673980275543607220190427916305411128209014641), + SC_(33.5), SC_(1505856975626701892512141584193013758.7109514507050467972734266059780614430072969800932727410214017680858380305), SC_(83.302425502950053442888335774974707809108913241270574854001183018318230308605980448614273130842661540236237655), + SC_(34.5), SC_(50446208683494513399156743070465960916.81687359861906770865979130026505834074444883312463682421695923087557402), SC_(86.813970941781074193141175649880253991600346010132214937018287139600105192164372629647323991667268337228198365), + SC_(35.5), SC_(1740394199580560712270907635931075651630.1821391523578359487627998591445127556834847427999704354850934652073037), SC_(90.354930265818388265925941597154799246614716748435144876630936841227199109398085179113477511637576552828364127), + SC_(36.5), SC_(61783994085109905285617221075553185632871.465939908703176181079394999630202826763708369398950459720818014859281), SC_(93.924462962299758377838164008209656775298793140785455730631682633761156994252620829473857508913792998827308996), + SC_(37.5), SC_(2255115784106511542925028569257691275599808.5068066676659306093979174865024031768753554830616917798098575423638), SC_(97.521775222888204197513040744190022778128045851296798141106701481429553348203523407144323504752233205539338939), + SC_(38.5), SC_(84566841903994182859688571347163422834992819.005250037472397852421905743840119132825830614813441742869657838642), SC_(101.14611615586456932869257252610674719375123898329632778254601158852201199486775318767234368875590582838524009), + SC_(39.5), SC_(3255823413303776040098009996865791779147223531.7021264426873173182433711378445866137944786703175071004818267877), SC_(104.79677439715830786844263672605687965513453043245535089210328943809677185956336445292919356834999345925101603), + SC_(40.5), SC_(128605024825499153583871394876198775276315329502.23399448614903407061315994486117124488190747754153046903215811), SC_(108.47307506906538405319835014608011400923257152251770526339478054616318429871810201546927060712765437834731737), + SC_(41.5), SC_(5208503505432715720146791492486050398690770844840.4767766890358798598329777668774354177172528404319839958024036), SC_(112.174377043177877509362098972312040259747033619448447816212877871219767849622843167357870299386164045957196), + SC_(42.5), SC_(216152895475457702386091846938171091545666990060879.78623259498901418306857732541356983526599287792733582579975), SC_(115.90007047041453012342033907414523414470084654175142893228014132466495321754213905759043426936031879264314726), + SC_(43.5), SC_(9186498057706952351408903494872271390690847077587390.9148852870331027804145363300767179988046973119117725964894), SC_(119.64957454634490126885340090378637175173915077424543618736934694452803115908103338752679968849458266341946035), + SC_(44.5), SC_(399612665510252427286287302026943805495051847875051504.79750998593997094803233035833723294800433306816210794729), SC_(123.42233548443953967801468605161263249380565411163067446390503162031491261146779997208791923112975248731142848), + SC_(45.5), SC_(17782763615206233014239784940198999344529807230439791963.489194374328707187438700946006866186192821533213803654), SC_(127.21782467361173420691526947082430514513481436440337857389104918810947288227756150292911945608280954278671516), + SC_(46.5), SC_(809115744491883602147910214779054470176106228985010534338.75834403195617702846089304331241147177337976122806627), SC_(131.03553699956863893865687753437462691150166690438519162464880483921712379038434623451048929111475187100703357), + SC_(47.5), SC_(37623882118872587499877824987226032863188939647802989846752.262997485962231823431526514027133437462158897105082), SC_(134.87498931216194956656405497438133325852359625832827779401953723583620587823081171799210655026815190282597905), + SC_(48.5), SC_(1787134400646447906244196686893236561001474633270642017720732.4923805832060116129975094162888382794525476124914), SC_(138.73571902320254509175660961803719786721107673953566908034946535422628394603297205573053548518065272188098451), + SC_(49.5), SC_(86676018431352723452843539314321973208571519713626137859455525.880458285491563230379206690008656553448559205832), SC_(142.61728282114598260445609911828298301294449150783419518220501971349306761584146446546695490321850858426593371), + SC_(50.5), SC_(4290462912351959810915755196058937673824290225824493824043048531.0826851318323799037707311554284993957036806887), SC_(146.51925549072062722189130104863498715398567934305685600677229608040523620422222439668337779385218886571458801), + SC_(51.5), SC_(216668377073773970451245637400976352528126656404136938114173950819.67559915753518514042192334913921948303587478), SC_(150.4412288270019413633582671940897997428010617958942055025828814326138544658548735525821945735977269360210477), + SC_(52.5), SC_(11158421419299359478239150326150282155198522804813052312879958467213.293356613062034731729052480669803376347551), SC_(154.38281063467163182470963738768506399535382276990475341107343238215099204833297310656807722165341715406317983), + SC_(53.5), SC_(585817124513216372607555392122889813147922447252685246426197819528697.90122218575682341577525523516467725824643), SC_(158.34362380426920988639376257981878050108849927721762651905948474770685157004161439025362202615178169310217637), + SC_(54.5), SC_(31341216161457075934504213478574605003413850928018660683801583344785337.715386937990052743976155081310233316184), SC_(162.32330545817117075028092927538388093457614541898877881849892145746017531760191233120507740265697365547119116), + SC_(55.5), SC_(1708096280799410638430479634582315972686054875577017007267186292290800905.488588120457874546700451931407715732), SC_(166.32150615984036914124101360613490601756099416813175471745311500264768497982738059734322034762200774042718254), + SC_(56.5), SC_(94799343584367290432891619719318536484076045594524443903328839222139450254.616640685412037341875082193128223128), SC_(170.33788918059275796758712239263070231803306217876188507871204200798477539806665591400999430911148980245496004), + SC_(57.5), SC_(5356162912516751909458376514141497311350296576090631080538079416050878939385.8401987257801098159421439117446067), SC_(174.37212981874515322675202176478854742198689243310462361933171003383495568165601126924032108461494319287562168), + SC_(58.5), SC_(307979367469713234793856649563136095402642053125211287130939566422925539014685.81142673235631441667327492531489), SC_(178.42391476654845798274230180836675461187937396785332182912231329329873429337877261646299272786469893048778372), + SC_(59.5), SC_(18016792996978224235440613999443461581054560107824860297159964635741144032359119.968463842844393375386583130921), SC_(182.49294152078626879216904760231894805790412289389877259489006746174379392517070601400393557393623390929098049), + SC_(60.5), SC_(1071999183320204342008716532966885964072746326415579187681017895826598069925367638.1235986492414058355016962898), SC_(186.57891783333785286810670284217707775505391050170612331652601534007027274175401184709782561356518969626038896), + SC_(61.5), SC_(64855950590872362691527350244496600826401152748142540854701582697509183230484742106.477718279105053047852625532), SC_(190.68156119837464864681335787664915978662182407522070241284247074883802636761079055764207170257404059154781894), + SC_(62.5), SC_(3988640961338650305528932040036540950823670894010766262564147335896814768674811639548.3796741649607624429364702), SC_(194.80059837318712083265813436515091651157022496808249824407574798324210565526536231487214127176334080383177797), + SC_(63.5), SC_(249290060083665644095558252502283809426479430875672891410259208493550923042175727471773.72963531004765268352939), SC_(198.9357649299294766470431802433713028620715288965277961556930116481712489964186408931566795790464609486896754), + SC_(64.5), SC_(15829918815312768400067949033895021898581443860605228604551459739340483613178158694457631.831842188025945404116), SC_(203.08680483582812261067338892962941868886993788609362666447959684653504063618552155529671137165254559527012397), + SC_(65.5), SC_(1021029763587673561804382712686228912458503129009037244993569153187461193049991235792517253.1538211276734785655), SC_(207.2534700596298494161242445584396148610010644944376762772852964356020004813074222451020557975538562834135982), + SC_(66.5), SC_(66877449514992618298187067680947993766031954950091939547078779533778708144774425944409880081.57528386261284604), SC_(211.43552020227105565085643644815096418603347436471800199512161188121614319947433697344350573132141276354024193), + SC_(67.5), SC_(4447350392747009116829440000783041585441125004181113979880738838996284091627499325303257025424.7563768637542617), SC_(215.63272214993286410655358450202382088483243822123873674799828225806962214232090881433945928672860549878834278), + SC_(68.5), SC_(300196151510423115385987200052855307017275937782225193641949871632249176184856204457969849216171.05543830341266), SC_(219.84484974781134824592284742455940907022501111461524757099433314096289038771469876398457710226656268841021769), + SC_(69.5), SC_(20563436378463983403940123203620588530683401738082425764473566206809068568662650005370934671307717.297523783767), SC_(224.07168349307952785182080543108109789271264615429955763192392717249964214460788839512371322000656690972870255), + SC_(70.5), SC_(1429158828303246846573838562651630902882496420796728590630912851373230265522054175373279959655886352.1779029718), SC_(228.31301024565027429959235822849846510707974268029445629347732566784950338815827880054483195431835852093151265), + SC_(71.5), SC_(100755697395378902683455618666939978653215997666169365639479356021812733719304819363816237155739987828.54215951), SC_(232.56862295546849726839132201373498795254778360577717452429184833880042227291299412442327413557041790313393277), + SC_(72.5), SC_(7204032363769591541867076734686208473704943833131109643222773955559610460930294584512860956635409129740.7644053), SC_(236.83832040516845923908952091180725928909925827011454356180878154910106694218094630129204018001712349577590521), + SC_(73.5), SC_(522292346373295386785363063264750114343608427902005449133651111778071758417446357377182419356067161906205.41938), SC_(241.12190696702908833145632015593718196604387240394555010852241978272463308905676168360967784593174084167986961), + SC_(74.5), SC_(38388487458437210928724185149959133404255219450797400511323356715688274243682307267222907822670936400106098.325), SC_(245.41919237324787932364503875828789056189003228657176668305521440674389348580981447045274727092479729691196155), + SC_(75.5), SC_(2859942315653572214189951793671955438617013849084406338093590075318776431154331891408106632788984761807904325.2), SC_(249.72999149863339315522023491193383448167061692340447857672407449375747169812791781111275143962959290222039703), + SC_(76.5), SC_(2.1592564483184470217134136042223263561558454560587267852606605068656762055215205780131205077556834951649677655e+110), SC_(254.05412415488837217459923908996013420385285318162401319788608852473651793897154945257028320795873840597621994), + SC_(77.5), SC_(1.6518311829636119716107614072300796624592217738849259907244052877522422972239632421800371884330978738012003406e+112), SC_(258.39141489572086232822203206022013558066053717549500163453203492040040547924000395162374625862728684352850678), + SC_(78.5), SC_(1.280169166796799277998340090603311738405896874760817642811414098007987780348571512689528821035650852195930264e+114), SC_(262.74169283208016363933472359653050386256057732588385607408072087485617226157551823286188164106013439735944854), + SC_(79.5), SC_(1.0049327959354874332286969711235997146486290466872418496069600669362704075736286374612801245129859189738052572e+116), SC_(267.10479145686852638734193671147580254322732082238725117588822686309450418800594513507752807659094400582867122), + SC_(80.5), SC_(7.9892157276871250941681409204326177314566009211635727043753325321433497402103476678171769898782380558417517949e+117), SC_(271.48054847852881260346441896596920945015928899876096297655037065725660949319834924487994044889417863691675359), + SC_(81.5), SC_(6.4313186607881357008053534409482572738225637415366760270221426883753965408693298725928274768519816349526101949e+119), SC_(275.86880566295333028995929241976440873016325390882300465288771617518378897996552209526013671263862629072201102), + SC_(82.5), SC_(5.2415247085423305961563630543728296781653894493523909620230462910259481808085038461631543936343650324863773089e+121), SC_(280.26940868320014731460699266442698203871964079719296793469286173499967111079349880691287016537937361497556242), + SC_(83.5), SC_(4.3242578845474227418289995198575844844864462957157225436690131900964072491670156730846023747483511518012612798e+123), SC_(284.682206976540782615247708691082648114638939428861397029438091659748524393663307535885811179292501418436213), + SC_(84.5), SC_(3.6107553335970979894272145990810830445461826569226283239636260137305000530544580870256429829148732117540531686e+125), SC_(289.10705360839759241309022734636925091236076189711213337517709639704948836617314376848780201510190498881332539), + SC_(85.5), SC_(3.0510882568895478010659963362235151726415243450996209337492639816022725448310170835366683205630678639321749275e+127), SC_(293.5438051427607205757799701080417115538957976522722923538945074088830240788522694116810880149864652788098403), + SC_(86.5), SC_(2.608680459640563369911426867471105472608503315060175898355620704269943025830519606423851414081423023662009563e+129), SC_(297.99232151870343510916225589231643993235265789485666482178117630307391174538398991853661458143325066464081951), + SC_(87.5), SC_(2.256508597589087314973384240362506233806355367527052152077611909193500717343399459556631473180430915467638272e+131), SC_(302.45246593264126874667852415929925483346301066821048385407743103970638435351361815495531586043755604177405005), + SC_(88.5), SC_(1.974445022890451400601711210317192954580560946586170633067910420544313127675474527112052539032877051034183488e+133), SC_(306.92410472600483749156816344773663327407579797196912523224143696309892856971130823639737878821536810282504286), + SC_(89.5), SC_(1.7473838452580494895325144211307157648037964377287610102651007221817171179927949564941664970440961901652523869e+135), SC_(311.40710727801872132416222693692068003471113518476207395936748798430222935522564996502447117583531527308145529), + SC_(90.5), SC_(1.5639085415059542931316004069119906094993978117672411041872651463526368206035514860622790148544660901979008863e+137), SC_(315.90134590329953101092279924548390564223856846858296625777328597413442813460285776012923528619664640063105954), + SC_(91.5), SC_(1.4153372300628886352840983682553515015969550196493531992894749574491363226462140948863625084432918116291003021e+139), SC_(320.40669575400541144834465416265873800140340077572518981723533406865135034989138112174804319537395034840295962), + SC_(92.5), SC_(1.2950335655075431012849500069536466239612138429791581773498695860659597352212858968210216952256120076406267764e+141), SC_(324.92303472628688707907405638154870188429107294226894507778673203921489082798524410420122482929136752267240106), + SC_(93.5), SC_(1.1979060480944773686885787564321231271641228047557213140486293671110127550796894545594450680836911070675797682e+143), SC_(329.45024337080526658862567926434816011964125174934484370922361260238866594071356821862451691406029710671217484), + SC_(94.5), SC_(1.1200421549683363397238211372640351238984548224465994286354684582487969259995096400130811386582511851081870832e+145), SC_(333.98820480709990790351992533872823938697566148150775041761873803990813851845804149700580316310401615810323734), + SC_(95.5), SC_(1.0584398364450778410390109747145131920840398072120364600605176930451130950695366098123616760320473699272367937e+147), SC_(338.53680464159960497339378167148081966247971775019760470716153118126480763889624294980844559913666526391820764), + SC_(96.5), SC_(1.0108100438050493381922554808523600984402580158874948193577943968580830057914074623708054006106052382805111379e+149), SC_(343.095930889086289536826499502225010241012659092304896484521563059300107456132654601958350377038769758750347), + SC_(97.5), SC_(9.7543169227187261135552653902252749499484898533143250068027159296805010058870820118782721158923405494069324811e+150), SC_(347.66547389743122977926419843414989243712722645052362680457030358912339124368115189455827461325062570433884005), + SC_(98.5), SC_(9.5104589996507579607163837554696430761997776069814668816326480314384884807399049615813153129950320356717591691e+152), SC_(352.24532627543503127189645832440574781803008617301484584051601131540513556996213408985573558260160820515403309), + SC_(99.5), SC_(9.3678021146559965913056379991375984300567809428767448784081583109669111535288063871575955833001065551366827815e+154), SC_(356.83538282361307446925902353211040222496323010101263029219393567782724332404128833098562961026080141679994657), +}; + +static const boost::array, 41> near_1 = { + SC_(0.5), SC_(1.7724538509055160272981674833411451827975494561223871282138077898529112845910321813749506567385446654162268236), SC_(0.57236494292470008707171367567652935582364740645765578575681153573606888494241303989181163513774485385100490611), + SC_(0.625), SC_(1.4345188480905567756360197394564231366322077722066673307706798580950941973020969146309569665256322935994654338), SC_(0.36082949548894018118495768582277948785736912020625817171534369271076040488490050699002363027633270505424458064), + SC_(0.75), SC_(1.2254167024651776451290983033628905268512392481080706112301189382898228884267983572371723762149150665821733802), SC_(0.20328095143129537148143297186242969975966731498257864807397605368487331819397460137048111735608518528622179233), + SC_(0.875), SC_(1.0896523574228969512523767551028929711478700677675651205137040432536264174658795033595896748361842446382310482), SC_(0.08585870722533432350236558376948770226971912568187111234881601023955661926262775458261489495159171414683063444), + SC_(0.875), SC_(1.0896523574228969512523767551028929711478700677675651205137040432536264174658795033595896748361842446382310482), SC_(0.08585870722533432350236558376948770226971912568187111234881601023955661926262775458261489495159171414683063444), + SC_(0.9375), SC_(1.0401770111867671714597628173619211286137015344920691109446597166008250518768858003488288550069774030008385474), SC_(0.039390901734582300658227546340953844503363526873275555924583248691684407795252299141939653430330091269382318677), + SC_(0.96875), SC_(1.0190325250566739505647300479281360248823250932111783847890502796409452098998953044939908318632260351379776713), SC_(0.018853672334412890535592065704800808901737541753307604147921982817646261473204084765390919252667197071285862424), + SC_(0.984375), SC_(1.0092639847156863031513642279872649395665289471965001383071292900827245419873658382338104686447297569473205469), SC_(0.00922133719757878104504544602785480541183714372596115164380073895348968088364637878818475160823616428061231308), + SC_(0.9921875), SC_(1.0045703009750313695418190819857497756177949566342185206412658643551771616307782112692210230847197631441840257), SC_(0.0045598888618045588650965994550424584438465646671569627037023442718896355703968374172722045521035725542428421793), + SC_(0.99609375), SC_(1.0022698948072663380705186466834088228749332164565353765602844596483728158852340436652910312111169316609714696), SC_(0.002267322487909119869224853055660925945502946111127310832108839278441229781909271272292321713240086669666673579), + SC_(0.998046875), SC_(1.0011311540702717194751486537016329361748548795865540183758175786053609255723291288804230660209514957067544756), SC_(0.0011305147975382617314468555514931106445911149072169391421772950013850819314728201357323200246446508198616715076), + SC_(0.9990234375), SC_(1.0005646312561051341795833347970072224691414951011585192257183425112236459173288788007843000527615619796876423), SC_(0.00056447191185512338425745752778379540322733814671115601515739643336237598766933267729753552357635796698514596983), + SC_(0.99951171875), SC_(1.0002820795014030603122660092346161054092748105743475941025912629061994674154769263987059870282205452011790797), SC_(0.00028203972446050202164990932586792182277028625000579467899259058286790920813945981070397067889871367271780753512), + SC_(0.999755859375), SC_(1.0001409807587291625276642931842015920091929545333196812761907195683656908667498991146653620951380087741337049), SC_(0.00014097082187592237051371524368529004109710102132559573440397063444509291284211693505849383520344943672815952199), + SC_(0.9998779296875), SC_(1.0000704756363281543589529190831324108350522109231500912943205227968503621121547410111499321275965652178864083), SC_(7.0473153037170086154990456617429606491291306351792371038014266565023997915969279947648648462158546701919903081e-05), + SC_(0.99993896484375), SC_(1.0000352341330242672078622365190637840639477682700164032264654052973959618643727802512909912536172530362395266), SC_(3.5233512316782239237891894216581425213234468976061384095946082343932672612109116593768365443514987235802189247e-05), + SC_(0.999969482421875), SC_(1.0000176161453045753153818203998783392498353944168731950825723484510408117073964447044091192763939536504419548), SC_(1.761599014210985977615986870219441253152302650866741955007594785183512559840534060419786772025834904844368172e-05), + SC_(0.9999847412109375), SC_(1.0000088078423600712432306459072726327005468658815965923272360897211863953044660937258887228363756570934413742), SC_(8.8078035712554869804636737104615719706676701895738198043786296563843343116436624246517174019991164055073256752e-06), + SC_(0.99999237060546875), SC_(1.0000044038636081905928511858888125298767090169025230723302909504779910697224206944418494971066153925981249059), SC_(4.4038539112117225162418369217896025239570399579722287850444858130021481865621717750113878487355145402430600115e-06), + SC_(0.999996185302734375), SC_(1.0000022019174112851692250057380852275017766147260950955247390757507613697962418975625931771397155345075852518), SC_(2.2019149870685847804328915717680872509667301348628950203352825315866810742426434243009968987918506631520331535e-06), + SC_(1), SC_(1), SC_(0), + SC_(1.000003814697265625), SC_(0.99999779811137403283143208760327600675756902143756596759838698221325215539409430568396858379750535139420226287), SC_(-2.2018910501274876377141818311089755229311746446021640254293045758059176229682918834288238505534445292777340924e-06), + SC_(1.00000762939453125), SC_(0.99999559625153308141476652368576165846163213500202659668397521943996956814485005524714716726321435556951990071), SC_(-4.4037581634473325702218400982291070742088066919117076633155854060759992379786313395823905915149428408829547678e-06), + SC_(1.0000152587890625), SC_(0.99999119261820501686706957175471991293910990979611602622805038287033968066042427663218511800321072127022156621), SC_(-8.8074205801979051940611576319016798990780755527146458978906571204868908384222945024215475751136282541034767583e-06), + SC_(1.000030517578125), SC_(0.99998238569695577840308912119540189506999309885932228281903127593682897986879129264261414709811177673988286746), SC_(-1.7614458177879180593389151228747594238394118848425722604531270820619091802647966796813580302792743080800024461e-05), + SC_(1.00006103515625), SC_(0.9999647732360171681023427372223702590453913910199390605542249806417221689763739196579994699370896803042256543), SC_(-3.5227384459853889912226246727720809494104943993200852437494031875415481631698870730758441698569691729723713575e-05), + SC_(1.0001220703125), SC_(0.99992955383983791386301091466222734539118060355467854238385118863460180336591770779111045679237945045786873776), SC_(-7.0448641609366567338214494075777693865307332448868837181756428608376087273339198390868816550906450304788582582e-05), + SC_(1.000244140625), SC_(0.99985913714594034205878980722394270651070266886680721525579148722985946512786872299585878169952950155084026009), SC_(-0.00014087277616326635097030584178411951846640279051937897896521676513490342036437475141116837467757236371463821202), + SC_(1.00048828125), SC_(0.99971839211735866523005832066420299515608817676196471144193889051244066546497815377121028399780635540938064397), SC_(-0.00028164754158680683182392054639170724065894038359476068703975750485180064764636731267884353254046569566588895557), + SC_(1.0009765625), SC_(0.99943725522028108434521359203118190516500797436636326722510244581259842767599446851324731597976259518948982942), SC_(-0.00056290317999120463170214992168514502772879541390257627479851327242521375496316078955498047974490391404458478547), + SC_(1.001953125), SC_(0.99887639185670229384018166594439725095095947312101240404656716276062253854369107023559370003430011705769110439), SC_(-0.0011242398641763655930882350026740454995347120448051246807766325452465319026604793370057190525283304374866233861), + SC_(1.00390625), SC_(0.99776028924350090452551500508904405795133755282195340238940486963282177163716541194432652172131971470978813773), SC_(-0.0022422226599611501447654819092305299298079260417770143567963238377892856797491379587790257042671743196875073852), + SC_(1.0078125), SC_(0.99555044071429420946514324392976594135804811283276950233333294520174555163201058126609151736557274229008810138), SC_(-0.0044594880379522990866700789223521091987576375799193257939241836415369699743362378844236187907877816282112942101), + SC_(1.015625), SC_(0.99121906984205173417648186621914503971475375794490339430947476500778081798552753056206174599314583780671923895), SC_(-0.0088197097057330692048892296986270663800008130918961793125380525215482778706344040845486366868779812028188116857), + SC_(1.03125), SC_(0.98290109928362691478263486825456935046998823743496277043928362292034206769975910596393892249337556712953037341), SC_(-0.017246775001768067402891262022246231797366446505106380535078130887485701437593237496879558493144914283530453506), + SC_(1.0625), SC_(0.96758006759952488475997629871543175166460210218111998646615104815739441126428563127884962077687042597437275844), SC_(-0.032957100293577819083198835750474183157056130167483637604037935415773601610870065861297777718490000655850137079), + SC_(1.125), SC_(0.94174269984970148808740373015189170307630244851863449262289098722208295714986330160419107835129460670740615211), SC_(-0.060023184126039582931405843207430114278219450946316157230075155800865906698601740995330664462916031985954246411), + SC_(1.125), SC_(0.94174269984970148808740373015189170307630244851863449262289098722208295714986330160419107835129460670740615211), SC_(-0.060023184126039582931405843207430114278219450946316157230075155800865906698601740995330664462916031985954246411), + SC_(1.25), SC_(0.90640247705547707798267128896691800074879192072001636685834449989247981088468228040459003418084607509036793785), SC_(-0.098271836421813161463853802696635840225622703607649957741372996452825981263690594995652837575223508897214201633), + SC_(1.375), SC_(0.88891356915622534074242756406624469120777530125959687041567260050243557425925067192449287563913055244069020048), SC_(-0.11775527074107877445136203331798850424653921590958917561520411328795258332429161436283053688418097696213797973), + SC_(1.5), SC_(0.88622692545275801364908374167057259139877472806119356410690389492645564229551609068747532836927233270811341181), SC_(-0.12078223763524522234551844578164721225185272790259946836386847375732473702728167571405169185867383369099657491), +}; + +static const boost::array, 41> near_2 = { + SC_(1.5), SC_(0.88622692545275801364908374167057259139877472806119356410690389492645564229551609068747532836927233270811341181), SC_(-0.12078223763524522234551844578164721225185272790259946836386847375732473702728167571405169185867383369099657491), + SC_(1.625), SC_(0.89657428005659798477251233716026446039512985762916708173167491130943387331381057164434810407852018349966589612), SC_(-0.1091741337567953724659793453255625768435299286059898687340484442952414733165258751974324726197437467717935594), + SC_(1.75), SC_(0.91906252684888323384682372752216789513842943608105295842258920371736716632009876792787928216118629993663003518), SC_(-0.084401121020485555957786034131397731743842395915182408432689631664419632526805862967629781823020101009811140644), + SC_(1.875), SC_(0.95344581274503483234582966071503134975438630929661948044949103784692311528264456543964096548166121405845216713), SC_(-0.047672685399188299643978037161862272319696547817033461553833868303044383894387124447316587449792821486112114416), + SC_(1.875), SC_(0.95344581274503483234582966071503134975438630929661948044949103784692311528264456543964096548166121405845216713), SC_(-0.047672685399188299643978037161862272319696547817033461553833868303044383894387124447316587449792821486112114416), + SC_(1.9375), SC_(0.9751659479875942232435276412768010580753451885863147915106184843132734861345804378270270515690413153132861382), SC_(-0.025147619402988871014696369343039083625545098476478286910794564170216799157259831777764021648432959310687273318), + SC_(1.96875), SC_(0.98718775864865288960958223393038177410475243404832906026439245840216567209052357622855361836750022153991586909), SC_(-0.01289502598016741062140421704372482102582419956737669469875999217434043177771826105006088439333961006574460579), + SC_(1.984375), SC_(0.99349423495450370466462416192496392488580193239655482364608039492518197101881324701140718007215585449501866336), SC_(-0.0065270197705603875625040654329734641090978172082102811515005007943036017452347133121052021549402564023948207056), + SC_(1.9921875), SC_(0.99672209549866393696727362040773610549578093353551368844875597478990234005553775649368023384187038999462008798), SC_(-0.0032832885992213340080874430359011232107452519285440532337925143246804564808907940778759648203239061173174780116), + SC_(1.99609375), SC_(0.99835477803067545393743068321980175716057800857975203524559584847787135957318234818222348812044850614667079983), SC_(-0.0016465768332272092230929305879117388972032040939027611887512736747418892484504411587697933136947665600605804507), + SC_(1.998046875), SC_(0.9991758197849782200230487539873719343463883661498615300586773098971473300145706735505784897201293248167022208), SC_(-0.00082452003826508882618063669037370149307251988162149488885378333978767712311305925304980152039311581105853907029), + SC_(1.9990234375), SC_(0.99958751735839409400948608544661952010344897410984879410928697694236502907561273731758040913474128701681685356), SC_(-0.00041256773597148940171061762396967043263766321508278648166258325752450997988091121880044028815700667736697239274), + SC_(1.99951171875), SC_(0.99979366051727151584922291059729451551405543810824683844140835701610854970677796305573786887049192188809256652), SC_(-0.00020636077364837244333505423402898916069048973940689454315455907351479369424786720832798217923629191781310389304), + SC_(1.999755859375), SC_(0.99989680571459861341571906264387341779239383515965432002587914956847107033675313400257682074697025047121033239), SC_(-0.00010319961029799208618175017469614360196936704565252345328392393606626650213932477070288037281599692906336527261), + SC_(1.9998779296875), SC_(0.99994839672084520414479777346312714564818269771380888644919182156115738721443597212186634448939739571529633426), SC_(-5.1604610649812155427880333694545946032583928291310459746204246757312291926312160269132259332526873487515506522e-05), + SC_(1.99993896484375), SC_(0.9999741968262534527384281628962293685497837089579882039831044149772484157241222692173401067937018711238227639), SC_(-2.5803506654161686483250535590236551252779944206866471779380407628046074943126208389937084185400792859175711612e-05), + SC_(1.999969482421875), SC_(0.99998709802957748472165271328866008124387684231133068796602319768357099234668760081876750522856447385449314981), SC_(-1.2902053653651567952294533933096375210439735077108891847803568051352256875471682427281829037705917110753962528e-05), + SC_(1.9999847412109375), SC_(0.99999354891890056257515137297871569799850980919724170956673304961971970239682289813730037614565854931058777556), SC_(-6.4511019077505913999768740192962600117284299376931233759840535395258322495171008075393562455732103434271779936e-06), + SC_(1.99999237060546875), SC_(0.9999967744354781276641509840822795646932230190615127686569485868080197715727798678679478106327910318239504207), SC_(-3.2255697240167648011165810641817631895943837273553238407652697319745391186873682927024999574143933330895472859e-06), + SC_(1.999996185302734375), SC_(0.99999838721174601184126339217834043805312434049279307032066984380543456177710052395916314405417041535347717533), SC_(-1.6127895545325331730098184535055500629425336236844800875911774081883807398878631221152589710004973196673112522e-06), + SC_(2), SC_(1), SC_(0), + SC_(2.000003814697265625), SC_(1.0000016128002401193107443412962371398600117917051343176882902353374213648826021261731107498153573621415449226), SC_(1.6127989395584018429976031457249567704200403529787152140378258756848454641419753130324079036036484703727117411e-06), + SC_(2.00000762939453125), SC_(1.0000032256124663969442572979664904621852226931085253304073996272098932739673609259903665211081794374661535793), SC_(3.2256072641202395856634567509031717314101059280836768227158909313339479749111914772604792191845536704065057073e-06), + SC_(2.0000152587890625), SC_(1.000006451272877535864519325623917830418250216038636108564876372408652521536899197656914002663824783933815167), SC_(6.4512520681644922116961675029871399835844045626819177993485997811835355053462779555097865070545798819626865222e-06), + SC_(2.000030517578125), SC_(1.0000129027375349091336312076553993133407166704260599330351817590690292004797492025331366878130500736080695094), SC_(1.290265429530719797568036294024708700465577586146791905518758190381008775700560429617670389988551638710825012e-05), + SC_(2.00006103515625), SC_(1.0000258062421961242283255462273276791051475794593323673816513859750132897142264815427442208812997077505332853), SC_(2.5805909220784635000932542921243182948670906688837032708651521147551347202451406873759019347916128878550354773e-05), + SC_(2.0001220703125), SC_(1.0000516155529531284521055204867710743151785504056984006043570298441519256563676489175498013305621139650047081), SC_(5.1614220916310804284840873086425506800915170103272447074807387337444948198364058458841314609676466202956173574e-05), + SC_(2.000244140625), SC_(1.0001032433805951126501127539542219893980343833855735256110785456984214425363472065708089425349053632455548207), SC_(0.00010323805136409635819017324403933418099476148841019654151466840813072064903976559624757024778209256822407270965), + SC_(2.00048828125), SC_(1.0002065358635097192658151850785898130248167354420242645236976497363236931336622251353563827692896592938578806), SC_(0.00020651453791454435671312914625370260965873904340641431837448444290893250461685654148110548976824081184555996094), + SC_(2.0009765625), SC_(1.0004132681648321400916444646796498562442706774663304188532519599198372933280218068614047840617740820988545656), SC_(0.00041318279306425426425867498633204164488303891988195996296008500197515836906271837439664711441425330386370044763), + SC_(2.001953125), SC_(1.0008273223095474155078382707606949018317230658419518813982206142503893794392842168571475939796796094738194073), SC_(0.00082698026708538384658581452916749300081501348027476197514651933598645209011126954522998623663964384545076784737), + SC_(2.00390625), SC_(1.0016577903733583299338177980776731363027099651376641578674884824048249816826230893347340471967936198453732476), SC_(0.0016564177556961728691718611866123770809158280631257907208834264321979231840494137090508982490201065832908121409), + SC_(2.0078125), SC_(1.0033281785323746329765896755229672377749078637142755140703121088361341887541356639322328573449912793392294147), SC_(0.0033226524041026498607928211387846544793681646025987622876953484650611433293961582857408451320107812632540480799), + SC_(2.015625), SC_(1.0067068678083337925229893953788191809602967854127925098455603082110273932665513982270939607742887415224492271), SC_(0.0066844768302321849459648163438197694978676797752971342950752926557336453432652463099799428682789931143967973053), + SC_(2.03125), SC_(1.0136167586362402558695922078875246426721753698548053570155112361366027573153765780253120138212935536023281976), SC_(0.013524883664985620968136945574525932294330293453783975814783864413614105845778864422474269341128528209147896345), + SC_(2.0625), SC_(1.0280538218244951900574748173851462361436397335674399856202854886672315619683034832337777220754248275977710558), SC_(0.027667521522857023497407296289946080129146344977240133210479764492944486311282352627343782333338196694492200886), + SC_(2.125), SC_(1.0594605373309141740983291964208781659608402545834638042007523606248433267935962143047149631452064325458319211), SC_(0.057759851530343871607388266263091590790261261618416983877273482993941813829532045934310864175292082963981368659), + SC_(2.125), SC_(1.0594605373309141740983291964208781659608402545834638042007523606248433267935962143047149631452064325458319211), SC_(0.057759851530343871607388266263091590790261261618416983877273482993941813829532045934310864175292082963981368659), + SC_(2.25), SC_(1.1330030963193463474783391112086475009359899009000204585729306248655997636058528505057375427260575938629599223), SC_(0.12487171489239659430244128761319866314897838194035725592991487603456576250457773842275438652511872681874913935), + SC_(2.375), SC_(1.2222561575898098435208379005910864504106910392319456968215498256908489146064696738961777040038045096059490257), SC_(0.20069846037745584135888518027261109134866723494706223724132356736244017467986095189463419012919775182657330309), + SC_(2.5), SC_(1.3293403881791370204736256125058588870981620920917903461603558423896834634432741360312129925539084990621701177), SC_(0.28468287047291915963249466968270192432013769555989472925014585038677593422163257555370073595863956755497197314), +}; + +static const boost::array, 40> near_0 = { + SC_(-0.5), SC_(-3.5449077018110320545963349666822903655950989122447742564276155797058225691820643627499013134770893308324536472), SC_(1.2655121234846453964889457971347059238991475408179110398774915452294625069121077554976749621341635413930063871), + SC_(-0.375), SC_(-3.8253835949081514016960526385504616976858873925511128820551462882535845261389251056825519107350194495985744901), SC_(1.3416587485006664180414088132747834874363789654642744823426893875534469775753756869339978564518566788922789946), + SC_(-0.25), SC_(-4.901666809860710580516393213451562107404956992432282444920475753159291553707193428948689504859660266328693521), SC_(1.5895753125511859903158972147787828359106675837030891563153360726716605621333640325822077713489225603702247544), + SC_(-0.125), SC_(-8.7172188593831756100190140408231437691829605421405209641096323460290113397270360268767173986894739571058483852), SC_(2.1653002489051702517540619481440174064962195287626368747108560387197374851717119014002048759408477767728350775), + SC_(-0.125), SC_(-8.7172188593831756100190140408231437691829605421405209641096323460290113397270360268767173986894739571058483852), SC_(2.1653002489051702517540619481440174064962195287626368747108560387197374851717119014002048759408477767728350775), + SC_(-0.0625), SC_(-16.642832178988274743356205077790738057819224551873105775114555465613200830030172805581261680111638448013416759), SC_(2.8119796239743635383271560321736601168053640643142965724073032866652588956740311615653929614160048414373882428), + SC_(-0.03125), SC_(-32.609040801813566418071361533700352796234402982757708313249608948510246716796649743807706619623233124415285482), SC_(3.4845895751341394376217526729956836492792382135545838747513220302846143713216776627947075542347606347812932675), + SC_(-0.015625), SC_(-64.592895021803923401687310591184956132257852620576008851656274565294370687191413646963869993262704444628515002), SC_(4.1681044205572506375484381747769142138648379498874926763678807959138514127018146724233647135867482895326211992), + SC_(-0.0078125), SC_(-128.58499852480401530135284249417597127907775444917997064208203063746267668873961104246029095484412968245555529), SC_(4.8565901527814217247857214496622784349723475051889437415484624107256449893582598466583154935270343853482532093), + SC_(-0.00390625), SC_(-256.58109307066018254605277355095265865598290341287305639943282166998344086661991517831450399004593450520869623), SC_(5.5474447669674715952070818247210734705495040209931693437975489152255902055394669961191989376845895870056785217), + SC_(-0.001953125), SC_(-512.57915088397912037127611069523606332152569834831565740841860024594479389303251398677660980272716580185829153), SC_(6.2394551398370460464865359486750822233240923241495142262282973804419276796587252605885022629924128386978750007), + SC_(-0.0009765625), SC_(-1024.5781824062516573998933348321353958084008909835863236871355827314930134193447718920031232540278394672001457), SC_(6.9320362775113082175565786721095494761582286817492636972219574913672985956846164887359308054877632333869999562), + SC_(-0.00048828125), SC_(-2048.5776988188734675195207869124937838781948120562638727221069064318965092668967452645498614337956765720147553), SC_(7.6249010258838589056112032453658101706532717642128135900064726950101977508747813314752005676395042766347340988), + SC_(-0.000244140625), SC_(-4096.5774571877546497133129448824897208696543417684774145072771873520258697902075867736693231416852839388516552), SC_(8.3179071375412196353772991727418041069470987133443886451825640845551685565491787042054184177922276999407459318), + SC_(-0.0001220703125), SC_(-8192.5773364128002405085423131290207095607477118824455478830737227517981664227716383633402439892710622649254566), SC_(9.0109838204323261925101725694129128145879930379896700959398781376806821096039472721561708996019050965927211732), + SC_(-6.103515625e-05), SC_(-16384.577276035469593933614883128341038103720235335948750462409200392535439185883631637151600699265073745748403), SC_(9.7040957613515511140804875923086885344822151155125496190736160789898546402483381275986803463153051405752565365), + SC_(-3.0517578125e-05), SC_(-32768.577245849340323934431490863213420538606204252100856465730714043705318027966700074078020448877073217681975), SC_(10.397225324389321751118257981741350715545033538430337479229750218348756164671019139428554102814000571479070659), + SC_(-1.52587890625e-05), SC_(-65536.577230756909628996363610179019256663039402416314274757744375967671602673489918419843339804715063275773901), SC_(11.090363696762696206162694407004535550779972817434273639750684530523954335849427093356237883660100999788429204), + SC_(-7.62939453125e-06), SC_(-131072.57722321085275738619063681843591600000426344750413647589546105124549065712526188209728475829273862142767), SC_(11.78350647337298147181546230662592344688602624116429729228034520587350457563299672747145157032696642372856542), + SC_(-3.814697265625e-06), SC_(-262144.57721943786393940131990420461387822572889075747272123720027360758852386603599464842582811358907795642824), SC_(12.47665145199400263809495861913874999344625338521472943706726050616361678213557912354896418693243516760668981), + SC_(3.814697265625e-06), SC_(262143.422788108034462562933172673185515456173555729293010111557065310773023629457669218260431013242835881758), SC_(12.476647048187965442022540472065347116383479487309949972008214741576509389536881912613656457111685822311497381), + SC_(7.62939453125e-06), SC_(131071.42279188094404719627779254015209788304719898563008056199996243569123588178644135407350752403201320811243), SC_(11.783497665760906812760375842948903428176428075317647408343896845802285497485572186668336976548526173271184294), + SC_(1.52587890625e-05), SC_(65535.422799426683985400271454517324214377507048398259894881509891790581311761565393366883893458417829165240563), SC_(11.090346081538544752770519882173193187528103071688531351284982261237177464624277027399310810395123887043769593), + SC_(3.0517578125e-05), SC_(32767.422814517846946712424323330929297653533863422272563414016849898012012340553077313180372110926700212481801), SC_(10.397190093941001762077888432721419773538263621284980386087595611130083710453618086121153091365977520386941415), + SC_(6.103515625e-05), SC_(16383.42284469890528218878340665131432419969255047068156812042208283397601650891029967666331544927732210443312), SC_(9.7040253004547744779513374741677442322475077760995803568370826388756352920940943196113558195081630558962910106), + SC_(0.0001220703125), SC_(8191.4229050559521903657854129129664134445515043199266192085089372946579731735978622247768620431724581508606997), SC_(9.0108428986376796558566793644622196072876364393508694347316583669855087095187579636778323821368920315957144647), + SC_(0.000244140625), SC_(4095.4230257497716410728030503892693258678381316784423536877219316935043691637502893910375698412728383522417053), SC_(8.317625293943180446655815151656334697387535209532543670469194897155588560215972212518948755582346678140303134), + SC_(0.00048828125), SC_(2047.4232670563505463911594407202877340796685860085037290330908477694784828722752589234386616275074158784115589), SC_(7.6243373386178115967577294154935505415898425375792130346404403469224780410189955043518177534280650972663504023), + SC_(0.0009765625), SC_(1023.4237493455678303694987182399302708889681657511559856385049045121007899402183357575652515632768974740375853), SC_(6.9309089024194618895406190646600805357272725481886499649320015816615110059419839952690782894844419715059702254), + SC_(0.001953125), SC_(511.42471263063157444617301296353139248689125023795835087184238733343873973436982796062397441756165993353784545), SC_(6.2372003851753314191620008581209150671799664971974921624053434528952960658245919611157642239152398574405267058), + SC_(0.00390625), SC_(255.42663404633623155853184130279527883554241352242007101168764662600237353911434545774758956065784696570576326), SC_(5.5429352218196013251930914897561820146741931488402650186086437521093596900778085868881275902670823260163243408), + SC_(0.0078125), SC_(127.43045641142965881153833522301004049383015844259449629866661698582343060889735440205971422279331101313127698), SC_(4.8475707758816648668339547712848838673297433029418674530508358828122183838135267713566196701841430311657990729), + SC_(0.015625), SC_(63.438020469891310987294839438025282541744240508473817235806384960497972351073761955971951743561333619630031293), SC_(4.1500633736539387872985034990504323420729999930696353454115420044388134539475338895506313252916341440491900744), + SC_(0.03125), SC_(31.452835177076061273044315784146219215039623597918808654057075933450946166392291390846045519788018148144971949), SC_(3.4484891277979584796832693452686366085801342252961698900683219165794824084108803405324370764889485234264769516), + SC_(0.0625), SC_(15.481281081592398156159620779446908026633633634897919783458416770518310580228570100461593932429926815589964135), SC_(2.739631621946203418585729650082232089144944407273537378878682102557800886267908796562155530267184749512155787), + SC_(0.125), SC_(7.5339415987976119046992298412151336246104195881490759409831278977766636571989064128335286268103568536592492169), SC_(2.0194183575537963453202905211670995899482809521344496051319648726793149592104824058222593165263400306400501967), + SC_(0.125), SC_(7.5339415987976119046992298412151336246104195881490759409831278977766636571989064128335286268103568536592492169), SC_(2.0194183575537963453202905211670995899482809521344496051319648726793149592104824058222593165263400306400501967), + SC_(0.25), SC_(3.6256099082219083119306851558676720029951676828800654674333779995699192435387291216183601367233843003614717514), SC_(1.2880225246980774573706104402197172959253775651128605504999870225339612626756988362160738164176138661867887604), + SC_(0.375), SC_(2.3704361844166009086464735041766525098874008033589249877751269346731615313580017917986476683710148065085072013), SC_(0.86307398227064746240508909413401549533247062934842713501214158155473398936618356558114368929134299687589643426), + SC_(0.5), SC_(1.7724538509055160272981674833411451827975494561223871282138077898529112845910321813749506567385446654162268236), SC_(0.57236494292470008707171367567652935582364740645765578575681153573606888494241303989181163513774485385100490611), +}; + +static const boost::array, 40> near_m10 = { + SC_(-10.5), SC_(-2.6401218205477163162463853253112404396824684325225876560591681547776531412320896733077825213069197651551576322e-07), SC_(-15.147270590717841146101176395526319634361233144976539395806067304933214009506219449748237918628779426212247756), + SC_(-10.375), SC_(-3.8538247770911000161675656207521103284982443268350536808271424732765885254708394649373422005676760008400862845e-07), SC_(-14.769029547207010126880427205161037877615976647148661939990931059310398340635726942011822643125761107580456434), + SC_(-10.25), SC_(-6.7808180432946731304891004492754985848002028127645937925987831604279861015230319565197133049475246720265617509e-07), SC_(-14.203997900931090651611168760703872067369359534543268877527871797142641008794669162514478870187681525502707551), + SC_(-10.125), SC_(-1.6848312620525174562168823278898954773941569991332984138613039137544611702464441186507014913285532369128084283e-06), SC_(-13.293845140389538484236785089823191703003394811834373853890795281383497051542460456218069071634943022448287749), + SC_(-10.125), SC_(-1.6848312620525174562168823278898954773941569991332984138613039137544611702464441186507014913285532369128084283e-06), SC_(-13.293845140389538484236785089823191703003394811834373853890795281383497051542460456218069071634943022448287749), + SC_(-10.0625), SC_(-3.8303281070203166358893255038075515689788548682068602059827696781608124010000092944728511165171308472386964422e-06), SC_(-12.472560090811655790399293558057858441571483321784488448140552924013774813892809787659569031629236371679128839), + SC_(-10.03125), SC_(-8.2062995295301977865739252471114097581399704534847069178172887098466492511561233864084602910264856198265594463e-06), SC_(-11.710608463327203877922439589134156179378847473881039377256783779098476940306696210613202752304294682131268418), + SC_(-10.015625), SC_(-1.7006998746430383834615574873683499132247356904352807785456785414586550135480125148421847460446894633835659992e-05), SC_(-10.981885607663038890372660918270813522611221711995411719058690162881036908939868531688553907126919411287616518), + SC_(-10.0078125), SC_(-3.463458256516313677243695342138690766684809142189547960850013490387874801698738453473277516306844214190487446e-05), SC_(-10.270657878961264244105831591933113500642522530339833160069979898957856531876909280009891153999986577303842319), + SC_(-10.00390625), SC_(-6.9903328747582090334264466990359269997790653299612523014453525670654238269220629079646079250632662914745041101e-05), SC_(-9.5683972882906823868530086836819678493673162133442777382100031989521977539800474524598896364796335003838921442), + SC_(-10.001953125), SC_(-0.00014044773639004517085218511186084665040117005949411662519219403186667777541881413063638150159120500428997284589), SC_(-8.8706751213823100948059663871462545011894831848821935981721426737578215404617912777046971345675238130508911839), + SC_(-10.0009765625), SC_(-0.0002815400414018834118126663382034402741479689594171010756083558783027365535191173266085209272398959320435563284), SC_(-8.1752358775093991610978176096814198666058029396327554625972822598030753524724073225250659907922887435361988651), + SC_(-10.00048828125), SC_(-0.00056372640438562406339795157397595352175803840824393729467758565225052293961979009282839532228849140550901819684), SC_(-7.4809415227716591112920917790199883465363850706824864438555393281281733627770678389764713533283267723802617478), + SC_(-10.000244140625), SC_(-0.0011281000088666906790099028077029688733534633312018939073522383169843972006791891083746340544137656977029625796), SC_(-6.7872204694935549116145712572380064251227733468906266602833942926516998884084256262328209944154842509580856106), + SC_(-10.0001220703125), SC_(-0.0022568476575951849572338512766050487930850625293184263204693320098204581647371184438839524848065868431985384286), SC_(-6.0937862811673102385457363204870585320705297624776227202341269453083012501968923010671604671028494883139694941), + SC_(-10.00006103515625), SC_(-0.0045143431750628939550724288601553265505525647611190489661018364911927229954027861461294408164473421068389146262), SC_(-5.400495578872419834979145899538225218652673336401402460949985869151998056499718543213055629562601331078338338), + SC_(-10.000030517578125), SC_(-0.0090293343200355756478399974744597147912262573396960327275240218667234867315410338423464826636465932829121757205), SC_(-4.7072766329820541734836113471950573963927578010264651492145413498249528107073028945299745857456918034683085008), + SC_(-10.0000152587890625), SC_(-0.01805931666500754906434806474181437991941766881544879124877659844144751708341968615676038223507335972382445726), SC_(-4.0140935686411618585462277846106506660699161075773229965810063609108594642004394925755368750818713942886926083), + SC_(-10.00000762939453125), SC_(-0.036119281382466795747699608016365542645360304984522876478635716949605359588149124449398506063147283098365457863), SC_(-3.3209284459118088536424235871595334843808788990922450452806348667114328163342888050473951063973084685876207443), + SC_(-10.000003814697265625), SC_(-0.072239210831143437784442631076517501061328351017534557386825420427208991397828223393126909285392207582909685565), SC_(-2.6277722941974261500946577710005105141808674548717098205508892010986355128153814698800661001225613213555912579), + SC_(-9.999996185302734375), SC_(0.072240506991080140226280464486758514533737515018901029832903166227124013202904526666574637362350414490614743936), SC_(-2.6277543517490842715915533024499471614985034496459263514869947373789277617858159307952003679450429054090048394), + SC_(-9.99999237060546875), SC_(0.036120577542403640698404710834445867288551703065790706542765373704676585286302915440960140762729857943113743194), SC_(-3.3208925610151250976409481654228433171371492088599903431349931831149381203023886830928385314956526143963256776), + SC_(-9.9999847412109375), SC_(0.018060612824944964050522420153647987326759440429090182879472515318648397708797273550747584584544200555283075984), SC_(-4.0140217988477943545811450640575117955018130004911076783885699392302224415399109280900833116816446077477975638), + SC_(-9.999969482421875), SC_(0.0090306304799752707758941626596459565197411504398981405305672474400443191735267440971853907490817836401673825686), SC_(-4.7071330933953192298563908896026844530558294019434613821600142656362705685591427608559131087722307670071704099), + SC_(-9.99993896484375), SC_(0.0045156393350117096506906235123693717642525834884264548975756002470555437234213226039016466275186830824011549991), SC_(-5.4002084996989504621482648573278564806711207379749341638368371970751514723243487188721029178770263189901608029), + SC_(-9.9998779296875), SC_(0.0022581438175804829238248097866602612484145368186317691587687683989148226748938244465292050256428844284406054563), SC_(-6.0932121228203756082724533754817787769633622618085393842967788052554447785887230884400714289450736790039304928), + SC_(-9.999755859375), SC_(0.0011293961689979177409582533434385718648499977117105373699571877447937321743618349398302296852834539762401049319), SC_(-6.7860721527997185741758434624052069356140387438793337035461509813989634836354221109803516247925070522339098306), + SC_(-9.99951171875), SC_(0.0005650225651005676902373042742306456894426751663163785063372803519818090560489289692863232794723772605605138254), SC_(-7.4786448893842498212775003061077738739629442621603838905244848422998329225846889688165479130280062735500001068), + SC_(-9.9990234375), SC_(0.00028283620445169623360208006410504918893303259870304545298219926493573852339806310324072330819283446263445648985), SC_(-8.1706426107366876599766469685063136982163173031269613541112734472501752431806154620855941523707592358821573282), + SC_(-9.998046875), SC_(0.00014174390877938173881755385055519122068838618578180179002632489356897973325849852862365474365887363071432149114), SC_(-8.8614885878537437239909034045275205498625084713195372673470850432327423783025263246622420625330828387002099979), + SC_(-9.99609375), SC_(7.119953849576511774290270246050426493187892612378450120522214272512656687770624516610244744772466266046045893e-05), SC_(-9.5500242213684027018628650534771547352625329091599816412816260273825896031500048046845276735177601595018177102), + SC_(-9.9921875), SC_(3.5930941760756412433601439672728188991952641189953864041371230226803762792766846195289464629690885330539776437e-05), SC_(-10.233911746195529494341636009604122245422344310878454861680046147466235002599645306931790254829751980426939683), + SC_(-9.984375), SC_(1.830395592410737084371847753712605958897829969992610952084772709639305869757082989106363209867797862442107124e-05), SC_(-10.908393350762171699657964143696240687663821790887704824802780507800640785598149475120005640690502223974553771), + SC_(-9.96875), SC_(9.505651717966543211040666528035462899478708721352313858572893055517428213772311465457742360062673498799299903e-06), SC_(-11.563624018570459074426000149190015660069301525083588717478426971926250695139858700844030463876648475101876574), + SC_(-9.9375), SC_(5.1393098719794843214983768167746592270465393195053446784457500258107908538070746947791874439824691854907937821e-06), SC_(-12.178591753663558334615607691089929332278639626474014617397553470892979866404787276458175722283328560235748117), + SC_(-9.875), SC_(3.0331378349844118367916527868421330423279022961121689459116361879468133814976899135069225672564620763035808775e-06), SC_(-12.705912885191709216330649855766060886050511713221700171057560196038359990767026197941657384611796420084690294), + SC_(-9.875), SC_(3.0331378349844118367916527868421330423279022961121689459116361879468133814976899135069225672564620763035808775e-06), SC_(-12.705912885191709216330649855766060886050511713221700171057560196038359990767026197941657384611796420084690294), + SC_(-9.75), SC_(2.1975471554628538878687097038174467045673963558516761458733594224768790871811561734110581396760034627420207205e-06), SC_(-13.02816874893114553892881831326149507953160856763706972216958177840795541404570842934499260464645281219524649), + SC_(-9.625), SC_(2.2482144262764106485744600287631988468245040795826756238383242667919200286457284010570008975693593479892337832e-06), SC_(-13.005374245127447905440562160338200328457464849456589811238656297567198731475962077658512536105296188433561627), + SC_(-9.5), SC_(2.7721279115751021320587045915768024616665918541487170388621265625165357982936941569731716473722657534129155138e-06), SC_(-12.795895333554363459017810536618790768152157991932184009732662830851533475505235930692826992223594497973217513), +}; + +static const boost::array, 40> near_m55 = { + SC_(-55.5), SC_(3.3139392476846767283772683472966711027379358916150215150100091113288581639716577666936138823743494933582485708e-74), SC_(-169.19315929474335779344369504127764360638576736584657350719841893651263762818182983422637103883600009475295023), + SC_(-55.375), SC_(5.9318859132518291480114318459074384575764572752286332720058209655273732493724597193570531603155064624894472949e-74), SC_(-168.61095468989415809790338364314570312342609364969016065650021960725483321171774482698122412629076944633855119), + SC_(-55.25), SC_(1.2813426521356120465015177624260127989204569715020077966304829152772083413607018666340428486300332280796208268e-73), SC_(-167.84080331341333383815979953761769175591813615840570079497886049657539310492828513105040463659546252211816577), + SC_(-55.125), SC_(3.9131911034762969245238588487381041440846027762491865228553788345525175997195411344274833797237931115609718734e-73), SC_(-166.72435860843190139822628508932092125390175115884704297746744101312162433253081529570258774243551333817830547), + SC_(-55.125), SC_(3.9131911034762969245238588487381041440846027762491865228553788345525175997195411344274833797237931115609718734e-73), SC_(-166.72435860843190139822628508932092125390175115884704297746744101312162433253081529570258774243551333817830547), + SC_(-55.0625), SC_(9.8673260748719801875429285251138910685603226064990180114590137125530954288639029165366000246631264886799703812e-73), SC_(-165.79948288622388202234636515611843830505514258701793419810113570552493456762468969521506734143100583664732933), + SC_(-55.03125), SC_(2.2266603436756153752904641869096011836186795399043787377981231678451750266953030611051107662716958210621245176e-72), SC_(-164.98562383636151624509401976786053064837595790874753092152373576035270874465656548258782871456207195221944214), + SC_(-55.015625), SC_(4.7360694547400010557633537120899731339514832927411000411557017241069914315190052808401850645764826258988157223e-72), SC_(-164.23091913282262531153543074864624423458124037703612931710548143819607381413472198841194346813378767049857102), + SC_(-55.0078125), SC_(9.7711411829383473352191234385949187141301095595021430916520807560660169392008422644376163773341508350241419744e-72), SC_(-163.50669343153341345258524324381801036966183326252171998393543422918069158015224990644429130175698598699531559), + SC_(-55.00390625), SC_(1.9849813368130565400082616367736733898222309059037526584787565396148994249432311844770938652923241295223173372e-71), SC_(-162.79793209059158135187371040016035284056001188974505773778388041815604246557372874833520121084623675848324653), + SC_(-55.001953125), SC_(4.0011527025839186802362202986064746607659562719948879104538703040305946839868510269637364333411827497280876609e-71), SC_(-162.09695910732599926634580619546086967483516523508116372639480433720335112449010866710477018788763078059531739), + SC_(-55.0009765625), SC_(8.0337165791330065335975494516865674084243424087485487106774189934117418204397780662715970161029291548435735322e-71), SC_(-161.39989434494066669193445734325668854800347599330188459461000783505748749530276418597694449437396439975642739), + SC_(-55.00048828125), SC_(1.6098955582234111797192918389653091448532474529983175191497792172611202123857866753532046573856256174280604906e-70), SC_(-160.70478720335970779044810048577706572168294270359200751102024774726873809107608410429108303843036597175851574), + SC_(-55.000244140625), SC_(3.2229489383739069077426589427292221486316835695264580306146368181978314124729044747056203876145163299274839162e-70), SC_(-160.01065974976279784681276079462713523274703044269550248584357078652658101108956772105309588537940153835845253), + SC_(-55.0001220703125), SC_(6.4490584927092060270881030241102009753530989802388015943440565730695270982447302276967661985453793370842809927e-70), SC_(-159.31702235955279567847278381399076746835459254718344944015223186406361061632854529086525121167403149843204951), + SC_(-55.00006103515625), SC_(1.2901278999465709067481172051357680823144647144568010162984581701224308123653537826832760721024936282443616929e-69), SC_(-158.62363005588493092816609841988394155956583356426839818962424302647689373565571590600021022739583173660825912), + SC_(-55.000030517578125), SC_(2.5805720712289037815987851594678385818056219448843736699329563576677642341882019081454419267963820729415843202e-69), SC_(-157.93036030920030332559475681177857998315815179296792358505521494080549634853806742842599525295140408602520327), + SC_(-55.0000152587890625), SC_(5.1614604487657722043250649624190917425292416189357191604774760397102648986075958213671067240971910379231601532e-69), SC_(-157.23715184443533623970061088892203568266958809147580434329834884584272834667232463377062600899364515818112128), + SC_(-55.00000762939453125), SC_(1.0323237221327282306659069651742858534255822887359607372715440005717339347982261692628904404013928528138747796e-68), SC_(-156.54397402148720988565208247423205185881626540946911738049902395409778731347569805387628207669123601334895297), + SC_(-55.000003814697265625), SC_(2.0646790775194607155547973586647286676515701833028398450458745081506384416914447177006207163885808000864861054e-68), SC_(-155.85081151966175651492016050142678242361703242831924093683985874119382809840757393245978293124570333614782346), + SC_(-54.999996185302734375), SC_(-2.0647423457763898724441926766911315065748070017125332824216525333206102831503809803767031509941257051095480361e-68), SC_(-155.85078087698790531440342542733440432240051900423559858958186239966734563886801864889432738076539471668895153), + SC_(-54.99999237060546875), SC_(-1.0323869903896693318830692237031954173816799563002261478764664298984104173642680845761561815785364811365950836e-68), SC_(-156.54391273613950748465465267775551173404636022049848355502194287658532776162587291004675505997222135700600833), + SC_(-54.9999847412109375), SC_(-5.1620931313356609896075688482137310567330154490050164964662354612513882037233620876810059122881731302591840784e-69), SC_(-157.23702927373993143799407410963469018278376350720219187972772250750700644789716664384228749551614603436871943), + SC_(-54.999969482421875), SC_(-2.5812047538007036593280731337730752898602262231463037817558505350246736606350620972639615315635322909651300801e-69), SC_(-157.93011516780949372448826576252996308778678964456988096449223016883160136143552770098938132537009369756377915), + SC_(-54.99993896484375), SC_(-1.2907605825260151543166837175559445009795374956430246284126711484577031924699174545944895326636671560177808025e-69), SC_(-158.62313977310331174440577639600157603341423045107632974931252232310276610527561242387710371984731250986549586), + SC_(-54.9998779296875), SC_(-6.4553853188094233046876592895012648526525180150283982410436290391286449231992481112970048887626762406755841465e-70), SC_(-159.31604179398955745857342036334579627322321174599523639438610416496491311033164651485814292304911182363789844), + SC_(-54.999755859375), SC_(-3.2292757656972235264817841973017091612850066235367577135589531310177286051775644893848808027910916408840977495e-70), SC_(-160.008698618636322587984278676721311394088533466446436344243872086944887040043886445247026629363735214473968), + SC_(-54.99951171875), SC_(-1.6162223904391272987614396144702464048620728230822869522050389281968219339860682149986737507185342236122482244e-70), SC_(-160.70086494110676672055309472267163668000786442396165599182969366303437562734113536343158325224802778831022075), + SC_(-54.9990234375), SC_(-8.0969850969864894557318737691129310533152378549300982938253861469921910001290234535035353039291664032683997005e-71), SC_(-161.39204982043486013424012017896022763434405540685541863080825447440184983633823935682152910471761682194009755), + SC_(-54.998046875), SC_(-4.0644220032281560703728901101136615238229622973622761832467789502241278374515215353594012570458502857903981801e-71), SC_(-162.08127005831499080772273733065198611316466700027432803456286137458898401259735082441220119389429933849355178), + SC_(-54.99609375), SC_(-2.0482537687077942321090221494955604658948917393938808734782620010367460550782558724337143218077466815606828151e-71), SC_(-162.76655399257440168875915457183408280308181309108442817686019319039574202034357650371627118245510718069276458), + SC_(-54.9921875), SC_(-1.0403990765904058990542225796822538651968437182446447227222447641641087941482441402308781506170093116348625277e-71), SC_(-163.44393723553775215962440891211372104324292658809768134937071615839546889202248565570727559357168585211528697), + SC_(-54.984375), SC_(-5.3694203178248012960900203599575845045610933561396749930640665980127154398291281623913230156597442878775142006e-72), SC_(-164.10540674114088699865988860882135830043683987131160528991359858820364329321760996768871762443071852512281227), + SC_(-54.96875), SC_(-2.8620199166194479828493095671425742915953512414537009228248225603396036162945784882292674609093835486992929556e-72), SC_(-164.73459905547471402450903404825766145807171664983496017940723813429221345967182421940603213707285850265527743), + SC_(-54.9375), SC_(-1.630184748946170270451320476784206632433100949854187290655399013933472279746756814511062145550705943739852752e-72), SC_(-165.29743334426367988801614492623357248875947820678485342207381159442753904137725281319125060291177520756987098), + SC_(-54.875), SC_(-1.0680846658670924739602982648760091697857219572998674888647870128655188067134225296553126235143157749497843576e-72), SC_(-165.72025968301894168117211535724538401110675145308696617050338903177744719353297591311385180951230869443034591), + SC_(-54.875), SC_(-1.0680846658670924739602982648760091697857219572998674888647870128655188067134225296553126235143157749497843576e-72), SC_(-165.72025968301894168117211535724538401110675145308696617050338903177744719353297591311385180951230869443034591), + SC_(-54.75), SC_(-9.5458361856251771955421646288223745986868922040967488750625623295543548143461204454601975061372552514173142635e-73), SC_(-165.832606730654205986120867393356943779751171701619270053868138901004382167757346011577115957303576501169292), + SC_(-54.625), SC_(-1.206186475649396145903288691554707530168287112342184654831637542295698786164449139797442886500595537701817763e-72), SC_(-165.59866298596103365955616501583662559837750698138902842335766258991320191255510277437255784261835345464069791), + SC_(-54.5), SC_(-1.8392362824649955842493839327496524620195544198463369408305550567875162810042700605149557047177639688138279568e-72), SC_(-165.17677627399096896709758625478184730591369935521644314593949193117554720994255451755959707734651803272517273), +}; diff --git a/tools/lanczos_generator.cpp b/tools/lanczos_generator.cpp index 5ec69d918..a16d4364d 100644 --- a/tools/lanczos_generator.cpp +++ b/tools/lanczos_generator.cpp @@ -12,10 +12,21 @@ #include #include #include +#include #include #include +#include +#include #include "mp_t.hpp" +// +// Define MP_TYPE +// to a specific precision multiprecision type if you want to +// create a lanczos approximation for that type. +// + +#define MP_TYPE boost::multiprecision::number > + // // this is a sort of recursive include, since this file // is used to create the contents of gamma.hpp. @@ -3628,6 +3639,646 @@ lanczos_spot_data sweet_spots[] = { 48, 36.410855412483215, 1.5004189889736636e-65, 48, 37.011237367987633, 6.8526723104762059e-66, 48, 37.011237375438213, 6.8526715926507402e-66, +49, 32.804697265625, 1.43398975614025e-77, +49, 32.80474609375, 1.44673437055229e-77, +49, 33.440634765625, 4.27570575602756e-78, +49, 33.44068359375, 4.31374583006685e-78, +49, 34.071689453125, 1.3311629562209e-78, +49, 34.07173828125, 1.34302740537616e-78, +49, 34.6978125, 4.3180939436597e-79, +49, 34.697861328125, 4.35671988075901e-79, +49, 35.31900390625, 1.47025173244693e-79, +49, 35.319052734375, 1.48336146723368e-79, +49, 35.9351171875, 5.15604524622028e-80, +49, 35.935166015625, 5.20239853250623e-80, +49, 36.546201171875, 1.89501379810394e-80, +49, 36.54625, 1.9120635932297e-80, +49, 37.152109375, 7.16858816674083e-81, +49, 37.152158203125, 7.23377831202289e-81, +49, 37.752890625, 2.84316453204977e-81, +49, 37.752939453125, 2.86903747838692e-81, +49, 38.3483984375, 1.16185980624431e-81, +49, 38.348447265625, 1.17251002885751e-81, +49, 38.938583984375, 4.89658368061457e-82, +49, 38.9386328125, 4.94200005973042e-82, +49, 39.5233984375, 2.13065629695396e-82, +49, 39.523447265625, 2.15069572328143e-82, +49, 40.102841796875, 9.67604255181201e-83, +49, 40.102890625, 9.76740702977543e-83, +49, 40.676767578125, 4.50630247183498e-83, +49, 40.67681640625, 4.54930080744076e-83, +49, 41.245126953125, 2.15387681720274e-83, +49, 41.24517578125, 2.17473706057203e-83, +49, 41.80787109375, 1.05682121783075e-83, +49, 41.807919921875, 1.06723874854161e-83, +49, 42.365, 5.3732505406968e-84, +49, 42.365048828125, 5.42671775522331e-84, +49, 42.916416015625, 2.79825365457182e-84, +49, 42.91646484375, 2.82641567518989e-84, +49, 43.4620703125, 1.48702015592533e-84, +49, 43.462119140625, 1.50221776839907e-84, +49, 44.0019140625, 8.01177208266458e-85, +49, 44.001962890625, 8.09565323702789e-85, +49, 44.53599609375, 4.42566611189109e-85, +49, 44.536044921875, 4.47291966331024e-85, +49, 45.06431640625, 2.49957129718041e-85, +49, 45.064365234375, 2.52668601869568e-85, +49, 45.586875, 1.43196123451618e-85, +49, 45.586923828125, 1.4477759848853e-85, +49, 46.10376953125, 8.38746806134962e-86, +49, 46.103818359375, 8.48100243483236e-86, +49, 46.615, 4.91772041740201e-86, +49, 46.615048828125, 4.97369333258043e-86, +49, 47.120712890625, 2.8986790595583e-86, +49, 47.12076171875, 2.93248475871069e-86, +49, 47.621103515625, 1.73183181437907e-86, +49, 47.62115234375, 1.75238561661062e-86, +49, 48.116318359375, 1.03658031298704e-86, +49, 48.1163671875, 1.04913081745512e-86, +49, 48.6066015625, 6.24079697368347e-87, +49, 48.606650390625, 6.31757720373193e-87, +50, 33.54638671875, 1.92761599350307e-79, +50, 33.546435546875, 1.94516650364829e-79, +50, 34.181982421875, 5.76192865620046e-80, +50, 34.18203125, 5.81436002400983e-80, +50, 34.81279296875, 1.79764857133798e-80, +50, 34.812841796875, 1.81400022919546e-80, +50, 35.438720703125, 5.78653632499813e-81, +50, 35.43876953125, 5.83972710207297e-81, +50, 36.05986328125, 1.97160801805539e-81, +50, 36.059912109375, 1.98962723354967e-81, +50, 36.676025390625, 6.90862452044191e-82, +50, 36.67607421875, 6.97216511712785e-82, +50, 37.28720703125, 2.51020639219632e-82, +50, 37.287255859375, 2.533501052945e-82, +50, 37.893408203125, 9.54172211017555e-83, +50, 37.89345703125, 9.63040270153392e-83, +50, 38.494482421875, 3.7244684010854e-83, +50, 38.49453125, 3.75949927313683e-83, +50, 39.090478515625, 1.52160071659105e-83, +50, 39.09052734375, 1.53593965559733e-83, +50, 39.68125, 6.38933786856091e-84, +50, 39.681298828125, 6.45010684683321e-84, +50, 40.266748046875, 2.75949080957442e-84, +50, 40.266796875, 2.78612547118161e-84, +50, 40.84697265625, 1.23878873498316e-84, +50, 40.847021484375, 1.25084568494597e-84, +50, 41.421826171875, 5.73021424860067e-85, +50, 41.421875, 5.78652397826679e-85, +50, 41.991259765625, 2.7328651665849e-85, +50, 41.99130859375, 2.75996267833758e-85, +50, 42.55517578125, 1.3306120670112e-85, +50, 42.555224609375, 1.34403199525941e-85, +50, 43.11357421875, 6.67538976472161e-86, +50, 43.113623046875, 6.74368293994306e-86, +50, 43.66640625, 3.44457915579056e-86, +50, 43.666455078125, 3.48023818015529e-86, +50, 44.213623046875, 1.82191303634907e-86, +50, 44.213671875, 1.84098742019443e-86, +50, 44.75517578125, 9.8204850440831e-87, +50, 44.755224609375, 9.9248385898419e-87, +50, 45.291015625, 5.34608946266382e-87, +50, 45.291064453125, 5.40437863458585e-87, +50, 45.821240234375, 2.99827983616452e-87, +50, 45.8212890625, 3.03145075570816e-87, +50, 46.34580078125, 1.70330388065361e-87, +50, 46.345849609375, 1.7224993598544e-87, +50, 46.864794921875, 9.90800075053591e-88, +50, 46.86484375, 1.00207004805813e-87, +50, 47.378173828125, 5.7288229698866e-88, +50, 47.37822265625, 5.79582150586751e-88, +50, 47.886181640625, 3.39976963258209e-88, +50, 47.88623046875, 3.43999283382834e-88, +50, 48.388818359375, 2.00196389521248e-88, +50, 48.3888671875, 2.02630021564974e-88, +50, 48.886376953125, 1.20465247273191e-88, +50, 48.88642578125, 1.21945216999773e-88, +50, 49.378955078125, 7.21301501171278e-89, +50, 49.37900390625, 7.30328914193871e-89, +50, 49.866796875, 4.30834039532944e-89, +50, 49.866845703125, 4.36344856692381e-89, +51, 34.28802734375, 2.50653782215963e-81, +51, 34.288076171875, 2.53000371457217e-81, +51, 34.92328125, 7.49158638633263e-82, +51, 34.923330078125, 7.5617476436076e-82, +51, 35.55384765625, 2.33786811783389e-82, +51, 35.553896484375, 2.35974650122535e-82, +51, 36.179677734375, 7.59715649735025e-83, +51, 36.1797265625, 7.66823998247397e-83, +51, 36.800673828125, 2.54120219840682e-83, +51, 36.80072265625, 2.5652464992018e-83, +51, 37.416884765625, 8.90060057210517e-84, +51, 37.41693359375, 8.98516095098549e-84, +51, 38.02826171875, 3.26067023053424e-84, +51, 38.028310546875, 3.29155983535777e-84, +51, 38.634658203125, 1.22494879115424e-84, +51, 38.63470703125, 1.23666166304672e-84, +51, 39.23607421875, 4.76183281948702e-85, +51, 39.236123046875, 4.80788045863205e-85, +51, 39.832509765625, 1.93410326826023e-85, +51, 39.83255859375, 1.95285023241101e-85, +51, 40.423818359375, 8.05264364304082e-86, +51, 40.4238671875, 8.13162262140464e-86, +51, 41.01, 3.47176148694309e-86, +51, 41.010048828125, 3.50614975628603e-86, +51, 41.591005859375, 1.55093045558687e-86, +51, 41.5910546875, 1.56638804232732e-86, +51, 42.16673828125, 7.11162716693627e-87, +51, 42.166787109375, 7.18328462123865e-87, +51, 42.7371484375, 3.34775725369505e-87, +51, 42.737197265625, 3.3819741026035e-87, +51, 43.302236328125, 1.63427281479688e-87, +51, 43.30228515625, 1.65107897871875e-87, +51, 43.86185546875, 8.09778432115049e-88, +51, 43.861904296875, 8.1826011369978e-88, +51, 44.4160546875, 4.14978056128476e-88, +51, 44.416103515625, 4.19369025316849e-88, +51, 44.964736328125, 2.16908484161885e-88, +51, 44.96478515625, 2.19237214768002e-88, +51, 45.507900390625, 1.16244501700139e-88, +51, 45.50794921875, 1.17507586155075e-88, +51, 46.045498046875, 6.33568823869884e-89, +51, 46.045546875, 6.4056389506585e-89, +51, 46.577529296875, 3.50966350105409e-89, +51, 46.577578125, 3.54914608970848e-89, +51, 47.103994140625, 1.9666300290808e-89, +51, 47.10404296875, 1.98929989871267e-89, +51, 47.624990234375, 1.12975553299459e-89, +51, 47.6250390625, 1.14296776906837e-89, +51, 48.140517578125, 6.55256898902797e-90, +51, 48.14056640625, 6.630573396527e-90, +51, 48.650673828125, 3.84161435604585e-90, +51, 48.65072265625, 3.88816278976081e-90, +51, 49.155556640625, 2.26271437569233e-90, +51, 49.15560546875, 2.29072792758847e-90, +51, 49.655361328125, 1.35342362614108e-90, +51, 49.65541015625, 1.37038547515428e-90, +51, 50.150185546875, 8.04288108914844e-91, +51, 50.150234375, 8.14599579489655e-91, +51, 50.640322265625, 4.85018565373833e-91, +51, 50.64037109375, 4.91297519323409e-91, +52, 34.3901171875, 1.09784132477666e-82, +52, 34.390166015625, 1.10845736512505e-82, +52, 35.029619140625, 3.14965843034692e-83, +52, 35.02966796875, 3.18011008403191e-83, +52, 35.664580078125, 9.47858460950038e-84, +52, 35.66462890625, 9.56968525920582e-84, +52, 36.29490234375, 2.95312719534554e-84, +52, 36.294951171875, 2.98153078194748e-84, +52, 36.9205859375, 9.58907405270613e-85, +52, 36.920634765625, 9.68126325492615e-85, +52, 37.541533203125, 3.20598766092008e-85, +52, 37.54158203125, 3.23711321193289e-85, +52, 38.15779296875, 1.1229532977843e-85, +52, 38.157841796875, 1.13387086000462e-85, +52, 38.769267578125, 4.07481357929281e-86, +52, 38.76931640625, 4.11456729015147e-86, +52, 39.375908203125, 1.53004878535561e-86, +52, 39.37595703125, 1.54506157346258e-86, +52, 39.977666015625, 5.94046664964127e-87, +52, 39.97771484375, 5.99920997458957e-87, +52, 40.5744921875, 2.38377058782452e-87, +52, 40.574541015625, 2.40756323337164e-87, +52, 41.166337890625, 9.88492129468606e-88, +52, 41.16638671875, 9.98457131300606e-88, +52, 41.753154296875, 4.23624932947817e-88, +52, 41.753203125, 4.27936286666186e-88, +52, 42.334892578125, 1.87664263717547e-88, +52, 42.33494140625, 1.89589075628466e-88, +52, 42.91150390625, 8.59533063061209e-89, +52, 42.911552734375, 8.6839076793046e-89, +52, 43.482890625, 4.02833193451732e-89, +52, 43.482939453125, 4.07030503687417e-89, +52, 44.04900390625, 1.93062243793654e-89, +52, 44.049052734375, 1.9510780127415e-89, +52, 44.60984375, 9.55143090611608e-90, +52, 44.609892578125, 9.6538161099766e-90, +52, 45.1653125, 4.81625778814193e-90, +52, 45.165361328125, 4.86882655159775e-90, +52, 45.715458984375, 2.52110578486338e-90, +52, 45.7155078125, 2.54874785641837e-90, +52, 46.26013671875, 1.33336774124782e-90, +52, 46.260185546875, 1.34823517438449e-90, +52, 46.79939453125, 7.22810225870508e-91, +52, 46.799443359375, 7.30975111869956e-91, +52, 47.33318359375, 3.97344561651893e-91, +52, 47.333232421875, 4.01915570075938e-91, +52, 47.86150390625, 2.20743711754887e-91, +52, 47.861552734375, 2.23347698762707e-91, +52, 48.384453125, 1.25905367991677e-91, +52, 48.384501953125, 1.27411715811031e-91, +52, 48.90203125, 7.27905637066785e-92, +52, 48.902080078125, 7.36737320296161e-92, +52, 49.414287109375, 4.23381379773091e-92, +52, 49.4143359375, 4.28618644566405e-92, +52, 49.9213671875, 2.50298615147254e-92, +52, 49.921416015625, 2.53432810782328e-92, +52, 50.4233203125, 1.47126510667252e-92, +52, 50.423369140625, 1.49015523321499e-92, +52, 50.920390625, 8.77981976716807e-93, +52, 50.920439453125, 8.89421391691748e-93, +52, 51.41267578125, 5.18853729438254e-93, +52, 51.4127734375, 5.32746953609488e-93, +52, 51.90046875, 3.10020589622689e-93, +52, 51.90056640625, 3.18462954145289e-93, +53, 35.132099609375, 1.34165815167586e-84, +53, 35.1321484375, 1.35500182297823e-84, +53, 35.7712109375, 3.8586346438587e-85, +53, 35.771259765625, 3.89696659256537e-85, +53, 36.405830078125, 1.15515485184e-85, +53, 36.40587890625, 1.16663065451713e-85, +53, 37.03595703125, 3.62188787444457e-86, +53, 37.036005859375, 3.65765415366427e-86, +53, 37.6614453125, 1.16222508687862e-86, +53, 37.661494140625, 1.17382378602205e-86, +53, 38.282392578125, 3.9213181641527e-87, +53, 38.28244140625, 3.96039919460395e-87, +53, 38.898701171875, 1.37417257661721e-87, +53, 38.89875, 1.38784484660129e-87, +53, 39.5102734375, 4.94269999592506e-88, +53, 39.510322265625, 4.99232702818206e-88, +53, 40.117109375, 1.84017054708022e-88, +53, 40.117158203125, 1.85883994034502e-88, +53, 40.719208984375, 7.15588091788769e-89, +53, 40.7192578125, 7.22859337586009e-89, +53, 41.316474609375, 2.87513573445484e-89, +53, 41.3165234375, 2.90443251849943e-89, +53, 41.90880859375, 1.18074666272332e-89, +53, 41.908857421875, 1.19294813450042e-89, +53, 42.496259765625, 5.05747920130745e-90, +53, 42.49630859375, 5.10993883553687e-90, +53, 43.078681640625, 2.21264357218252e-90, +53, 43.07873046875, 2.23591087175254e-90, +53, 43.65607421875, 9.98793944641443e-91, +53, 43.656123046875, 1.00942684217088e-90, +53, 44.228388671875, 4.65040411340808e-91, +53, 44.2284375, 4.7004152251227e-91, +53, 44.795576171875, 2.23187504561532e-91, +53, 44.795625, 2.25605716326726e-91, +53, 45.3575390625, 1.09071767039123e-91, +53, 45.357587890625, 1.10272568727892e-91, +53, 45.91427734375, 5.47462949180705e-92, +53, 45.914326171875, 5.53577914514396e-92, +53, 46.4657421875, 2.81267854173599e-92, +53, 46.465791015625, 2.84457112046934e-92, +53, 47.01193359375, 1.48845783243062e-92, +53, 47.011982421875, 1.50546780296832e-92, +53, 47.55275390625, 7.96299241886377e-93, +53, 47.552802734375, 8.05564452331045e-93, +53, 48.088251953125, 4.36254557224574e-93, +53, 48.08830078125, 4.41399477393221e-93, +53, 48.61837890625, 2.41436230087065e-93, +53, 48.618427734375, 2.44344138971554e-93, +53, 49.143232421875, 1.3742563864423e-93, +53, 49.14328125, 1.39095171064196e-93, +53, 49.662763671875, 7.8627249720243e-94, +53, 49.6628125, 7.95992783735172e-94, +53, 50.1770703125, 4.55653379867663e-94, +53, 50.177119140625, 4.61380444528666e-94, +53, 50.686201171875, 2.64507670539115e-94, +53, 50.68625, 2.6791564695207e-94, +53, 51.1903515625, 1.56964252641228e-94, +53, 51.190400390625, 1.59007794504541e-94, +53, 51.6895703125, 9.2823621015156e-95, +53, 51.68966796875, 9.5288381887029e-95, +53, 52.18400390625, 5.4283757570851e-95, +53, 52.1841015625, 5.5775793180482e-95, +53, 52.6739453125, 3.22377149580101e-95, +53, 52.67404296875, 3.31422857776726e-95, +54, 35.87408203125, 1.60299124464084e-86, +54, 35.874130859375, 1.61925498333934e-86, +54, 36.512802734375, 4.60744049715477e-87, +54, 36.5128515625, 4.6542262775045e-87, +54, 37.14712890625, 1.38230307333573e-87, +54, 37.147177734375, 1.3963165242666e-87, +54, 37.776962890625, 4.2676811431326e-88, +54, 37.77701171875, 4.31135557415735e-88, +54, 38.402353515625, 1.37886617731339e-88, +54, 38.40240234375, 1.39301204526773e-88, +54, 39.023251953125, 4.64806876395431e-89, +54, 39.02330078125, 4.69564494367985e-89, +54, 39.639560546875, 1.61376384913413e-89, +54, 39.639609375, 1.63036800302231e-89, +54, 40.251279296875, 5.81713197366461e-90, +54, 40.251328125, 5.87720283929007e-90, +54, 40.858359375, 2.17315978880267e-90, +54, 40.858408203125, 2.19566884825944e-90, +54, 41.460703125, 8.31413664866219e-91, +54, 41.460751953125, 8.40143100626546e-91, +54, 42.058359375, 3.32234094377706e-91, +54, 42.058408203125, 3.35733728990472e-91, +54, 42.65123046875, 1.37108630576255e-91, +54, 42.651279296875, 1.38557871529173e-91, +54, 43.23921875, 5.77759110628069e-92, +54, 43.239267578125, 5.8395345444883e-92, +54, 43.822373046875, 2.53796499025021e-92, +54, 43.822421875, 2.56525705223881e-92, +54, 44.400546875, 1.13685971567258e-92, +54, 44.400595703125, 1.14924635408225e-92, +54, 44.973740234375, 5.24494903201998e-93, +54, 44.9737890625, 5.30278922556907e-93, +54, 45.541904296875, 2.48974278621437e-93, +54, 45.541953125, 2.51750108068007e-93, +54, 46.104990234375, 1.21416817580495e-93, +54, 46.1050390625, 1.22784384566186e-93, +54, 46.66294921875, 6.06863156354183e-94, +54, 46.662998046875, 6.13771586650707e-94, +54, 47.215732421875, 3.09782695797381e-94, +54, 47.21578125, 3.13356585781024e-94, +54, 47.763291015625, 1.60666638154662e-94, +54, 47.76333984375, 1.62557509885327e-94, +54, 48.305673828125, 8.60651173329294e-95, +54, 48.30572265625, 8.70866176467966e-95, +54, 48.842783203125, 4.66138641992004e-95, +54, 48.84283203125, 4.71765875807128e-95, +54, 49.37466796875, 2.58125106144261e-95, +54, 49.374716796875, 2.61280647106825e-95, +54, 49.901279296875, 1.43706251427965e-95, +54, 49.901328125, 1.4550467561572e-95, +54, 50.42271484375, 8.17008391727145e-96, +54, 50.422763671875, 8.27405152155282e-96, +54, 50.9390234375, 4.73629466134273e-96, +54, 50.939072265625, 4.79714657796633e-96, +54, 51.45015625, 2.70637622493452e-96, +54, 51.45025390625, 2.77837012006172e-96, +54, 51.95640625, 1.60392443466118e-96, +54, 51.95650390625, 1.6468673251926e-96, +54, 52.4577734375, 9.52380966519104e-97, +54, 52.45787109375, 9.78162481883129e-97, +54, 52.95435546875, 5.57472185760653e-97, +54, 52.954453125, 5.73022000928701e-97, +54, 53.4464453125, 3.32141601130766e-97, +54, 53.44654296875, 3.41542726435434e-97, +54, 53.934140625, 1.95568174192375e-97, +54, 53.93423828125, 2.01256167035286e-97, +55, 36.615966796875, 1.8332541133448e-88, +55, 36.616015625, 1.85247560570567e-88, +55, 37.254345703125, 5.30481775801044e-89, +55, 37.25439453125, 5.36017474932385e-89, +55, 37.88837890625, 1.59132201617429e-89, +55, 37.888427734375, 1.60790995949161e-89, +55, 38.518017578125, 4.92735433868831e-90, +55, 38.51806640625, 4.97903083471312e-90, +55, 39.14326171875, 1.58522865714114e-90, +55, 39.143310546875, 1.60194883269875e-90, +55, 39.764111328125, 5.33698675182668e-91, +55, 39.76416015625, 5.39311857875617e-91, +55, 40.38046875, 1.85508041787031e-91, +55, 40.380517578125, 1.8746204836555e-91, +55, 40.99228515625, 6.63996228149307e-92, +55, 40.992333984375, 6.71043727342021e-92, +55, 41.599560546875, 2.46798186824746e-92, +55, 41.599609375, 2.49429084756772e-92, +55, 42.202197265625, 9.40692186686793e-93, +55, 42.20224609375, 9.50850937940109e-93, +55, 42.800244140625, 3.75106220500044e-93, +55, 42.80029296875, 3.79158825843364e-93, +55, 43.3935546875, 1.52947380015209e-93, +55, 43.393603515625, 1.54616717565206e-93, +55, 43.98212890625, 6.43906065579312e-94, +55, 43.982177734375, 6.50998764609593e-94, +55, 44.56591796875, 2.79632632865198e-94, +55, 44.565966796875, 2.82738157386603e-94, +55, 45.144873046875, 1.25150437492926e-94, +55, 45.144921875, 1.26550343381352e-94, +55, 45.7189453125, 5.76629149742495e-95, +55, 45.718994140625, 5.83119549719855e-95, +55, 46.288037109375, 2.70055229254301e-95, +55, 46.2880859375, 2.73147381215483e-95, +55, 46.852197265625, 1.31270463114748e-95, +55, 46.85224609375, 1.32782212771267e-95, +55, 47.411279296875, 6.45560417517413e-96, +55, 47.411328125, 6.53138347837362e-96, +55, 47.96533203125, 3.27538902561878e-96, +55, 47.965380859375, 3.31427965467404e-96, +55, 48.5142578125, 1.68599305405381e-96, +55, 48.514306640625, 1.70640462719072e-96, +55, 49.05810546875, 8.95772389297722e-97, +55, 49.058154296875, 9.06711241441999e-97, +55, 49.59677734375, 4.8089458433976e-97, +55, 49.596826171875, 4.86873031520792e-97, +55, 50.130322265625, 2.64138783197092e-97, +55, 50.13037109375, 2.67465396471993e-97, +55, 50.658740234375, 1.47989802765765e-97, +55, 50.6587890625, 1.49871358521579e-97, +55, 51.181982421875, 8.287936462558e-98, +55, 51.18203125, 8.39594586787481e-98, +55, 51.7001953125, 4.76307652889875e-98, +55, 51.70029296875, 4.88866793750702e-98, +55, 52.21337890625, 2.75947508065571e-98, +55, 52.2134765625, 2.83330856381719e-98, +55, 52.72158203125, 1.59307203690564e-98, +55, 52.7216796875, 1.63687980385948e-98, +55, 53.225, 9.37441146592157e-99, +55, 53.22509765625, 9.63618543580853e-99, +55, 53.72373046875, 5.56087800966994e-99, +55, 53.723828125, 5.71812073882941e-99, +55, 54.21787109375, 3.26344577772922e-99, +55, 54.21796875, 3.3582248315885e-99, +55, 54.70771484375, 1.95673422065812e-99, +55, 54.7078125, 2.01394065913309e-99, +56, 37.3578515625, 2.04647041348259e-90, +56, 37.357900390625, 2.06847980628938e-90, +56, 37.99583984375, 5.88243837411135e-91, +56, 37.995888671875, 5.94590494289821e-91, +56, 38.629580078125, 1.76021316827907e-91, +56, 38.62962890625, 1.77923863437215e-91, +56, 39.2590234375, 5.45779852011259e-92, +56, 39.259072265625, 5.51704239356607e-92, +56, 39.884169921875, 1.76524851588723e-92, +56, 39.88421875, 1.78439348136451e-92, +56, 40.504970703125, 5.93342330120247e-93, +56, 40.50501953125, 5.9975792008348e-93, +56, 41.121328125, 2.04345614663194e-93, +56, 41.121376953125, 2.06573687666038e-93, +56, 41.733291015625, 7.34765755919972e-94, +56, 41.73333984375, 7.42775943660008e-94, +56, 42.34076171875, 2.72161843366724e-94, +56, 42.340810546875, 2.75141110970169e-94, +56, 42.94369140625, 1.03613177248368e-94, +56, 42.943740234375, 1.04758637844824e-94, +56, 43.542080078125, 4.09126499345346e-95, +56, 43.54212890625, 4.13674598350119e-95, +56, 44.135830078125, 1.65424896423927e-95, +56, 44.13587890625, 1.67288546036148e-95, +56, 44.724990234375, 6.99446261996147e-96, +56, 44.7250390625, 7.07318147969286e-96, +56, 45.3094140625, 3.01976769844332e-96, +56, 45.309462890625, 3.05402248905396e-96, +56, 45.889052734375, 1.32918182143927e-96, +56, 45.8891015625, 1.34452414236527e-96, +56, 46.463955078125, 6.09433185040725e-97, +56, 46.46400390625, 6.16497223474698e-97, +56, 47.033974609375, 2.83946834327271e-97, +56, 47.0340234375, 2.87288014917526e-97, +56, 47.599111328125, 1.35701697542241e-97, +56, 47.59916015625, 1.37323222143338e-97, +56, 48.159365234375, 6.71405638326024e-98, +56, 48.1594140625, 6.79470565448062e-98, +56, 48.714638671875, 3.38572542994683e-98, +56, 48.7146875, 3.42679289110478e-98, +56, 49.2648828125, 1.73113405012133e-98, +56, 49.264931640625, 1.75251860795891e-98, +56, 49.81009765625, 9.02288638273931e-99, +56, 49.810146484375, 9.13660050992263e-99, +56, 50.35033203125, 4.87338593256003e-99, +56, 50.350380859375, 4.93504167152289e-99, +56, 50.885439453125, 2.62897432578778e-99, +56, 50.88548828125, 2.66302222150824e-99, +56, 51.41546875, 1.43071360755971e-99, +56, 51.41556640625, 1.46894783889895e-99, +56, 51.94056640625, 8.12763956845104e-100, +56, 51.9406640625, 8.34551910155042e-100, +56, 52.4605859375, 4.58251489759803e-100, +56, 52.46068359375, 4.70835817217817e-100, +56, 52.97572265625, 2.66457725640481e-100, +56, 52.9758203125, 2.73809355167495e-100, +56, 53.48587890625, 1.52026667140348e-100, +56, 53.4859765625, 1.5636427659068e-100, +56, 53.99134765625, 8.99584141358291e-101, +56, 53.9914453125, 9.25372909114439e-101, +56, 54.49212890625, 5.32825924303324e-101, +56, 54.4922265625, 5.48250901435612e-101, +56, 54.9883203125, 3.11278188657358e-101, +56, 54.98841796875, 3.20543677910749e-101, +56, 55.48021484375, 1.86269305932801e-101, +56, 55.4803125, 1.91846988478933e-101, +57, 38.0996875, 2.20476439543612e-92, +57, 38.099736328125, 2.22917432379422e-92, +57, 38.737333984375, 6.34433356523382e-93, +57, 38.7373828125, 6.41479399056003e-93, +57, 39.370830078125, 1.91018618887989e-93, +57, 39.37087890625, 1.93131173925967e-93, +57, 40.000078125, 5.92216057314857e-94, +57, 40.000126953125, 5.98791393861005e-94, +57, 40.625078125, 1.90309216004904e-94, +57, 40.625126953125, 1.92431835469877e-94, +57, 41.245830078125, 6.38398110903664e-95, +57, 41.24587890625, 6.45498354446764e-95, +57, 41.862236328125, 2.20268568579443e-95, +57, 41.86228515625, 2.22728247906098e-95, +57, 42.474248046875, 7.79068157690964e-96, +57, 42.474296875, 7.87885966415e-96, +57, 43.0819140625, 2.88050550788237e-96, +57, 43.081962890625, 2.91318272595493e-96, +57, 43.68513671875, 1.09806112159568e-96, +57, 43.685185546875, 1.11057160166479e-96, +57, 44.2838671875, 4.30562812876992e-97, +57, 44.283916015625, 4.35507143677268e-97, +57, 44.87810546875, 1.7530232640245e-97, +57, 44.878154296875, 1.7731758707715e-97, +57, 45.46775390625, 7.31286187931292e-98, +57, 45.467802734375, 7.39751767287751e-98, +57, 46.052763671875, 3.11976304411238e-98, +57, 46.0528125, 3.15638274069021e-98, +57, 46.633134765625, 1.37464423777275e-98, +57, 46.63318359375, 1.39093953120416e-98, +57, 47.208818359375, 6.24536630012012e-99, +57, 47.2088671875, 6.31989226309693e-99, +57, 47.779716796875, 2.88489889714976e-99, +57, 47.779765625, 2.91990162728214e-99, +57, 48.34587890625, 1.38459867556409e-99, +57, 48.345927734375, 1.40146037072031e-99, +57, 48.907158203125, 6.71827295305273e-100, +57, 48.90720703125, 6.80152139672612e-100, +57, 49.463603515625, 3.36417686184697e-100, +57, 49.46365234375, 3.40624440071944e-100, +57, 50.0151171875, 1.70838155932608e-100, +57, 50.015166015625, 1.73011766047011e-100, +57, 50.561748046875, 8.96377195112949e-101, +57, 50.561796875, 9.07844496707364e-101, +57, 51.1033984375, 4.7573624982879e-101, +57, 51.103447265625, 4.81906515869594e-101, +57, 51.64001953125, 2.52428955803692e-101, +57, 51.6401171875, 2.59192149716193e-101, +57, 52.1717578125, 1.39187870966602e-101, +57, 52.17185546875, 1.42956730803746e-101, +57, 52.698515625, 7.7317500805067e-102, +57, 52.69861328125, 7.94501950652444e-102, +57, 53.220390625, 4.4082211286455e-102, +57, 53.22048828125, 4.53055204196072e-102, +57, 53.73728515625, 2.47396166798242e-102, +57, 53.7373828125, 2.54499159923448e-102, +57, 54.2494921875, 1.45907071692507e-102, +57, 54.24958984375, 1.50072529856044e-102, +57, 54.75681640625, 8.32179730748228e-103, +57, 54.7569140625, 8.56822893627666e-103, +57, 55.2596484375, 4.99089804791844e-103, +57, 55.25974609375, 5.1376157827554e-103, +57, 55.757890625, 2.93846786006917e-103, +57, 55.75798828125, 3.02626005750667e-103, +57, 56.25173828125, 1.71972275925121e-103, +57, 56.2518359375, 1.77242201439855e-103, +57, 56.74138671875, 1.00746867642176e-103, +57, 56.741484375, 1.03914712466117e-103, +58, 38.841474609375, 2.28962685408854e-94, +58, 38.8415234375, 2.31583571384595e-94, +58, 39.478828125, 6.65279878387051e-95, +58, 39.478876953125, 6.72851011961114e-95, +58, 40.11203125, 1.98889585849889e-95, +58, 40.112080078125, 2.0116031211386e-95, +58, 40.741083984375, 6.15547181773793e-96, +58, 40.7411328125, 6.22611457465467e-96, +58, 41.365986328125, 1.98535700187755e-96, +58, 41.36603515625, 2.00813333128919e-96, +58, 41.986640625, 6.56800883846017e-97, +58, 41.986689453125, 6.64407409629831e-97, +58, 42.603095703125, 2.27151430941761e-97, +58, 42.60314453125, 2.29779962665845e-97, +58, 43.21525390625, 8.08887967205788e-98, +58, 43.215302734375, 8.18281575271904e-98, +58, 43.82306640625, 2.95592121751972e-98, +58, 43.823115234375, 2.99061314771485e-98, +58, 44.42658203125, 1.13134888356557e-98, +58, 44.426630859375, 1.14457524376905e-98, +58, 45.025654296875, 4.41845285569886e-99, +58, 45.025703125, 4.47048673389212e-99, +58, 45.620283203125, 1.77714624291313e-99, +58, 45.62033203125, 1.79825016216838e-99, +58, 46.210419921875, 7.34443777835212e-100, +58, 46.21046875, 7.43260970647061e-100, +58, 46.796064453125, 3.14964704226534e-100, +58, 46.79611328125, 3.18755872885081e-100, +58, 47.377119140625, 1.38201826867972e-100, +58, 47.37716796875, 1.39878290995527e-100, +58, 47.95353515625, 6.19027397147059e-101, +58, 47.953583984375, 6.26644970781979e-101, +58, 48.5253125, 2.85831172869441e-101, +58, 48.525361328125, 2.89384123773075e-101, +58, 49.09240234375, 1.35697005525987e-101, +58, 49.092451171875, 1.37396450788758e-101, +58, 49.65470703125, 6.51873789254857e-102, +58, 49.654755859375, 6.60202992320111e-102, +58, 50.212275390625, 3.23653359270438e-102, +58, 50.21232421875, 3.2783090214757e-102, +58, 50.76505859375, 1.65267733466975e-102, +58, 50.765107421875, 1.67409628228237e-102, +58, 51.31291015625, 8.39865374766313e-103, +58, 51.3130078125, 8.62296916999248e-103, +58, 51.8559765625, 4.43898857454993e-103, +58, 51.85607421875, 4.55876608676698e-103, +58, 52.39416015625, 2.38284566979309e-103, +58, 52.3942578125, 2.44798937063255e-103, +58, 52.9274609375, 1.29896683738751e-103, +58, 52.92755859375, 1.33500351596253e-103, +58, 53.45587890625, 7.16661264811987e-104, +58, 53.4559765625, 7.36908508006679e-104, +58, 53.9794140625, 3.97139434881222e-104, +58, 53.97951171875, 4.08676376045491e-104, +58, 54.49826171875, 2.31430475778334e-104, +58, 54.498359375, 2.38084236991499e-104, +58, 55.0122265625, 1.31587661343037e-104, +58, 55.01232421875, 1.354675556019e-104, +58, 55.52150390625, 7.55721877752536e-105, +58, 55.5216015625, 7.78550839762316e-105, +58, 56.02619140625, 4.38540257957703e-105, +58, 56.0262890625, 4.52070576457663e-105, +58, 56.526484375, 2.63611015718921e-105, +58, 56.52658203125, 2.71673162725835e-105, +58, 57.02228515625, 1.52363825877265e-105, +58, 57.0223828125, 1.57187635540744e-105, +58, 57.513984375, 9.12003014967339e-106, +58, 57.51408203125, 9.40921222802051e-106, }; // @@ -3827,6 +4478,29 @@ lanczos_info generate_lanczos(unsigned n, T g) return result; } // +// Stopwatch for measuring performance: +// +template +struct stopwatch +{ + typedef typename Clock::duration duration; + stopwatch() + { + m_start = Clock::now(); + } + duration elapsed() + { + return Clock::now() - m_start; + } + void reset() + { + m_start = Clock::now(); + } + +private: + typename Clock::time_point m_start; +}; +// // Returns the factorials and half factorials: // template @@ -3836,26 +4510,26 @@ std::vector > const & get_test_data() static std::vector > data; if(data.empty()) { - T fact = 1; + mp_t fact = 1; int k = 1; std::vector item; do { data.push_back(item); data.back().push_back(k-1); - data.back().push_back(fact); - data.back().push_back(log(fact)); + data.back().push_back(static_cast(fact)); + data.back().push_back(static_cast(log(fact))); fact = fact * T(k++); }while(k < 100); fact = 0.5; - T srpi = sqrt(boost::math::constants::pi()); - T mul = 1.5; + mp_t srpi = sqrt(boost::math::constants::pi()); + mp_t mul = 1.5; do{ data.push_back(item); - data.back().push_back(mul-1); - data.back().push_back(fact*srpi); - data.back().push_back(log(fact*srpi)); + data.back().push_back(static_cast(mul-1)); + data.back().push_back(static_cast(fact*srpi)); + data.back().push_back(static_cast(log(fact*srpi))); fact *= mul; mul += 1; }while(mul < 100); @@ -3937,6 +4611,24 @@ std::vector > const & get_test_data_near_2() return get_test_data_near_x(T(2)); } +template +std::vector > const& get_random_test_data() +{ + static std::vector > data; + if (data.empty()) + { + boost::random::mt19937_64 gen; + boost::random::uniform_real_distribution dist(1e-30, 100); + for (unsigned i = 0; i < 100; ++i) + { + T value = dist(gen); + T result = static_cast(boost::math::tgamma(mp_t(value) + 1)); + data.push_back(std::vector({value, result})); + } + } + return data; +} + // // Converts Lanczos approximation into rational form via // polynomial arithmetic: @@ -4031,37 +4723,76 @@ struct lanczos_rational // half factorials, returns the max error found: // template -T get_max_error(const lanczos_info& dat, R) +T get_max_error(const lanczos_info& dat, R, double* time = nullptr) { - T max_error = 0; - std::vector > const & tests = get_test_data(); + R max_error = 0; + std::vector > const & tests1 = get_test_data(); + std::vector > const & tests2 = get_random_test_data(); + + std::vector > tests(tests1.begin(), tests1.end()); + tests.insert(tests.end(), tests2.begin(), tests2.end()); + lanczos_rational rational(dat); + stopwatch w; + for(unsigned i = 0; i < tests.size(); ++i) { - R input = boost::math::tools::real_cast(tests[i][0]); + R input = tests[i][0]; + R expected = tests[i][1]; if(std::numeric_limits::is_specialized && (boost::math::tools::real_cast(tests[i][1]) > (std::numeric_limits::max)())) continue; R gamr = rational.factorial(input); if(std::numeric_limits::is_specialized && (gamr > (std::numeric_limits::max)())) continue; - T gam = gamr; - T exp = tests[i][1]; - T err = relative_error(gam, exp); + R err = boost::math::relative_difference(gamr, expected); if(err > max_error) max_error = err; } + if (time) + * time = boost::chrono::duration_cast>(w.elapsed()).count(); + return max_error; } + +template +T get_max_error_sterling(double* time = nullptr) +{ + std::vector > const& tests1 = get_test_data(); + std::vector > const& tests2 = get_random_test_data(); + + std::vector > tests(tests1.begin(), tests1.end()); + tests.insert(tests.end(), tests2.begin(), tests2.end()); + + T max_err = 0; + + stopwatch w; + + for (unsigned i = 0; i < tests.size(); ++i) + { + T loc = tests[i][0] + 1; + T found = boost::math::detail::gamma_imp(loc, boost::math::policies::policy<>(), boost::math::lanczos::undefined_lanczos()); + T expected = tests[i][1]; + T err = boost::math::relative_difference(expected, found); + if (err > max_err) + max_err = err; + } + + if(time) + *time = boost::chrono::duration_cast>(w.elapsed()).count(); + + return max_err; +} + // // This is what prints the "best" approximation out as code: // template -void print_code(const lanczos_info& l, const char* name) +void print_code(const lanczos_info& l, const char* name, int precision = std::numeric_limits::max_digits10, int precision2 = std::numeric_limits::digits) { - std::cout << std::scientific << std::setprecision(std::numeric_limits::digits10 + 3); + std::cout << std::scientific << std::setprecision(precision); using namespace std; lanczos_info l2(l); T factor = exp(l.r); @@ -4115,8 +4846,9 @@ void print_code(const lanczos_info& l, const char* name) std::cout << name; std::cout << " precision arithmetic) " << l.err << "\n// Generated with compiler: " << BOOST_COMPILER << " on " << BOOST_PLATFORM << " at " << __DATE__ << "\n" + "// Type precision was " << precision2 << " bits or " << precision << " max_digits10\n" "//\n" - "struct lanczos" << l.n << name << "\n" + "struct lanczos" << l.n << name << " : public mpl::int_<" << precision2 << ">\n" "{\n" " template \n" " static T lanczos_sum(const T& z)\n" @@ -4125,7 +4857,10 @@ void print_code(const lanczos_info& l, const char* name) for(unsigned i = 0; i < rat.num.size(); ++i) { - std::cout << " static_cast(" << rat.num[i] << "L)"; + if(precision <= std::numeric_limits::digits10) + std::cout << " static_cast(" << rat.num[i] << "L)"; + else + std::cout << " static_cast(BOOST_MATH_BIG_CONSTANT(T, " << precision2 << ", " << rat.num[i] << "))"; if(i != rat.num.size() - 1) std::cout << ","; std::cout << "\n"; @@ -4135,7 +4870,10 @@ void print_code(const lanczos_info& l, const char* name) " static const " << denom_type << " denom[" << rat.denom.size() << "] = {\n"; for(unsigned i = 0; i < rat.denom.size(); ++i) { - std::cout << " " << cast_type << "(" << rat.denom[i] << suffix_type << ")"; + if(precision <= std::numeric_limits::digits10) + std::cout << " " << cast_type << "(" << rat.denom[i] << suffix_type << ")"; + else + std::cout << " static_cast(BOOST_MATH_BIG_CONSTANT(T, " << precision2 << ", " << rat.denom[i] << "))"; if(i != rat.denom.size() - 1) std::cout << ","; std::cout << "\n"; @@ -4151,7 +4889,10 @@ void print_code(const lanczos_info& l, const char* name) for(unsigned i = 0; i < rat.num.size(); ++i) { - std::cout << " static_cast(" << (rat.num[i]/factor) << "L)"; + if (precision <= std::numeric_limits::digits10) + std::cout << " static_cast(" << (rat.num[i]/factor) << "L)"; + else + std::cout << " static_cast(BOOST_MATH_BIG_CONSTANT(T, " << precision2 << ", " << (rat.num[i]/factor) << "))"; if(i != rat.num.size() - 1) std::cout << ","; std::cout << "\n"; @@ -4161,7 +4902,10 @@ void print_code(const lanczos_info& l, const char* name) " static const " << denom_type << " denom[" << rat.denom.size() << "] = {\n"; for(unsigned i = 0; i < rat.denom.size(); ++i) { - std::cout << " " << cast_type << "(" << rat.denom[i] << suffix_type << ")"; + if (precision <= std::numeric_limits::digits10) + std::cout << " " << cast_type << "(" << rat.denom[i] << suffix_type << ")"; + else + std::cout << " static_cast(BOOST_MATH_BIG_CONSTANT(T, " << precision2 << ", " << rat.denom[i] << "))"; if(i != rat.denom.size() - 1) std::cout << ","; std::cout << "\n"; @@ -4181,7 +4925,10 @@ void print_code(const lanczos_info& l, const char* name) for(int i = 1; i < l.n; ++i) { - std::cout << " static_cast(" << l.c[i]*factor << "L)"; + if (precision <= std::numeric_limits::digits10) + std::cout << " static_cast(" << l.c[i]*factor << "L)"; + else + std::cout << " static_cast(BOOST_MATH_BIG_CONSTANT(T, " << precision2 << ", " << l.c[i] * factor << "))"; if(i != l.n - 1) std::cout << ","; std::cout << "\n"; @@ -4207,7 +4954,10 @@ void print_code(const lanczos_info& l, const char* name) for(int i = 1; i < l.n; ++i) { - std::cout << " static_cast(" << l.c[i]/factor << "L),\n"; + if (precision <= std::numeric_limits::digits10) + std::cout << " static_cast(" << l.c[i]/factor << "L),\n"; + else + std::cout << " static_cast(BOOST_MATH_BIG_CONSTANT(T, " << precision2 << ", " << l.c[i]/factor << ")),\n"; } std::cout << " };\n" @@ -4227,14 +4977,14 @@ void print_code(const lanczos_info& l, const char* name) // void print_test_values(const std::vector >& v, const char* name, int offset = 1) { - std::cout << "#define SC_(x) static_cast(BOOST_JOIN(x, L))\n"; + std::cout << std::setprecision(110); std::cout << " static const boost::array, " << v.size() << "> " << name << " = {\n"; for(unsigned i = 0; i < v.size(); ++i) { std::cout << " SC_(" << (v[i][0] + offset) << "), SC_(" << v[i][1] << "), SC_(" << v[i][2] << "),\n"; } - std::cout << " };\n#undef SC_\n\n"; + std::cout << " };\n\n"; } // // Get the error for a specific approximation, and print out it's code: @@ -4254,32 +5004,98 @@ void find_best_lanczos(const char* name, T eps, int max_scan = 100) { using namespace std; - lanczos_info best; - best.err = 100; // best case had better be better than this! - for(int i = 0; i < sizeof(sweet_spots)/sizeof(sweet_spots[0]); ++i) + double exec_time; + + std::cout << "Enter value for N, or 0 to scan for best approximation: "; + int N; + std::cin >> N; + + if (N == 0) { - if((sweet_spots[i].err < eps*10) && (sweet_spots[i].N < max_scan)) + T sterling_err = get_max_error_sterling(&exec_time); + + std::cout << "Max error from generic Sterling approximation was: " << static_cast(sterling_err / eps) << "eps (in " << (int)(exec_time * 1000) << "ms)" << std::endl; + + lanczos_info best; + best.err = 100; // best case had better be better than this! + + std::cout << std::setw(20) << std::right << "N" << std::setw(20) << std::right << "g" << std::setw(20) << std::right << "eps" << std::setw(20) << std::right << "time (ms)\n"; + + for (int i = 0; i < sizeof(sweet_spots) / sizeof(sweet_spots[0]); ++i) { - lanczos_info info = generate_lanczos(sweet_spots[i].N, mp_t(sweet_spots[i].g)); - mp_t err = get_max_error(info, eps); - if(err/eps < 1000) + if ((sweet_spots[i].err < eps * 10) && (sweet_spots[i].N < max_scan)) { - std::cout << sweet_spots[i].N << " " << sweet_spots[i].g << " " << err/eps << std::endl; - } - if(err < best.err) - { - best = info; - best.err = err; + lanczos_info info = generate_lanczos(sweet_spots[i].N, mp_t(sweet_spots[i].g)); + mp_t err = get_max_error(info, eps, &exec_time); + if (err / eps < 1000) + { + std::cout << std::setprecision(14) << std::fixed << std::setw(20) << std::right << sweet_spots[i].N + << std::setw(20) << std::right << sweet_spots[i].g << std::setw(20) << std::right << static_cast(err / eps) + << std::setw(20) << std::right << (int)(exec_time * 1000) << std::endl; + } + if (err < best.err) + { + best = info; + best.err = err; + } } } - } - std::cout << std::endl; + std::cout << std::endl; - print_code(best, name); + if (best.err < 100) + print_code(best, name, std::numeric_limits::max_digits10, std::numeric_limits::digits); + else + std::cout << "Sorry, no viable approximation was found!!" << std::endl; + } + else + { + // + // Test a specific N and g: + // + std::cout << "Enter a value for g: "; + double g; + std::cin >> g; + lanczos_info info = generate_lanczos(N, mp_t(g)); + mp_t err = get_max_error(info, eps, &exec_time); + + std::cout << "N = " << N << std::endl; + std::cout << "g = " << g << std::endl; + std::cout << "eps error = " << static_cast(err / eps) << std::endl; + std::cout << "Test time (ms) = " << static_cast(exec_time * 1000) << std::endl; + print_code(info, name, std::numeric_limits::max_digits10, std::numeric_limits::digits); + } } + +void scan_for_sweet_spots(int N) +{ + mp_t r = N * 0.66; + lanczos_info lower, upper(generate_lanczos(N + 1, r)); + r += 0.1; + while (r < N) + { + lower = upper; + upper = generate_lanczos(N + 1, r); + + if (lower.c.back() * upper.c.back() < 0) + { + std::pair location = boost::math::tools::bisect([N](const mp_t& pos) + { + return generate_lanczos(N + 1, pos).c.back(); + }, r - 0.1, r, boost::math::tools::eps_tolerance(20)); + mp_t err = get_max_error(generate_lanczos(N, location.first), std::numeric_limits::epsilon()); + std::cout << std::setprecision(15) << N << ", " << location.first << ", " << err << std::endl; + err = get_max_error(generate_lanczos(N, location.second), std::numeric_limits::epsilon()); + std::cout << std::setprecision(15) << N << ", " << location.second << ", " << err << std::endl; + //std::cout << std::setprecision(15) << N << ", " << location.first << ", " << location.second << std::endl; + } + + r += 0.1; + } +} + int main(int argc, char*argv []) { - bool test_double(false), test_long(false), test_float(false), test_quad(false), spots(false), test_data(false); + bool test_double(false), test_long(false), test_float(false), test_quad(false), test_mp(false), spots(false), test_data(false), find_sweet(false); if(argc < 2) { @@ -4288,7 +5104,12 @@ int main(int argc, char*argv []) " -float test type float for the best approximation\n" " -double test type double for the best approximation\n" " -long-double test type long double for the best approximation\n" + " -quad test quad precision for the best approximation\n" + " -MP test current multiprecision type for the best approximation\n" " -spots print out the best cases found in previous runs\n" + " -sweet Scan for more sweet spots for the arbitary parameter G: these " + " will need to cut and pasted into the big table at the start of this file" + " in order to search for greater precision approximations than otherwise supported." " -data print out the test data\n" << std::flush; return 1; } @@ -4303,10 +5124,14 @@ int main(int argc, char*argv []) test_long = true; else if(std::strcmp(argv[i], "-quad-float") == 0) test_quad = true; + else if(std::strcmp(argv[i], "-MP") == 0) + test_mp = true; else if(std::strcmp(argv[i], "-spots") == 0) spots = true; else if(std::strcmp(argv[i], "-data") == 0) test_data = true; + else if(std::strcmp(argv[i], "-sweet") == 0) + find_sweet = true; } if(spots) @@ -4340,8 +5165,14 @@ int main(int argc, char*argv []) } if(test_quad) { - //find_best_lanczos("quad_float", pow(NTL::quad_float(2), NTL::quad_float(-105))); + find_best_lanczos("quad_float", std::numeric_limits::epsilon()); } +#ifdef MP_TYPE + if(test_mp) + { + find_best_lanczos("MP", std::numeric_limits::epsilon()); + } +#endif if(test_data) { std::cout << "Test Data follows:\n\n"; @@ -4354,6 +5185,12 @@ int main(int argc, char*argv []) print_test_values(get_test_data_near_x(mp_t(-10)), "near_m10", 0); print_test_values(get_test_data_near_x(mp_t(-55)), "near_m55", 0); } + if (find_sweet) + { + unsigned last_index = sizeof(sweet_spots) / sizeof(sweet_spots[0]) - 1; + for(unsigned N = sweet_spots[last_index].N + 1; N < sweet_spots[last_index].N + 11; ++N) + scan_for_sweet_spots(N); + } return 0; }