1 // Copyright John Maddock 2006.
2 // Use, modification and distribution are subject to the
3 // Boost Software License, Version 1.0. (See accompanying file
4 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 #ifndef BOOST_MATH_SP_UC_FACTORIALS_HPP
7 #define BOOST_MATH_SP_UC_FACTORIALS_HPP
13 #include <boost/array.hpp>
15 #pragma warning(push) // Temporary until lexical cast fixed.
16 #pragma warning(disable: 4127 4701)
18 #ifndef BOOST_MATH_NO_LEXICAL_CAST
19 #include <boost/lexical_cast.hpp>
24 #include <boost/config/no_tr1/cmath.hpp>
25 #include <boost/math/special_functions/math_fwd.hpp>
27 namespace boost { namespace math
29 // Forward declarations:
35 inline float unchecked_factorial<float>(unsigned i BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE_SPEC(float))
37 static const boost::array<float, 35> factorials = {{
57 121645100408832000.0F,
58 0.243290200817664e19F,
59 0.5109094217170944e20F,
60 0.112400072777760768e22F,
61 0.2585201673888497664e23F,
62 0.62044840173323943936e24F,
63 0.15511210043330985984e26F,
64 0.403291461126605635584e27F,
65 0.10888869450418352160768e29F,
66 0.304888344611713860501504e30F,
67 0.8841761993739701954543616e31F,
68 0.26525285981219105863630848e33F,
69 0.822283865417792281772556288e34F,
70 0.26313083693369353016721801216e36F,
71 0.868331761881188649551819440128e37F,
72 0.29523279903960414084761860964352e39F,
79 struct max_factorial<float>
81 BOOST_STATIC_CONSTANT(unsigned, value = 34);
86 inline long double unchecked_factorial<long double>(unsigned i BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE_SPEC(long double))
88 static const boost::array<long double, 171> factorials = {{
108 121645100408832000.0L,
109 0.243290200817664e19L,
110 0.5109094217170944e20L,
111 0.112400072777760768e22L,
112 0.2585201673888497664e23L,
113 0.62044840173323943936e24L,
114 0.15511210043330985984e26L,
115 0.403291461126605635584e27L,
116 0.10888869450418352160768e29L,
117 0.304888344611713860501504e30L,
118 0.8841761993739701954543616e31L,
119 0.26525285981219105863630848e33L,
120 0.822283865417792281772556288e34L,
121 0.26313083693369353016721801216e36L,
122 0.868331761881188649551819440128e37L,
123 0.29523279903960414084761860964352e39L,
124 0.103331479663861449296666513375232e41L,
125 0.3719933267899012174679994481508352e42L,
126 0.137637530912263450463159795815809024e44L,
127 0.5230226174666011117600072241000742912e45L,
128 0.203978820811974433586402817399028973568e47L,
129 0.815915283247897734345611269596115894272e48L,
130 0.3345252661316380710817006205344075166515e50L,
131 0.1405006117752879898543142606244511569936e52L,
132 0.6041526306337383563735513206851399750726e53L,
133 0.265827157478844876804362581101461589032e55L,
134 0.1196222208654801945619631614956577150644e57L,
135 0.5502622159812088949850305428800254892962e58L,
136 0.2586232415111681806429643551536119799692e60L,
137 0.1241391559253607267086228904737337503852e62L,
138 0.6082818640342675608722521633212953768876e63L,
139 0.3041409320171337804361260816606476884438e65L,
140 0.1551118753287382280224243016469303211063e67L,
141 0.8065817517094387857166063685640376697529e68L,
142 0.427488328406002556429801375338939964969e70L,
143 0.2308436973392413804720927426830275810833e72L,
144 0.1269640335365827592596510084756651695958e74L,
145 0.7109985878048634518540456474637249497365e75L,
146 0.4052691950487721675568060190543232213498e77L,
147 0.2350561331282878571829474910515074683829e79L,
148 0.1386831185456898357379390197203894063459e81L,
149 0.8320987112741390144276341183223364380754e82L,
150 0.507580213877224798800856812176625227226e84L,
151 0.3146997326038793752565312235495076408801e86L,
152 0.1982608315404440064116146708361898137545e88L,
153 0.1268869321858841641034333893351614808029e90L,
154 0.8247650592082470666723170306785496252186e91L,
155 0.5443449390774430640037292402478427526443e93L,
156 0.3647111091818868528824985909660546442717e95L,
157 0.2480035542436830599600990418569171581047e97L,
158 0.1711224524281413113724683388812728390923e99L,
159 0.1197857166996989179607278372168909873646e101L,
160 0.8504785885678623175211676442399260102886e102L,
161 0.6123445837688608686152407038527467274078e104L,
162 0.4470115461512684340891257138125051110077e106L,
163 0.3307885441519386412259530282212537821457e108L,
164 0.2480914081139539809194647711659403366093e110L,
165 0.188549470166605025498793226086114655823e112L,
166 0.1451830920282858696340707840863082849837e114L,
167 0.1132428117820629783145752115873204622873e116L,
168 0.8946182130782975286851441715398316520698e117L,
169 0.7156945704626380229481153372318653216558e119L,
170 0.5797126020747367985879734231578109105412e121L,
171 0.4753643337012841748421382069894049466438e123L,
172 0.3945523969720658651189747118012061057144e125L,
173 0.3314240134565353266999387579130131288001e127L,
174 0.2817104114380550276949479442260611594801e129L,
175 0.2422709538367273238176552320344125971528e131L,
176 0.210775729837952771721360051869938959523e133L,
177 0.1854826422573984391147968456455462843802e135L,
178 0.1650795516090846108121691926245361930984e137L,
179 0.1485715964481761497309522733620825737886e139L,
180 0.1352001527678402962551665687594951421476e141L,
181 0.1243841405464130725547532432587355307758e143L,
182 0.1156772507081641574759205162306240436215e145L,
183 0.1087366156656743080273652852567866010042e147L,
184 0.103299784882390592625997020993947270954e149L,
185 0.9916779348709496892095714015418938011582e150L,
186 0.9619275968248211985332842594956369871234e152L,
187 0.942689044888324774562618574305724247381e154L,
188 0.9332621544394415268169923885626670049072e156L,
189 0.9332621544394415268169923885626670049072e158L,
190 0.9425947759838359420851623124482936749562e160L,
191 0.9614466715035126609268655586972595484554e162L,
192 0.990290071648618040754671525458177334909e164L,
193 0.1029901674514562762384858386476504428305e167L,
194 0.1081396758240290900504101305800329649721e169L,
195 0.1146280563734708354534347384148349428704e171L,
196 0.1226520203196137939351751701038733888713e173L,
197 0.132464181945182897449989183712183259981e175L,
198 0.1443859583202493582204882102462797533793e177L,
199 0.1588245541522742940425370312709077287172e179L,
200 0.1762952551090244663872161047107075788761e181L,
201 0.1974506857221074023536820372759924883413e183L,
202 0.2231192748659813646596607021218715118256e185L,
203 0.2543559733472187557120132004189335234812e187L,
204 0.2925093693493015690688151804817735520034e189L,
205 0.339310868445189820119825609358857320324e191L,
206 0.396993716080872089540195962949863064779e193L,
207 0.4684525849754290656574312362808384164393e195L,
208 0.5574585761207605881323431711741977155627e197L,
209 0.6689502913449127057588118054090372586753e199L,
210 0.8094298525273443739681622845449350829971e201L,
211 0.9875044200833601362411579871448208012564e203L,
212 0.1214630436702532967576624324188129585545e206L,
213 0.1506141741511140879795014161993280686076e208L,
214 0.1882677176888926099743767702491600857595e210L,
215 0.237217324288004688567714730513941708057e212L,
216 0.3012660018457659544809977077527059692324e214L,
217 0.3856204823625804217356770659234636406175e216L,
218 0.4974504222477287440390234150412680963966e218L,
219 0.6466855489220473672507304395536485253155e220L,
220 0.8471580690878820510984568758152795681634e222L,
221 0.1118248651196004307449963076076169029976e225L,
222 0.1487270706090685728908450891181304809868e227L,
223 0.1992942746161518876737324194182948445223e229L,
224 0.269047270731805048359538766214698040105e231L,
225 0.3659042881952548657689727220519893345429e233L,
226 0.5012888748274991661034926292112253883237e235L,
227 0.6917786472619488492228198283114910358867e237L,
228 0.9615723196941089004197195613529725398826e239L,
229 0.1346201247571752460587607385894161555836e242L,
230 0.1898143759076170969428526414110767793728e244L,
231 0.2695364137888162776588507508037290267094e246L,
232 0.3854370717180072770521565736493325081944e248L,
233 0.5550293832739304789551054660550388118e250L,
234 0.80479260574719919448490292577980627711e252L,
235 0.1174997204390910823947958271638517164581e255L,
236 0.1727245890454638911203498659308620231933e257L,
237 0.2556323917872865588581178015776757943262e259L,
238 0.380892263763056972698595524350736933546e261L,
239 0.571338395644585459047893286526105400319e263L,
240 0.8627209774233240431623188626544191544816e265L,
241 0.1311335885683452545606724671234717114812e268L,
242 0.2006343905095682394778288746989117185662e270L,
243 0.308976961384735088795856467036324046592e272L,
244 0.4789142901463393876335775239063022722176e274L,
245 0.7471062926282894447083809372938315446595e276L,
246 0.1172956879426414428192158071551315525115e279L,
247 0.1853271869493734796543609753051078529682e281L,
248 0.2946702272495038326504339507351214862195e283L,
249 0.4714723635992061322406943211761943779512e285L,
250 0.7590705053947218729075178570936729485014e287L,
251 0.1229694218739449434110178928491750176572e290L,
252 0.2004401576545302577599591653441552787813e292L,
253 0.3287218585534296227263330311644146572013e294L,
254 0.5423910666131588774984495014212841843822e296L,
255 0.9003691705778437366474261723593317460744e298L,
256 0.1503616514864999040201201707840084015944e301L,
257 0.2526075744973198387538018869171341146786e303L,
258 0.4269068009004705274939251888899566538069e305L,
259 0.7257415615307998967396728211129263114717e307L,
262 return factorials[i];
266 struct max_factorial<long double>
268 BOOST_STATIC_CONSTANT(unsigned, value = 170);
272 inline double unchecked_factorial<double>(unsigned i BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE_SPEC(double))
274 return static_cast<double>(boost::math::unchecked_factorial<long double>(i));
278 struct max_factorial<double>
280 BOOST_STATIC_CONSTANT(unsigned,
281 value = ::boost::math::max_factorial<long double>::value);
284 #ifndef BOOST_MATH_NO_LEXICAL_CAST
287 inline T unchecked_factorial(unsigned i BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE_SPEC(T))
289 BOOST_STATIC_ASSERT(!boost::is_integral<T>::value);
290 // factorial<unsigned int>(n) is not implemented
291 // because it would overflow integral type T for too small n
292 // to be useful. Use instead a floating-point type,
293 // and convert to an unsigned type if essential, for example:
294 // unsigned int nfac = static_cast<unsigned int>(factorial<double>(n));
295 // See factorial documentation for more detail.
297 static const boost::array<T, 101> factorials = {{
298 boost::lexical_cast<T>("1"),
299 boost::lexical_cast<T>("1"),
300 boost::lexical_cast<T>("2"),
301 boost::lexical_cast<T>("6"),
302 boost::lexical_cast<T>("24"),
303 boost::lexical_cast<T>("120"),
304 boost::lexical_cast<T>("720"),
305 boost::lexical_cast<T>("5040"),
306 boost::lexical_cast<T>("40320"),
307 boost::lexical_cast<T>("362880"),
308 boost::lexical_cast<T>("3628800"),
309 boost::lexical_cast<T>("39916800"),
310 boost::lexical_cast<T>("479001600"),
311 boost::lexical_cast<T>("6227020800"),
312 boost::lexical_cast<T>("87178291200"),
313 boost::lexical_cast<T>("1307674368000"),
314 boost::lexical_cast<T>("20922789888000"),
315 boost::lexical_cast<T>("355687428096000"),
316 boost::lexical_cast<T>("6402373705728000"),
317 boost::lexical_cast<T>("121645100408832000"),
318 boost::lexical_cast<T>("2432902008176640000"),
319 boost::lexical_cast<T>("51090942171709440000"),
320 boost::lexical_cast<T>("1124000727777607680000"),
321 boost::lexical_cast<T>("25852016738884976640000"),
322 boost::lexical_cast<T>("620448401733239439360000"),
323 boost::lexical_cast<T>("15511210043330985984000000"),
324 boost::lexical_cast<T>("403291461126605635584000000"),
325 boost::lexical_cast<T>("10888869450418352160768000000"),
326 boost::lexical_cast<T>("304888344611713860501504000000"),
327 boost::lexical_cast<T>("8841761993739701954543616000000"),
328 boost::lexical_cast<T>("265252859812191058636308480000000"),
329 boost::lexical_cast<T>("8222838654177922817725562880000000"),
330 boost::lexical_cast<T>("263130836933693530167218012160000000"),
331 boost::lexical_cast<T>("8683317618811886495518194401280000000"),
332 boost::lexical_cast<T>("295232799039604140847618609643520000000"),
333 boost::lexical_cast<T>("10333147966386144929666651337523200000000"),
334 boost::lexical_cast<T>("371993326789901217467999448150835200000000"),
335 boost::lexical_cast<T>("13763753091226345046315979581580902400000000"),
336 boost::lexical_cast<T>("523022617466601111760007224100074291200000000"),
337 boost::lexical_cast<T>("20397882081197443358640281739902897356800000000"),
338 boost::lexical_cast<T>("815915283247897734345611269596115894272000000000"),
339 boost::lexical_cast<T>("33452526613163807108170062053440751665152000000000"),
340 boost::lexical_cast<T>("1405006117752879898543142606244511569936384000000000"),
341 boost::lexical_cast<T>("60415263063373835637355132068513997507264512000000000"),
342 boost::lexical_cast<T>("2658271574788448768043625811014615890319638528000000000"),
343 boost::lexical_cast<T>("119622220865480194561963161495657715064383733760000000000"),
344 boost::lexical_cast<T>("5502622159812088949850305428800254892961651752960000000000"),
345 boost::lexical_cast<T>("258623241511168180642964355153611979969197632389120000000000"),
346 boost::lexical_cast<T>("12413915592536072670862289047373375038521486354677760000000000"),
347 boost::lexical_cast<T>("608281864034267560872252163321295376887552831379210240000000000"),
348 boost::lexical_cast<T>("30414093201713378043612608166064768844377641568960512000000000000"),
349 boost::lexical_cast<T>("1551118753287382280224243016469303211063259720016986112000000000000"),
350 boost::lexical_cast<T>("80658175170943878571660636856403766975289505440883277824000000000000"),
351 boost::lexical_cast<T>("4274883284060025564298013753389399649690343788366813724672000000000000"),
352 boost::lexical_cast<T>("230843697339241380472092742683027581083278564571807941132288000000000000"),
353 boost::lexical_cast<T>("12696403353658275925965100847566516959580321051449436762275840000000000000"),
354 boost::lexical_cast<T>("710998587804863451854045647463724949736497978881168458687447040000000000000"),
355 boost::lexical_cast<T>("40526919504877216755680601905432322134980384796226602145184481280000000000000"),
356 boost::lexical_cast<T>("2350561331282878571829474910515074683828862318181142924420699914240000000000000"),
357 boost::lexical_cast<T>("138683118545689835737939019720389406345902876772687432540821294940160000000000000"),
358 boost::lexical_cast<T>("8320987112741390144276341183223364380754172606361245952449277696409600000000000000"),
359 boost::lexical_cast<T>("507580213877224798800856812176625227226004528988036003099405939480985600000000000000"),
360 boost::lexical_cast<T>("31469973260387937525653122354950764088012280797258232192163168247821107200000000000000"),
361 boost::lexical_cast<T>("1982608315404440064116146708361898137544773690227268628106279599612729753600000000000000"),
362 boost::lexical_cast<T>("126886932185884164103433389335161480802865516174545192198801894375214704230400000000000000"),
363 boost::lexical_cast<T>("8247650592082470666723170306785496252186258551345437492922123134388955774976000000000000000"),
364 boost::lexical_cast<T>("544344939077443064003729240247842752644293064388798874532860126869671081148416000000000000000"),
365 boost::lexical_cast<T>("36471110918188685288249859096605464427167635314049524593701628500267962436943872000000000000000"),
366 boost::lexical_cast<T>("2480035542436830599600990418569171581047399201355367672371710738018221445712183296000000000000000"),
367 boost::lexical_cast<T>("171122452428141311372468338881272839092270544893520369393648040923257279754140647424000000000000000"),
368 boost::lexical_cast<T>("11978571669969891796072783721689098736458938142546425857555362864628009582789845319680000000000000000"),
369 boost::lexical_cast<T>("850478588567862317521167644239926010288584608120796235886430763388588680378079017697280000000000000000"),
370 boost::lexical_cast<T>("61234458376886086861524070385274672740778091784697328983823014963978384987221689274204160000000000000000"),
371 boost::lexical_cast<T>("4470115461512684340891257138125051110076800700282905015819080092370422104067183317016903680000000000000000"),
372 boost::lexical_cast<T>("330788544151938641225953028221253782145683251820934971170611926835411235700971565459250872320000000000000000"),
373 boost::lexical_cast<T>("24809140811395398091946477116594033660926243886570122837795894512655842677572867409443815424000000000000000000"),
374 boost::lexical_cast<T>("1885494701666050254987932260861146558230394535379329335672487982961844043495537923117729972224000000000000000000"),
375 boost::lexical_cast<T>("145183092028285869634070784086308284983740379224208358846781574688061991349156420080065207861248000000000000000000"),
376 boost::lexical_cast<T>("11324281178206297831457521158732046228731749579488251990048962825668835325234200766245086213177344000000000000000000"),
377 boost::lexical_cast<T>("894618213078297528685144171539831652069808216779571907213868063227837990693501860533361810841010176000000000000000000"),
378 boost::lexical_cast<T>("71569457046263802294811533723186532165584657342365752577109445058227039255480148842668944867280814080000000000000000000"),
379 boost::lexical_cast<T>("5797126020747367985879734231578109105412357244731625958745865049716390179693892056256184534249745940480000000000000000000"),
380 boost::lexical_cast<T>("475364333701284174842138206989404946643813294067993328617160934076743994734899148613007131808479167119360000000000000000000"),
381 boost::lexical_cast<T>("39455239697206586511897471180120610571436503407643446275224357528369751562996629334879591940103770870906880000000000000000000"),
382 boost::lexical_cast<T>("3314240134565353266999387579130131288000666286242049487118846032383059131291716864129885722968716753156177920000000000000000000"),
383 boost::lexical_cast<T>("281710411438055027694947944226061159480056634330574206405101912752560026159795933451040286452340924018275123200000000000000000000"),
384 boost::lexical_cast<T>("24227095383672732381765523203441259715284870552429381750838764496720162249742450276789464634901319465571660595200000000000000000000"),
385 boost::lexical_cast<T>("2107757298379527717213600518699389595229783738061356212322972511214654115727593174080683423236414793504734471782400000000000000000000"),
386 boost::lexical_cast<T>("185482642257398439114796845645546284380220968949399346684421580986889562184028199319100141244804501828416633516851200000000000000000000"),
387 boost::lexical_cast<T>("16507955160908461081216919262453619309839666236496541854913520707833171034378509739399912570787600662729080382999756800000000000000000000"),
388 boost::lexical_cast<T>("1485715964481761497309522733620825737885569961284688766942216863704985393094065876545992131370884059645617234469978112000000000000000000000"),
389 boost::lexical_cast<T>("135200152767840296255166568759495142147586866476906677791741734597153670771559994765685283954750449427751168336768008192000000000000000000000"),
390 boost::lexical_cast<T>("12438414054641307255475324325873553077577991715875414356840239582938137710983519518443046123837041347353107486982656753664000000000000000000000"),
391 boost::lexical_cast<T>("1156772507081641574759205162306240436214753229576413535186142281213246807121467315215203289516844845303838996289387078090752000000000000000000000"),
392 boost::lexical_cast<T>("108736615665674308027365285256786601004186803580182872307497374434045199869417927630229109214583415458560865651202385340530688000000000000000000000"),
393 boost::lexical_cast<T>("10329978488239059262599702099394727095397746340117372869212250571234293987594703124871765375385424468563282236864226607350415360000000000000000000000"),
394 boost::lexical_cast<T>("991677934870949689209571401541893801158183648651267795444376054838492222809091499987689476037000748982075094738965754305639874560000000000000000000000"),
395 boost::lexical_cast<T>("96192759682482119853328425949563698712343813919172976158104477319333745612481875498805879175589072651261284189679678167647067832320000000000000000000000"),
396 boost::lexical_cast<T>("9426890448883247745626185743057242473809693764078951663494238777294707070023223798882976159207729119823605850588608460429412647567360000000000000000000000"),
397 boost::lexical_cast<T>("933262154439441526816992388562667004907159682643816214685929638952175999932299156089414639761565182862536979208272237582511852109168640000000000000000000000"),
398 boost::lexical_cast<T>("93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000"),
401 return factorials[i];
407 BOOST_STATIC_CONSTANT(unsigned, value = 100);
410 #else // BOOST_MATH_NO_LEXICAL_CAST
413 inline T unchecked_factorial(unsigned i BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE_SPEC(T))
421 BOOST_STATIC_CONSTANT(unsigned, value = 0);
426 #ifndef BOOST_NO_INCLASS_MEMBER_INITIALIZATION
428 const unsigned max_factorial<T>::value;
434 #endif // BOOST_MATH_SP_UC_FACTORIALS_HPP