快速冪模數演算法【模板】__演算法

來源:互聯網
上載者:User

快速冪模數其實是a^b%c,這就是著名的RSA公開金鑰加密的方法,當a,b都很大的時候,直接求是不可取的,所以就用到了快速冪模數。

首先你得明白他的原理,其實是用到了二分的思想,把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】此處有詳細的介紹。


這裡給出非遞迴的方法:

long long modexp(long long a, long long b, int mod){    long long res=1;    while(b>0)    {        //a=a%mod;(有時候n的值太大了會超出long long的儲存,所以要先取餘)        if(b&1)//&位元運算:判斷二進位最後一位是0還是1,&的運算規則為前後都是1的時候才是1;            res=res*a%mod;        b=b>>1;//相當於除以2;        a=a*a%mod;    }    return res;}




聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.