快速冪演算法

2021-10-10 22:05:15 字數 1358 閱讀 1686

當我們在求a^b,即a的b次方時,我們輕易的就會想到使用for迴圈將a個連續相乘求到我們想要的結果

long

long

normalpower

(long

long base,

long

long power)

return result;

}

對於一些題目

求a^b的最後三位表示的數字
這題其實好辦,只要對1000取模就成

但我們都知道,指數會呈現**式增長

假如我們的b是乙個比較大的數字,大到用long long都可能會溢位

比如2^100

對於這樣的情況,結果都無法求出來,讓我怎麼進行「取模」運算呢?你這不是瞎鬧嗎?

於是我們引入公式

(a * b) % p = (a % p * b % p) % p
將程式改進

long

long

normalpower

(long

long base,

long

long power)

return result%

1000

;}

如此一來,問題的確得到了解決,但是新的問題又來了,這樣的演算法運算的效率是相當差勁的,於是我們進入這篇文章的重點,如何提高上述**的運算效率?

於是我們可以想到冪的運算公式

這樣便節約了計算時間

如果b是奇數,我們也可以特判,分離出來乙個,如:

思路清奇,改進**

long

long

fastpower

(long

long base,

long

long power)

power = power /2;

base =

(base * base)

%1000;}

return result;

}}

到這裡基本已經很高效了,但是通過二進位制的位運算還可以進一步優化

long

long

fastpower

(long

long base,

long

long power)

power >>=1;

//此處等價於power=power/2

base =

(base * base)

%1000;}

return result;

}

參考資料.

演算法提高快速冪(快速冪演算法詳解)

問題描述 給定a,b,p,求 a b mod p。輸入格式 輸入共一行。第一行有三個數,n,m,p。輸出格式 輸出共一行,表示所求。樣例輸入 2 5 3 樣例輸出 資料規模和約定 共10組資料 對100 的資料,a,b為long long範圍內的非負整數,p為int內的非負整數。所謂的快速冪,實際上...

快速冪演算法

在 上一直沒有找到有關於快速冪演算法的乙個詳細的描述和解釋,這裡,我給出快速冪演算法的完整解釋,用的是c 語言,不同語言的讀者只好換個位啦,畢竟讀 c的人較多 所謂的快速冪,實際上是快速冪取模的縮寫,簡單的說,就是快速的求乙個冪式的模 餘 在程式設計過程中,經常要去求一些大數對於某個數的餘數,為了得...

快速冪演算法

模運算 公式 a b mod n a mod n b mod n mod n a b mod n a mod n b mod n mod n a b mod n a mod n b mod n mod n 要保證n是整數 要知道a mod n和b mod n都是比n小的 利用這些共識可以有效地防止溢...