快速冪算法


求超大次冪的算法,可將時間復雜度從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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM