Module osl_special
module osl_special
! Uses
use osl_core, wp => osl_wp
! Variables
integer, public, parameter :: osl_factorial_max = 170
real (kind=wp), private, dimension(osl_factorial_max) :: osl_factorial_table = (/ 1.0_wp, 2.0_wp, 6.0_wp, 24.0_wp, 120.0_wp, 720.0_wp, 5040.0_wp, 40320.0_wp, 362880.0_wp, 3628800.0_wp, 39916800.0_wp, 479001600.0_wp, 6227020800.0_wp, 87178291200.0_wp, 1307674368000.0_wp, 20922789888000.0_wp, 355687428096000.0_wp, 6402373705728000.0_wp, 121645100408832000.0_wp, 2432902008176640000.0_wp, 51090942171709440000.0_wp, 1124000727777607680000.0_wp, 25852016738884976640000.0_wp, 620448401733239439360000.0_wp, 15511210043330985984000000.0_wp, 403291461126605635584000000.0_wp, 10888869450418352160768000000.0_wp, 304888344611713860501504000000.0_wp, 8841761993739701954543616000000.0_wp, 265252859812191058636308480000000.0_wp, 8222838654177922817725562880000000.0_wp, 263130836933693530167218012160000000.0_wp, 8683317618811886495518194401280000000.0_wp, 2.95232799039604140847618609644e38_wp, 1.03331479663861449296666513375e40_wp, 3.71993326789901217467999448151e41_wp, 1.37637530912263450463159795816e43_wp, 5.23022617466601111760007224100e44_wp, 2.03978820811974433586402817399e46_wp, 8.15915283247897734345611269600e47_wp, 3.34525266131638071081700620534e49_wp, 1.40500611775287989854314260624e51_wp, 6.04152630633738356373551320685e52_wp, 2.65827157478844876804362581101e54_wp, 1.19622220865480194561963161496e56_wp, 5.50262215981208894985030542880e57_wp, 2.58623241511168180642964355154e59_wp, 1.24139155925360726708622890474e61_wp, 6.08281864034267560872252163321e62_wp, 3.04140932017133780436126081661e64_wp, 1.55111875328738228022424301647e66_wp, 8.06581751709438785716606368564e67_wp, 4.27488328406002556429801375339e69_wp, 2.30843697339241380472092742683e71_wp, 1.26964033536582759259651008476e73_wp, 7.10998587804863451854045647464e74_wp, 4.05269195048772167556806019054e76_wp, 2.35056133128287857182947491052e78_wp, 1.38683118545689835737939019720e80_wp, 8.32098711274139014427634118320e81_wp, 5.07580213877224798800856812177e83_wp, 3.14699732603879375256531223550e85_wp, 1.982608315404440064116146708360e87_wp, 1.268869321858841641034333893350e89_wp, 8.247650592082470666723170306800e90_wp, 5.443449390774430640037292402480e92_wp, 3.647111091818868528824985909660e94_wp, 2.480035542436830599600990418570e96_wp, 1.711224524281413113724683388810e98_wp, 1.197857166996989179607278372170e100_wp, 8.504785885678623175211676442400e101_wp, 6.123445837688608686152407038530e103_wp, 4.470115461512684340891257138130e105_wp, 3.307885441519386412259530282210e107_wp, 2.480914081139539809194647711660e109_wp, 1.885494701666050254987932260860e111_wp, 1.451830920282858696340707840860e113_wp, 1.132428117820629783145752115870e115_wp, 8.946182130782975286851441715400e116_wp, 7.156945704626380229481153372320e118_wp, 5.797126020747367985879734231580e120_wp, 4.753643337012841748421382069890e122_wp, 3.945523969720658651189747118010e124_wp, 3.314240134565353266999387579130e126_wp, 2.817104114380550276949479442260e128_wp, 2.422709538367273238176552320340e130_wp, 2.107757298379527717213600518700e132_wp, 1.854826422573984391147968456460e134_wp, 1.650795516090846108121691926250e136_wp, 1.485715964481761497309522733620e138_wp, 1.352001527678402962551665687590e140_wp, 1.243841405464130725547532432590e142_wp, 1.156772507081641574759205162310e144_wp, 1.087366156656743080273652852570e146_wp, 1.032997848823905926259970209940e148_wp, 9.916779348709496892095714015400e149_wp, 9.619275968248211985332842594960e151_wp, 9.426890448883247745626185743100e153_wp, 9.332621544394415268169923885600e155_wp, 9.33262154439441526816992388563e157_wp, 9.42594775983835942085162312450e159_wp, 9.61446671503512660926865558700e161_wp, 9.90290071648618040754671525458e163_wp, 1.02990167451456276238485838648e166_wp, 1.08139675824029090050410130580e168_wp, 1.146280563734708354534347384148e170_wp, 1.226520203196137939351751701040e172_wp, 1.324641819451828974499891837120e174_wp, 1.443859583202493582204882102460e176_wp, 1.588245541522742940425370312710e178_wp, 1.762952551090244663872161047110e180_wp, 1.974506857221074023536820372760e182_wp, 2.231192748659813646596607021220e184_wp, 2.543559733472187557120132004190e186_wp, 2.925093693493015690688151804820e188_wp, 3.393108684451898201198256093590e190_wp, 3.96993716080872089540195962950e192_wp, 4.68452584975429065657431236281e194_wp, 5.57458576120760588132343171174e196_wp, 6.68950291344912705758811805409e198_wp, 8.09429852527344373968162284545e200_wp, 9.87504420083360136241157987140e202_wp, 1.21463043670253296757662432419e205_wp, 1.50614174151114087979501416199e207_wp, 1.88267717688892609974376770249e209_wp, 2.37217324288004688567714730514e211_wp, 3.01266001845765954480997707753e213_wp, 3.85620482362580421735677065923e215_wp, 4.97450422247728744039023415041e217_wp, 6.46685548922047367250730439554e219_wp, 8.47158069087882051098456875820e221_wp, 1.11824865119600430744996307608e224_wp, 1.48727070609068572890845089118e226_wp, 1.99294274616151887673732419418e228_wp, 2.69047270731805048359538766215e230_wp, 3.65904288195254865768972722052e232_wp, 5.01288874827499166103492629211e234_wp, 6.91778647261948849222819828311e236_wp, 9.61572319694108900419719561353e238_wp, 1.34620124757175246058760738589e241_wp, 1.89814375907617096942852641411e243_wp, 2.69536413788816277658850750804e245_wp, 3.85437071718007277052156573649e247_wp, 5.55029383273930478955105466055e249_wp, 8.04792605747199194484902925780e251_wp, 1.17499720439091082394795827164e254_wp, 1.72724589045463891120349865931e256_wp, 2.55632391787286558858117801578e258_wp, 3.80892263763056972698595524351e260_wp, 5.71338395644585459047893286526e262_wp, 8.62720977423324043162318862650e264_wp, 1.31133588568345254560672467123e267_wp, 2.00634390509568239477828874699e269_wp, 3.08976961384735088795856467036e271_wp, 4.78914290146339387633577523906e273_wp, 7.47106292628289444708380937294e275_wp, 1.17295687942641442819215807155e278_wp, 1.85327186949373479654360975305e280_wp, 2.94670227249503832650433950735e282_wp, 4.71472363599206132240694321176e284_wp, 7.59070505394721872907517857094e286_wp, 1.22969421873944943411017892849e289_wp, 2.00440157654530257759959165344e291_wp, 3.28721858553429622726333031164e293_wp, 5.42391066613158877498449501421e295_wp, 9.00369170577843736647426172359e297_wp, 1.50361651486499904020120170784e300_wp, 2.52607574497319838753801886917e302_wp, 4.26906800900470527493925188890e304_wp, 7.25741561530799896739672821113e306_wp /)
! Subroutines and functions
public function osl_factorial(n, err, status)
public function osl_choose(n, k)
end module osl_special
Description of Variables
osl_factorial_max
integer, public, parameter :: osl_factorial_max = 170
osl_factorial_table
real (kind=wp), private, dimension(osl_factorial_max) :: osl_factorial_table = (/ 1.0_wp, 2.0_wp, 6.0_wp, 24.0_wp, 120.0_wp, 720.0_wp, 5040.0_wp, 40320.0_wp, 362880.0_wp, 3628800.0_wp, 39916800.0_wp, 479001600.0_wp, 6227020800.0_wp, 87178291200.0_wp, 1307674368000.0_wp, 20922789888000.0_wp, 355687428096000.0_wp, 6402373705728000.0_wp, 121645100408832000.0_wp, 2432902008176640000.0_wp, 51090942171709440000.0_wp, 1124000727777607680000.0_wp, 25852016738884976640000.0_wp, 620448401733239439360000.0_wp, 15511210043330985984000000.0_wp, 403291461126605635584000000.0_wp, 10888869450418352160768000000.0_wp, 304888344611713860501504000000.0_wp, 8841761993739701954543616000000.0_wp, 265252859812191058636308480000000.0_wp, 8222838654177922817725562880000000.0_wp, 263130836933693530167218012160000000.0_wp, 8683317618811886495518194401280000000.0_wp, 2.95232799039604140847618609644e38_wp, 1.03331479663861449296666513375e40_wp, 3.71993326789901217467999448151e41_wp, 1.37637530912263450463159795816e43_wp, 5.23022617466601111760007224100e44_wp, 2.03978820811974433586402817399e46_wp, 8.15915283247897734345611269600e47_wp, 3.34525266131638071081700620534e49_wp, 1.40500611775287989854314260624e51_wp, 6.04152630633738356373551320685e52_wp, 2.65827157478844876804362581101e54_wp, 1.19622220865480194561963161496e56_wp, 5.50262215981208894985030542880e57_wp, 2.58623241511168180642964355154e59_wp, 1.24139155925360726708622890474e61_wp, 6.08281864034267560872252163321e62_wp, 3.04140932017133780436126081661e64_wp, 1.55111875328738228022424301647e66_wp, 8.06581751709438785716606368564e67_wp, 4.27488328406002556429801375339e69_wp, 2.30843697339241380472092742683e71_wp, 1.26964033536582759259651008476e73_wp, 7.10998587804863451854045647464e74_wp, 4.05269195048772167556806019054e76_wp, 2.35056133128287857182947491052e78_wp, 1.38683118545689835737939019720e80_wp, 8.32098711274139014427634118320e81_wp, 5.07580213877224798800856812177e83_wp, 3.14699732603879375256531223550e85_wp, 1.982608315404440064116146708360e87_wp, 1.268869321858841641034333893350e89_wp, 8.247650592082470666723170306800e90_wp, 5.443449390774430640037292402480e92_wp, 3.647111091818868528824985909660e94_wp, 2.480035542436830599600990418570e96_wp, 1.711224524281413113724683388810e98_wp, 1.197857166996989179607278372170e100_wp, 8.504785885678623175211676442400e101_wp, 6.123445837688608686152407038530e103_wp, 4.470115461512684340891257138130e105_wp, 3.307885441519386412259530282210e107_wp, 2.480914081139539809194647711660e109_wp, 1.885494701666050254987932260860e111_wp, 1.451830920282858696340707840860e113_wp, 1.132428117820629783145752115870e115_wp, 8.946182130782975286851441715400e116_wp, 7.156945704626380229481153372320e118_wp, 5.797126020747367985879734231580e120_wp, 4.753643337012841748421382069890e122_wp, 3.945523969720658651189747118010e124_wp, 3.314240134565353266999387579130e126_wp, 2.817104114380550276949479442260e128_wp, 2.422709538367273238176552320340e130_wp, 2.107757298379527717213600518700e132_wp, 1.854826422573984391147968456460e134_wp, 1.650795516090846108121691926250e136_wp, 1.485715964481761497309522733620e138_wp, 1.352001527678402962551665687590e140_wp, 1.243841405464130725547532432590e142_wp, 1.156772507081641574759205162310e144_wp, 1.087366156656743080273652852570e146_wp, 1.032997848823905926259970209940e148_wp, 9.916779348709496892095714015400e149_wp, 9.619275968248211985332842594960e151_wp, 9.426890448883247745626185743100e153_wp, 9.332621544394415268169923885600e155_wp, 9.33262154439441526816992388563e157_wp, 9.42594775983835942085162312450e159_wp, 9.61446671503512660926865558700e161_wp, 9.90290071648618040754671525458e163_wp, 1.02990167451456276238485838648e166_wp, 1.08139675824029090050410130580e168_wp, 1.146280563734708354534347384148e170_wp, 1.226520203196137939351751701040e172_wp, 1.324641819451828974499891837120e174_wp, 1.443859583202493582204882102460e176_wp, 1.588245541522742940425370312710e178_wp, 1.762952551090244663872161047110e180_wp, 1.974506857221074023536820372760e182_wp, 2.231192748659813646596607021220e184_wp, 2.543559733472187557120132004190e186_wp, 2.925093693493015690688151804820e188_wp, 3.393108684451898201198256093590e190_wp, 3.96993716080872089540195962950e192_wp, 4.68452584975429065657431236281e194_wp, 5.57458576120760588132343171174e196_wp, 6.68950291344912705758811805409e198_wp, 8.09429852527344373968162284545e200_wp, 9.87504420083360136241157987140e202_wp, 1.21463043670253296757662432419e205_wp, 1.50614174151114087979501416199e207_wp, 1.88267717688892609974376770249e209_wp, 2.37217324288004688567714730514e211_wp, 3.01266001845765954480997707753e213_wp, 3.85620482362580421735677065923e215_wp, 4.97450422247728744039023415041e217_wp, 6.46685548922047367250730439554e219_wp, 8.47158069087882051098456875820e221_wp, 1.11824865119600430744996307608e224_wp, 1.48727070609068572890845089118e226_wp, 1.99294274616151887673732419418e228_wp, 2.69047270731805048359538766215e230_wp, 3.65904288195254865768972722052e232_wp, 5.01288874827499166103492629211e234_wp, 6.91778647261948849222819828311e236_wp, 9.61572319694108900419719561353e238_wp, 1.34620124757175246058760738589e241_wp, 1.89814375907617096942852641411e243_wp, 2.69536413788816277658850750804e245_wp, 3.85437071718007277052156573649e247_wp, 5.55029383273930478955105466055e249_wp, 8.04792605747199194484902925780e251_wp, 1.17499720439091082394795827164e254_wp, 1.72724589045463891120349865931e256_wp, 2.55632391787286558858117801578e258_wp, 3.80892263763056972698595524351e260_wp, 5.71338395644585459047893286526e262_wp, 8.62720977423324043162318862650e264_wp, 1.31133588568345254560672467123e267_wp, 2.00634390509568239477828874699e269_wp, 3.08976961384735088795856467036e271_wp, 4.78914290146339387633577523906e273_wp, 7.47106292628289444708380937294e275_wp, 1.17295687942641442819215807155e278_wp, 1.85327186949373479654360975305e280_wp, 2.94670227249503832650433950735e282_wp, 4.71472363599206132240694321176e284_wp, 7.59070505394721872907517857094e286_wp, 1.22969421873944943411017892849e289_wp, 2.00440157654530257759959165344e291_wp, 3.28721858553429622726333031164e293_wp, 5.42391066613158877498449501421e295_wp, 9.00369170577843736647426172359e297_wp, 1.50361651486499904020120170784e300_wp, 2.52607574497319838753801886917e302_wp, 4.26906800900470527493925188890e304_wp, 7.25741561530799896739672821113e306_wp /)
Description of Subroutines and Functions
osl_factorial
public function osl_factorial(n, err, status)
integer, intent(in) :: n
real (kind=wp), optional, intent(out) :: err
integer, optional, intent(out) :: status
real (kind=wp) :: osl_factorial
end function osl_factorial
Return n!, equal to the product 1 * 2 * ... * n.
The return value is exact for values of n smaller than 18.
For larger values of n, the error is on the order of
`2 * epsilon(1.0_wp) * n!`.
osl_choose
public function osl_choose(n, k)
integer, intent(in) :: n
integer, intent(in) :: k
integer :: osl_choose
end function osl_choose
Return the number of combinations of K elements chosen from a collection of N elements.