码迷,mamicode.com
首页 > 其他好文 > 详细

乘方快速幂 OR 乘法快速幂

时间:2015-09-03 20:17:44      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:

      关于快速幂这个算法,已经不想多说,很早也就会了这个算法,但是原来一直靠着模板云里雾里的,最近重新学习,发现忽视了一个重要的问题,就是若取模的数大于int型,即若为__int64的时候应该怎么办,这样就得用到乘法快速幂+乘方快速幂了。

     快速幂一般是为了解决乘方取模问题的,显然思想就是二分,下面贴上快速幂模板:

技术分享
 1 __int64 mulpow(__int64 a,__int64 p,__int64 m)
 2 {
 3     __int64 ans = 1;
 4     while(p)
 5     {
 6         if(p&1)
 7             ans = ans * a % m;
 8         p >>= 1;
 9         a = a * a % m;
10     }
11     return ans;
12 }
View Code

但是以上代码有个问题,并不适合m超过int的情况,下面提供m超过int情况的解法

技术分享
 1 __int64 multi(__int64 a,__int64 b,__int64 n)  //乘法快速幂
 2 {
 3     __int64 temp=0;
 4     while(b)
 5     {
 6         if(b&1)
 7         {
 8             temp+=a;
 9             if(temp>=n)  temp-=n;
10         }
11         a<<=1;
12         if(a>=n) a-=n;
13         b>>=1;
14     }
15     return temp;
16 }
17 
18 __int64 mulpow(__int64 a,__int64 m,__int64 n)  //乘方快速幂
19 {
20     __int64 temp=1;
21     a%=n;
22     while(m)
23     {
24         if(m&1)  temp=multi(temp,a,n);
25         a=multi(a,a,n);
26         m>>=1;
27     }
28     return temp;
29 }
View Code

但缺点就是速度慢了点,logn*logn的

 

乘方快速幂 OR 乘法快速幂

标签:

原文地址:http://www.cnblogs.com/wolf940509/p/4780601.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!