快速幂理解

Posted 谦谦君子,陌上其华

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速幂理解相关的知识,希望对你有一定的参考价值。

 

当求解a的b次方时,如果b很大,那么时间复杂度O(n)就会很高,用快速幂可以降低复杂度。

现在假如要求a的11次方,11用二进制就可以表示成1011,那么就可以得到如下的公式:

代码的实现很简单,如下:

typedef long long LL;  
LL fun(LL x,LL n,)  
{  
    LL res=1;  
    while(n>0)  
    {  
        if(n & 1)  
            res=(res*x);  
        x=(x*x);  
        n >>= 1;  
    }  
    return res;  
}  

 

现在来介绍一下矩阵快速幂,其实它和上面的解法是差不多的,只是把上面的底数替换成矩阵来计算。

可以看一道题目,poj3070

解法如下:

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<vector>
 6 #include<queue>
 7 #include<cmath>
 8 using namespace std;
 9 
10 const int MOD=10000;
11 
12 struct matrix
13 {
14     int m[2][2];
15 }ans,base;
16 
17 matrix multi(matrix a,matrix b)
18 {
19     matrix temp;
20     for(int i=0;i<2;i++)
21     {
22         for(int j=0;j<2;j++)
23         {
24             temp.m[i][j]=0;
25             for(int k=0;k<2;k++)
26                 temp.m[i][j]=(temp.m[i][j]+a.m[i][k]*b.m[k][j])%MOD;
27         }
28     }
29     return temp;
30 }
31 
32 int fun(int n)
33 {
34     ans.m[1][1]=ans.m[0][0]=1;
35     ans.m[1][0]=ans.m[0][1]=0;    //初始化单位矩阵,相当于快速幂中的1
36     base.m[0][0]=base.m[0][1]=base.m[1][0]=1;   //初始化所求矩阵,相当于快速幂中的底数
37     base.m[1][1]=0;
38     while(n)
39     {
40         if(n&1)
41         {
42             ans=multi(ans,base);
43         }
44         base=multi(base,base);
45         n>>=1;
46     }
47     return ans.m[0][1];
48 }
49 
50 int n;
51 
52 int main()
53 {
54     //freopen("D:\\\\input.txt","r",stdin);
55     while(~scanf("%d",&n)&&n!=-1)
56         printf("%d\\n",fun(n));
57 }

 

以上是关于快速幂理解的主要内容,如果未能解决你的问题,请参考以下文章

深入理解非递归快速幂

非递归快速幂原理

快速幂——while理解&&[P1965] 转圈游戏

矩阵快速幂基础

关于矩阵快速幂的用法总结QwQ

二进制快速幂及矩阵快速幂