首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

看不懂这个阶乘公式?解决方法

2012-03-06 
看不懂这个阶乘公式?下面以精确计算1000!为例,阐述该算法:记F1(n)n*(n-1)*...*1;F2(n)n*(n-2)*...*(2or1

看不懂这个阶乘公式?
下面以精确计算   1000!   为例,阐述该算法:  

        记   F1(n)   =   n*(n-1)*...*1;  
              F2(n)   =   n*(n-2)*...*(2   or   1);  
              Pow2(r)   =   2^r;  
        有   F1(2k+1)   =   F2(2k+1)   *   F2(2k)  
                      =   Pow2(k)   *   F2(2k+1)   *   F1(k),  
              F1(2k)   =   Pow2(k)   *   F2(2k-1)   *   F1(k),  
        及   Pow2(u)   *   Pow2(v)   =   Pow2(u+v),  

∴   1000!   =   F1(1000)  
                  =   Pow2(500)*F2(999)*F1(500)  
                  =   Pow2(750)*F2(999)*F2(499)*F1(250)  
                  =   Pow2(875)*F2(999)*F2(499)*F2(249)*F1(125)  
                  =   Pow2(937)*F2(999)*F2(499)*F2(249)*F2(125)*F1(62)  
                  =   Pow2(968)*F2(999)*F2(499)*F2(249)*F2(125)*F2(61)*F1(31)  
                  =   Pow2(983)*F2(999)*F2(499)*F2(249)*F2(125)*F2(61)*F2(31)*F1(15)  
                  =   ...  

        如果你预存了某些小整数阶乘(比如这里的“F1(15)”),则可提前终止分解,否则直至右边最后一项为“F1(1)”为止;这样,我们将阶乘转化为2的整数次幂与一些连续奇数的积(或再乘以一个小整数的阶乘);  

        再定义:F2(e,f)   =   e*(e-2)*...*(f+2),这里仍用“F2”,就当是“函数重载”好了:),  
        则   F2(e)   =   F2(e,-1)   =   F2(e,f)*F2(f,-1)   (e、f为奇数,0≤f≤e)  

∴   F2(999)   =   F2(999,499)*F2(499,249)*F2(249,125)*F2(125,61)*F2(61,31)*F2(31),  
      F2(499)   =   ____________F2(499,249)*F2(249,125)*F2(125,61)*F2(61,31)*F2(31),  
      F2(249)   =   ________________________F2(249,125)*F2(125,61)*F2(61,31)*F2(31),  
      F2(125)   =   ____________________________________F2(125,61)*F2(61,31)*F2(31),  
      F2(   61)   =   _______________________________________________F2(61,31)*F2(31),  
      F2(   31)   =   _________________________________________________________F2(31),  
∴   F1(1000)   =   F1(15)   *   Pow2(983)   *   F2(999,499)   \  
                                  *   [F2(499,249)^2]   *   [F2(249,125)^3]   \  
                                  *   [F2(61,31)^4]   *   [F2(31)^5]  
        这样,我们又将阶乘转化为了乘方运算。  

        上式实际上是个形如   a   *   b^2   *   c^3   *   d^4   *   e^5   的式子;我们再将指数转化为二进制,可得到如下公式:  
                a   *   b^2   *   c^3   *   d^4   *   e^5   =   (a*c*e)*[(b*c)^2]*[(d*e)^4]  


                                                                    =   (((e*d)^2)*(c*b))^2*(e*c*a),  
即可转化成了可充分利用高效的平方算法。


[解决办法]
不是说得很清楚么,1000!每次针对最后一位分解,F2(e) = F2(e,-1) = F2(e,f)*F2(f,-1)不就是e*(e-2)*....=e*(e-2)*....*1=e*(e-2)*...(f+1)*f*(f-2)*...*1,下面的不就很明白了
[解决办法]
······
[解决办法]
不错

热点排行