快速幂&快速幂取模算法

来源:互联网 发布:精美的php 个人博客 编辑:程序博客网 时间:2024/04/23 18:20

在平时我们需要求一个a^b时,一般会用c++自带的pow()函数对吧,可是加入数据十分大时,pow()是十分慢的,这个时候我们需要一个能高效求出a^b的算法,这这时就出现了快速幂算法。

假如我们需要求3^999,那么我们是不是可以发现3^999 =3 ^ (512 + 256 + 128 + 64 + 32 + 4 + 2 + 1)=(3 ^ 512) * (3 ^ 256) * (3 ^ 128) * (3 ^ 64) * (3 ^ 32) * (3 ^ 4) * (3 ^ 2) * 3。我们可以先把999拆开,拆成 (512 + 256 + 128 + 64 + 32 + 4 + 2 + 1),这时会发现他们是2的n次方。就可以使用分治的思想把(3 ^ 512) 、(3 ^ 256) 、 (3 ^ 128) 、 (3 ^ 64) 、(3 ^ 32) 、(3 ^ 4) 、 (3 ^ 2) 、3^1分别求出后再相乘,就有了递归算法。

int recursion(int a,int b){    int tem = 1;    if(b == 0)return 1;    else if(b == 1)return a;    tem = tem*recursion(a,b>>1);    tem = tem*tem;    if(b&1)tem = tem*a;    return tem;}

将快速幂递归算法改进后就有了递推算法

int loop(int a,int b){int tem = 1,ret = a;while(b > 0){if(b&1)tem = tem*ret;ret = ret*ret;b >>= 1;}return tem;}

这就是快速幂算法,当然很多时候我们还会遇到一个(a^b)%c其中a^b非常大,就有了快速幂取模算法。

int quickpow(int a,int b,int k){int tem = 1,ret = a;while(b > 0){if(b&1)tem = (tem*ret)%k;ret = (ret*ret)%k;b >>= 1;}return tem;}


0 0