快速冪和快速冪求模演算法

2021-09-24 09:35:35 字數 1521 閱讀 4530

求 x 的 n 次方

當然,這道題你也可以採用 n 次迴圈讓 n 個 x 相乘,不過,這樣的做法毫無意義,因為估計小學生也會做。

不過這道題如果知道了思路,還是挺簡單,我舉個例子吧,例如我們要求 2^8。

1、首先,我們可以通過 2 * 2 = 4 得到 2^2

2、接著,我們利用剛才的結果,讓 4 * 4 = 16 得出 2^4

3、接著,同樣的道理,讓 16 * 16 = 256 得出 2^8

通過這種方法,只需要三次相乘即可得出,也就是說,我們可以在 o(logn) 的時間複雜度求出 x 的 n 次方。這種方法的思想,我們也稱之為快速冪思想,和二分查詢的思想有點型別,每次都進行翻倍或者縮小一半

這個時候有人可以能會問,如果 n = 8 或者 n = 16 ,由於 n 是 2 的冪次方,所以可以按照你上面的方法做,那如果 n = 12 呢?

其實道理是一樣的,我們可以對 12 進行拆分啊,把 12 拆分成 12 = 4 + 8 就可以了。然後就有 2^12 = 2^4 * 2^8。

那如果 n = 13 呢,也是一樣的,拆分成 13 = 1 + 4 + 8,即 2^13 = 2^1 * 2^4 * 2^8。

也就是說,任何整數,都可以把它拆分成若干個 2 的冪次方進行相加。

快速冪**:

//求x的n次方

long long power(long long x,long long n)

n = n >>1;  //右移一位,即縮小一倍

x *=x;  //擴大一倍

}return res;

}int main()

上面的測試可知,30的30次方,就超過計算機的取值範圍了,那麼快速取模的數可以是很大很大的數,因此需要進行取模。

由以上演算法可以,最終的冪值就是各個值相乘,其中的某個乘式取模和算出整個值取模效果是一樣的,確切的說是更好。例如,2^8求出值256,再對4求模為0,8 = 2^4*2^4,2個乘式2^4%4 == 0,最終的結果是一樣的。還避免了數值太大,

//為了使數字不會超過最大值,所以每次都取模

//2^n = 13 呢,拆分成 13 = 1 + 4 + 8,即 2^13 = 2^1 * 2^4 * 2^8。

//所以在下面兩處取模對結果沒有影響的。

//也需要取模,不然稍微大點的數,就超過了取值範圍。

long long power(long long x,long long n,long long mode)

n = n >>1;

x = (x*x)%mode;

}return res;

}int main()

{long long x,n,mode;

cout>n>>mode;

cout<< x << "的" << n << "次方對"<

256^256的值遠遠超過了計算機的最大範圍。

快速冪求模

所謂的快速冪,實際上是快速冪取模的縮寫,簡單的說,就是快速的求乙個冪式的模 餘 在程式設計過程中,經常要去求一些大數對於某個數的餘數,為了得到更快 計算範圍更大的演算法,產生了快速冪取模演算法。一.先從簡單的例子入手 先求值,在取模。演算法1.首先直接地來設計這個演算法 int ans 1 for ...

快速冪求模

演算法1.首先直接地來設計這個演算法 很容易因為數字過大而溢位。int ans 1 for int i 1 i b i ans ans a ans ans c 演算法2.根據公式a b mod c a mod c b mod c 改進為 int ans 1 a a c for int i 1 i b...

快速冪求模

快速冪 簡要介紹 能 快速算底數的n次冪。其時間複雜度為 o log n 與樸素的o n 相比效率有了極大的提高。其原理 假設求a的b次方 先 把b轉換成 二進位制數 該二進位制數第i位的權為 2 i 1 例如 11的二進位制是1011 因此,我們將a 轉化為算 其應用 1.一般演算法 int an...