zoukankan      html  css  js  c++  java
  • 快速幂算法

    求超大次幂的算法,可将时间复杂度从O(N)降为 O(log₂N)

    百科里有很清晰的介绍:

    http://baike.baidu.com/link?url=x4vZ0RoaOyeRqi9vT4vYICe6uy8SeHhB1i6cCHPHTWBEcbdzGG06G8McAymojBn9Aq_1-PU_CVsww39dvmyPI_

    int pow4(int a,int b)
    {
        int r=1,base=a;
        while(b!=0)
        {
            if(b&1)
                r*=base;
            base*=base;
            b>>=1;
        }
        return r;
    }

    这里有一个数学证明,用到了秦九韶算法

    http://blog.csdn.net/lsldd/article/details/5506933

     可以把b按二进制展开为:b = p(n)*2^n  +  p(n-1)*2^(n-1)  +…+   p(1)*2  +  p(0)
    其中p(i) (0<=i<=n)为 0 或 1

    这样 a^b =  a^ (p(n)*2^n  +  p(n-1)*2^(n-1)  +...+  p(1)*2  +  p(0))
                   =  a^(p(n)*2^n)  *  a^(p(n-1)*2^(n-1))  *...*  a^(p(1)*2)  *  a^p(0)
    对于p(i)=0的情况, a^(p(i) * 2^(i-1) ) =  a^0  =  1,不用处理


    我们要考虑的仅仅是p(i)=1的情况


    化简:a^(2^i)  = a^(2^(i-1)  * 2) = (  a^(  p(i)  *  2^(i-1)  )  )^2
    (这里很重要!!具体请参阅秦九韶算法:http://baike.baidu.com/view/1431260.htm

  • 相关阅读:
    浏览器组成
    Go!!!
    产假计算器地址
    flex 纵向布局,垂直换行,没有撑开父盒子宽度,求解??
    毕业档案
    进程与线程
    事件循环
    回调地狱
    错误优先回调
    组件 v-if 小心哦
  • 原文地址:https://www.cnblogs.com/qlky/p/5020402.html
Copyright © 2011-2022 走看看