快速冪(Fast Power)

來源:互聯網
上載者:User
 1.快速冪就是快速算底數的n次冪。其時間複雜度為 O(log₂N), 與樸素的O(N)相比效率有了極大的提高。
用法:用於求解 a 的 b 次方,而b是一個非常大的數,用O(n)的複雜度會逾時。那麼就需要這個演算法,注意它不但可以對數求次冪,而且可用於矩陣快速冪。                                  --百度百科


2.所謂的快速冪,實際上是快速冪模數的縮寫,簡單的說,就是快速的求一個冪式的模(餘)。在程式設計過程中,經常要去求一些大數對於某個數的餘數,為了得到更快、計算範圍更大的演算法,產生了快速冪模數演算法  --


平常我們求一個數 的n次冪,都是調用庫函數math.h裡面的
double pow(double x,double y)函數。
但是既然此方法的傳回值為double,就肯定存在精度誤差的問題。
而且資料一大容易逾時。
快速冪的目的就是做到快速求冪。


假設需要求a的11次冪。

普通解法:a*a*a*a*a*a*a*a*a*a*a                       11步
快速冪:    a^(2^0+2^1+2^3) 即2^1*a^2*a^8        3 步

由於是二進位,很自然地想到用位元運算這個強大的工具:
         &和>>     
&運算通常用於二進位取位操作,例如一個數 & 1 的結果就是取二進位的最末位。還可以判斷奇偶x&1==0為偶,x&1==1為奇。
 >>運算比較單純,二進位去掉最後一位

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

假設需要求2的11次冪,ans和base的值如下表所示。



題目描述:

演算法提高 快速冪  
時間限制:1.0s   記憶體限制:256.0MB
    
問題描述
  給定A, B, P,求(A^B) mod P。
輸入格式
  輸入共一行。
  第一行有三個數,N, M, P。
輸出格式
  輸出共一行,表示所求。
範例輸入
2 5 3
範例輸出
2
資料規模和約定
  共10組資料
  對100%的資料,A, B為long long範圍內的非負整數,P為int內的非負整數。

#include <stdio.h>#define ll long longint main(){    ll b,k;    int p;    scanf("%I64d%d%I64d",&b,&p,&k);    ll t=1;    while (p)    {        if (p & 1)            t=(t*b)%k;        b=(b*b)%k;        p>>=1;    }    printf("%I64d\n",t);    return 0;}



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.