From 8b9a5912f6691b04d703998786f4dd6c6f684596 Mon Sep 17 00:00:00 2001 From: Regis Portalez Date: Fri, 14 Dec 2018 10:46:58 +0100 Subject: [PATCH 1/2] inline _factorialCache to a static readonly field Assembly size should not be an issue in this code. Should be a bit faster, since _factorialCache should now stay in the data segment (cached) instead of global memory values are store as hexadecimal constants, to save all bits, so new version returns the exact same values as before --- src/Numerics/SpecialFunctions/Factorial.cs | 21 +++------------------ 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/src/Numerics/SpecialFunctions/Factorial.cs b/src/Numerics/SpecialFunctions/Factorial.cs index f45ad69a..1abc0143 100644 --- a/src/Numerics/SpecialFunctions/Factorial.cs +++ b/src/Numerics/SpecialFunctions/Factorial.cs @@ -38,25 +38,10 @@ namespace MathNet.Numerics public partial class SpecialFunctions { const int FactorialMaxArgument = 170; - static double[] _factorialCache; - - /// - /// Initializes static members of the SpecialFunctions class. - /// - static SpecialFunctions() + static readonly double[] _factorialCache = { - InitializeFactorial(); - } - - static void InitializeFactorial() - { - _factorialCache = new double[FactorialMaxArgument + 1]; - _factorialCache[0] = 1.0; - for (int i = 1; i < _factorialCache.Length; i++) - { - _factorialCache[i] = _factorialCache[i - 1]*i; - } - } + 0x3FF0000000000000, 0x3FF0000000000000, 0x4000000000000000, 0x4018000000000000, 0x4038000000000000, 0x405E000000000000, 0x4086800000000000, 0x40B3B00000000000, 0x40E3B00000000000, 0x4116260000000000, 0x414BAF8000000000, 0x418308A800000000, 0x41BC8CFC00000000, 0x41F7328CC0000000, 0x42344C3B28000000, 0x4273077775800000, 0x42B3077775800000, 0x42F437EEECD80000, 0x4336BEECCA730000, 0x437B02B930689000, 0x43C0E1B3BE415A00, 0x4406283BE9B5C620, 0x444E77526159F06C, 0x4495E5C335F8A4CE, 0x44E06C52687A7B9A, 0x4529A940C33F6121, 0x4574D9849EA37EEB, 0x45C19787E5D9F316, 0x460EC92DD23D6966, 0x465BE6518687A784, 0x46AA27EC6E1F2D0C, 0x46F956AD0AAE33A4, 0x474956AD0AAE33A4, 0x479A21627303A541, 0x47EBC3789A33DF95, 0x483E5DCBE8A8BC8B, 0x489114C2B2DEEA0E, 0x48E3C0011ED1BEA0, 0x493774015499125E, 0x498C95619F1A8E63, 0x49E1DD5D037098FE, 0x4A36E39F2C684405, 0x4A8E0AC0EA48D947, 0x4AE42F399D68F1FC, 0x4B3BC0EF38704CBA, 0x4B9383A833AEF5F3, 0x4BEC0D41CA4B818D, 0x4C4499BC508F7324, 0x4C9EE69A78D72CB6, 0x4CF7A88E4484BE3B, 0x4D527BAF2587B49E, 0x4DAD751F23D047DC, 0x4E07EF294D193A63, 0x4E63D20E33D8E45A, 0x4EC0B93BFBBF00AC, 0x4F1CBE5F18B04928, 0x4F792693359A4003, 0x4FD6665B1BBD6103, 0x50344CC291239FEB, 0x5092B6C35DCCD76D, 0x50F18B5727F009F6, 0x5150B8CF1210C97E, 0x51B0330899804332, 0x520FE478EE34844A, 0x526FE478EE34844A, 0x52D0320568F6AB2E, 0x5330B395943E6087, 0x53917C0097314D0D, 0x53F293C0A0A461DE, 0x5454074BAD313983, 0x54B5E7FAC56DD6E7, 0x55184D5A3305DA68, 0x557B5705796695B5, 0x55DF2F423E7902C2, 0x564207524C1DF598, 0x56A5209471331BCE, 0x570916B0466CB105, 0x576E2F4C14BAC4FA, 0x57D264D25CA1D008, 0x5836B473AA57BCCA, 0x589C619094EDABFC, 0x5901F5BD7E3E66D5, 0x596702DAC9BFF3C1, 0x59CDD7B3BDA4F01E, 0x5A33958DF4743D94, 0x5A9A02A088AA61C9, 0x5B0179C3DBD279B3, 0x5B67C1863ED21D6F, 0x5BD0550C4B30743C, 0x5C36B645188F61A3, 0x5C9FF0512A89A14D, 0x5D06B4D9B43DD8AD, 0x5D7051FC798C73BC, 0x5DD7B722E0A0182D, 0x5E416A7D9CF591C1, 0x5EA9DA1274FC845A, 0x5F13638DD7BD6344, 0x5F7D62E2FAFB0A73, 0x5FE67FB5C8283400, 0x605166C698CF1838, 0x60BB30964EC395D8, 0x612574569A26543C, 0x619118B502D68B20, 0x61FB83C3509147E8, 0x62665B0EB1760A6C, 0x62D256B20D92D48D, 0x633E5F96E67B300A, 0x63A963E824AAFA28, 0x64156C4BDEF04312, 0x64823E389BD8991D, 0x64EF5AF14BDC472A, 0x655B30DD3FC905B6, 0x65C7CAC197CFE4FF, 0x663500FEE8058829, 0x66A2B4E306A4ED45, 0x6710CE83F7F82D2C, 0x677E764F3171D1E0, 0x67EBD824633209D7, 0x6859AB418B722112, 0x68C7DD36EFA41ABF, 0x69365F6380A9D913, 0x69A5262C0FA08F34, 0x6A142861FEE5087E, 0x6A835ECE2AF01629, 0x6AF2C3D7B9989578, 0x6B625340AB3F01F7, 0x6BD209F3A89205EF, 0x6C41E5DFC140E1E3, 0x6CB1E5DFC140E1E3, 0x6D2209AB80C363A7, 0x6D9251D22EC67136, 0x6E02BFBD1BDF17DD, 0x6E7355BB04BE109C, 0x6EE4171452ED7D42, 0x6F55082946D09F21, 0x6FC62E9B88B007D5, 0x70379185413B0852, 0x70A939C09FD12EE8, 0x711B3243AC4D8692, 0x718D88957D1C3023, 0x720026B1C06B6A53, 0x7271CA9FCDF6531F, 0x72E3BCC9487D4436, 0x73560CE8DEFBF234, 0x73C8CE85FADB707A, 0x743C19F3C62C956A, 0x74B006CD07056D36, 0x752267CF76103B6C, 0x75954807E082C4B5, 0x7608C5D92B5838FB, 0x767D07DA7ECB62C6, 0x76F11FA1E0C9F743, 0x776455903AEFD5A0, 0x77D84E466672AD59, 0x784D3E2CB341F88F, 0x78C1B4A51088F17F, 0x793594292C26E653, 0x79AA77BA8027B682, 0x7A2055E51B1882A4, 0x7A944AB297A87248, 0x7B095D5F3D928EDA, 0x7B7FE771CB7257AE, 0x7BF4307602BE5B7C, 0x7C69B5B6477E6880, 0x7CE07868C5CCFAF2, 0x7D553B370EFA3B7C, 0x7DCB88CB676C8525, 0x7E41F63CB077CADB, 0x7EB7932FA79D3A3F, 0x7F2F2054EB4D96E7, 0x7FA4AB7864418635 + }; /// /// Computes the factorial function x -> x! of an integer number > 0. The function can represent all number up From 6867a78f9c2c8da241bd68707b34dec530a1b810 Mon Sep 17 00:00:00 2001 From: Regis Portalez Date: Fri, 14 Dec 2018 11:10:08 +0100 Subject: [PATCH 2/2] Assembly size should not be an issue in this code. Should be a bit faster, since _factorialCache should now stay in the data segment (cached) instead of global memory --- src/Numerics/SpecialFunctions/Factorial.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Numerics/SpecialFunctions/Factorial.cs b/src/Numerics/SpecialFunctions/Factorial.cs index 1abc0143..abdf943a 100644 --- a/src/Numerics/SpecialFunctions/Factorial.cs +++ b/src/Numerics/SpecialFunctions/Factorial.cs @@ -38,9 +38,9 @@ namespace MathNet.Numerics public partial class SpecialFunctions { const int FactorialMaxArgument = 170; - static readonly double[] _factorialCache = + static readonly double[] _factorialCache = new double[171] { - 0x3FF0000000000000, 0x3FF0000000000000, 0x4000000000000000, 0x4018000000000000, 0x4038000000000000, 0x405E000000000000, 0x4086800000000000, 0x40B3B00000000000, 0x40E3B00000000000, 0x4116260000000000, 0x414BAF8000000000, 0x418308A800000000, 0x41BC8CFC00000000, 0x41F7328CC0000000, 0x42344C3B28000000, 0x4273077775800000, 0x42B3077775800000, 0x42F437EEECD80000, 0x4336BEECCA730000, 0x437B02B930689000, 0x43C0E1B3BE415A00, 0x4406283BE9B5C620, 0x444E77526159F06C, 0x4495E5C335F8A4CE, 0x44E06C52687A7B9A, 0x4529A940C33F6121, 0x4574D9849EA37EEB, 0x45C19787E5D9F316, 0x460EC92DD23D6966, 0x465BE6518687A784, 0x46AA27EC6E1F2D0C, 0x46F956AD0AAE33A4, 0x474956AD0AAE33A4, 0x479A21627303A541, 0x47EBC3789A33DF95, 0x483E5DCBE8A8BC8B, 0x489114C2B2DEEA0E, 0x48E3C0011ED1BEA0, 0x493774015499125E, 0x498C95619F1A8E63, 0x49E1DD5D037098FE, 0x4A36E39F2C684405, 0x4A8E0AC0EA48D947, 0x4AE42F399D68F1FC, 0x4B3BC0EF38704CBA, 0x4B9383A833AEF5F3, 0x4BEC0D41CA4B818D, 0x4C4499BC508F7324, 0x4C9EE69A78D72CB6, 0x4CF7A88E4484BE3B, 0x4D527BAF2587B49E, 0x4DAD751F23D047DC, 0x4E07EF294D193A63, 0x4E63D20E33D8E45A, 0x4EC0B93BFBBF00AC, 0x4F1CBE5F18B04928, 0x4F792693359A4003, 0x4FD6665B1BBD6103, 0x50344CC291239FEB, 0x5092B6C35DCCD76D, 0x50F18B5727F009F6, 0x5150B8CF1210C97E, 0x51B0330899804332, 0x520FE478EE34844A, 0x526FE478EE34844A, 0x52D0320568F6AB2E, 0x5330B395943E6087, 0x53917C0097314D0D, 0x53F293C0A0A461DE, 0x5454074BAD313983, 0x54B5E7FAC56DD6E7, 0x55184D5A3305DA68, 0x557B5705796695B5, 0x55DF2F423E7902C2, 0x564207524C1DF598, 0x56A5209471331BCE, 0x570916B0466CB105, 0x576E2F4C14BAC4FA, 0x57D264D25CA1D008, 0x5836B473AA57BCCA, 0x589C619094EDABFC, 0x5901F5BD7E3E66D5, 0x596702DAC9BFF3C1, 0x59CDD7B3BDA4F01E, 0x5A33958DF4743D94, 0x5A9A02A088AA61C9, 0x5B0179C3DBD279B3, 0x5B67C1863ED21D6F, 0x5BD0550C4B30743C, 0x5C36B645188F61A3, 0x5C9FF0512A89A14D, 0x5D06B4D9B43DD8AD, 0x5D7051FC798C73BC, 0x5DD7B722E0A0182D, 0x5E416A7D9CF591C1, 0x5EA9DA1274FC845A, 0x5F13638DD7BD6344, 0x5F7D62E2FAFB0A73, 0x5FE67FB5C8283400, 0x605166C698CF1838, 0x60BB30964EC395D8, 0x612574569A26543C, 0x619118B502D68B20, 0x61FB83C3509147E8, 0x62665B0EB1760A6C, 0x62D256B20D92D48D, 0x633E5F96E67B300A, 0x63A963E824AAFA28, 0x64156C4BDEF04312, 0x64823E389BD8991D, 0x64EF5AF14BDC472A, 0x655B30DD3FC905B6, 0x65C7CAC197CFE4FF, 0x663500FEE8058829, 0x66A2B4E306A4ED45, 0x6710CE83F7F82D2C, 0x677E764F3171D1E0, 0x67EBD824633209D7, 0x6859AB418B722112, 0x68C7DD36EFA41ABF, 0x69365F6380A9D913, 0x69A5262C0FA08F34, 0x6A142861FEE5087E, 0x6A835ECE2AF01629, 0x6AF2C3D7B9989578, 0x6B625340AB3F01F7, 0x6BD209F3A89205EF, 0x6C41E5DFC140E1E3, 0x6CB1E5DFC140E1E3, 0x6D2209AB80C363A7, 0x6D9251D22EC67136, 0x6E02BFBD1BDF17DD, 0x6E7355BB04BE109C, 0x6EE4171452ED7D42, 0x6F55082946D09F21, 0x6FC62E9B88B007D5, 0x70379185413B0852, 0x70A939C09FD12EE8, 0x711B3243AC4D8692, 0x718D88957D1C3023, 0x720026B1C06B6A53, 0x7271CA9FCDF6531F, 0x72E3BCC9487D4436, 0x73560CE8DEFBF234, 0x73C8CE85FADB707A, 0x743C19F3C62C956A, 0x74B006CD07056D36, 0x752267CF76103B6C, 0x75954807E082C4B5, 0x7608C5D92B5838FB, 0x767D07DA7ECB62C6, 0x76F11FA1E0C9F743, 0x776455903AEFD5A0, 0x77D84E466672AD59, 0x784D3E2CB341F88F, 0x78C1B4A51088F17F, 0x793594292C26E653, 0x79AA77BA8027B682, 0x7A2055E51B1882A4, 0x7A944AB297A87248, 0x7B095D5F3D928EDA, 0x7B7FE771CB7257AE, 0x7BF4307602BE5B7C, 0x7C69B5B6477E6880, 0x7CE07868C5CCFAF2, 0x7D553B370EFA3B7C, 0x7DCB88CB676C8525, 0x7E41F63CB077CADB, 0x7EB7932FA79D3A3F, 0x7F2F2054EB4D96E7, 0x7FA4AB7864418635 + 1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800, 39916800, 479001600, 6227020800, 87178291200, 1307674368000, 20922789888000, 355687428096000, 6402373705728000, 1.21645100408832E+17, 2.43290200817664E+18, 5.109094217170944E+19, 1.1240007277776077E+21, 2.5852016738884978E+22, 6.2044840173323941E+23, 1.5511210043330986E+25, 4.0329146112660565E+26, 1.0888869450418352E+28, 3.0488834461171384E+29, 8.8417619937397008E+30, 2.6525285981219103E+32, 8.2228386541779224E+33, 2.6313083693369352E+35, 8.6833176188118859E+36, 2.9523279903960412E+38, 1.0333147966386144E+40, 3.7199332678990118E+41, 1.3763753091226343E+43, 5.2302261746660104E+44, 2.0397882081197442E+46, 8.1591528324789768E+47, 3.3452526613163803E+49, 1.4050061177528798E+51, 6.0415263063373834E+52, 2.6582715747884485E+54, 1.1962222086548019E+56, 5.5026221598120885E+57, 2.5862324151116818E+59, 1.2413915592536073E+61, 6.0828186403426752E+62, 3.0414093201713376E+64, 1.5511187532873822E+66, 8.0658175170943877E+67, 4.2748832840600255E+69, 2.3084369733924138E+71, 1.2696403353658276E+73, 7.1099858780486348E+74, 4.0526919504877221E+76, 2.3505613312828789E+78, 1.3868311854568986E+80, 8.3209871127413916E+81, 5.0758021387722484E+83, 3.1469973260387939E+85, 1.9826083154044401E+87, 1.2688693218588417E+89, 8.2476505920824715E+90, 5.4434493907744307E+92, 3.6471110918188683E+94, 2.4800355424368305E+96, 1.711224524281413E+98, 1.197857166996989E+100, 8.5047858856786218E+101, 6.1234458376886077E+103, 4.4701154615126834E+105, 3.3078854415193856E+107, 2.4809140811395391E+109, 1.8854947016660498E+111, 1.4518309202828584E+113, 1.1324281178206295E+115, 8.9461821307829729E+116, 7.1569457046263779E+118, 5.7971260207473655E+120, 4.7536433370128398E+122, 3.9455239697206569E+124, 3.314240134565352E+126, 2.8171041143805494E+128, 2.4227095383672724E+130, 2.1077572983795269E+132, 1.8548264225739836E+134, 1.6507955160908452E+136, 1.4857159644817607E+138, 1.3520015276784023E+140, 1.24384140546413E+142, 1.1567725070816409E+144, 1.0873661566567424E+146, 1.0329978488239052E+148, 9.916779348709491E+149, 9.6192759682482062E+151, 9.426890448883242E+153, 9.3326215443944096E+155, 9.3326215443944102E+157, 9.4259477598383536E+159, 9.6144667150351211E+161, 9.9029007164861754E+163, 1.0299016745145622E+166, 1.0813967582402903E+168, 1.1462805637347078E+170, 1.2265202031961373E+172, 1.3246418194518284E+174, 1.4438595832024928E+176, 1.5882455415227421E+178, 1.7629525510902437E+180, 1.9745068572210728E+182, 2.2311927486598123E+184, 2.5435597334721862E+186, 2.9250936934930141E+188, 3.3931086844518965E+190, 3.969937160808719E+192, 4.6845258497542883E+194, 5.5745857612076033E+196, 6.6895029134491239E+198, 8.09429852527344E+200, 9.8750442008335976E+202, 1.2146304367025325E+205, 1.5061417415111404E+207, 1.8826771768889254E+209, 2.3721732428800459E+211, 3.0126600184576582E+213, 3.8562048236258025E+215, 4.9745042224772855E+217, 6.4668554892204716E+219, 8.4715806908788174E+221, 1.1182486511960039E+224, 1.4872707060906852E+226, 1.9929427461615181E+228, 2.6904727073180495E+230, 3.6590428819525472E+232, 5.0128887482749898E+234, 6.9177864726194859E+236, 9.6157231969410859E+238, 1.346201247571752E+241, 1.8981437590761701E+243, 2.6953641378881614E+245, 3.8543707171800706E+247, 5.5502938327393013E+249, 8.0479260574719866E+251, 1.1749972043909099E+254, 1.7272458904546376E+256, 2.5563239178728637E+258, 3.8089226376305671E+260, 5.7133839564458505E+262, 8.6272097742332346E+264, 1.3113358856834518E+267, 2.0063439050956811E+269, 3.0897696138473489E+271, 4.7891429014633912E+273, 7.4710629262828905E+275, 1.1729568794264138E+278, 1.8532718694937338E+280, 2.9467022724950369E+282, 4.714723635992059E+284, 7.5907050539472148E+286, 1.2296942187394488E+289, 2.0044015765453015E+291, 3.2872185855342945E+293, 5.423910666131586E+295, 9.0036917057784329E+297, 1.5036165148649983E+300, 2.5260757449731969E+302, 4.2690680090047027E+304, 7.257415615307994E+306 }; ///