快速冪(冪運算取模的logn演算法)

2022-08-13 14:18:11 字數 862 閱讀 3156

以下以求a的b次方來介紹

把b轉換成二進位制數

該二進位制數第i位的權為

例如11的二進位制是1011

11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1

因此,我們將a¹¹轉化為算

對於            令a[0]=a^(2^0)*1  a[1]=a^(2^1)*1   a[2]=a^(2^2)*0  a[3]=a^(2^3)*1

可以看出a[n]的前半部分是a[n-1]前半部分的平方倍  則可以一直迴圈推(a^(2^k))^2,從右到左依次取b二進位制數的位數  如果是0則不乘入答案 如果是1則乘入答案(無論乘入不乘入 一直將a的平方推下去(就前邊辣個))

直到b為0跳出迴圈

必備的知識

對於取模運算:(a*b)%c=(a%c)*(b%c)%c 成立

//實際上

(a +  b) % p = (a%p +  b%p) %p      

(a  -  b) % p = (a%p  -  b%p) %p  也成立

但是除法不成立 可以舉例證明

位運算  <

>>k  右移二進位制數  相當於除2^k

&且 1&1=1        | 或    1|1=1 

1&0=0            1|0=1 

0&1=0            0|1=1 

0&0=0            0|0=0 

1

//實現**2//

mod c34

int quick(int a,int b,int

c) 5

14return

ans;

15 }

快速冪 快速冪取模演算法

在平時我們需要求乙個a b時,一般會用c 自帶的pow 函式對吧,可是加入資料十分大時,pow 是十分慢的,這個時候我們需要乙個能高效求出a b的演算法,這這時就出現了快速冪演算法。假如我們需要求3 999,那麼我們是不是可以發現3 999 3 512 256 128 64 32 4 2 1 3 5...

快速冪運算和快速冪取模運算

如果我們要求乙個數x的n次冪,樸素的想法是讓n個x相乘。對與n很大的情況,會造成一定的時間浪費。這裡講解一下o nlogn 的快速冪解法 我們考察a 11 次方。我們將它的冪用二進位制形式表示 11轉化為二進位制是1011 也就是a 1011。我們將它再做一步轉換。二進位制 數字轉化成對應1相加的形...

快速冪取模運算

1.如果b是偶數,我們可以記k a2 mod c,那麼求 k b 2 mod c 就可以了。2.如果b是奇數,我們也可以記k a2 mod c,那麼求 k b 2 mod c a mod c k b 2 mod c a mod c就可以了。那麼我們可以得到以下演算法 演算法4 int ans 1 a...