快速幂算法

求超大次幂的算法,可将时间复杂度从O(N)降为 O(log?N)

百科里有很清晰的介绍:

http://baike.baidu.com/link?url=x4vZ0RoaOyeRqi9vT4vYICe6uy8SeHhB1i6cCHPHTWBEcbdzGG06G8McAymojBn9Aq_1-PU_CVsww39dvmyPI_

int pow4(int a,int b)
{
    int r=1,base=a;
    while(b!=0)
    {
        if(b&1)
            r*=base;
        base*=base;
        b>>=1;
    }
    return r;
}

这里有一个数学证明,用到了秦九韶算法

http://blog.csdn.net/lsldd/article/details/5506933

可以把b按二进制展开为:b = p(n)*2^n  +  p(n-1)*2^(n-1)  +…+   p(1)*2  +  p(0)
其中p(i) (0<=i<=n)为 0 或 1

这样 a^b =  a^ (p(n)*2^n  +  p(n-1)*2^(n-1)  +...+  p(1)*2  +  p(0))
               =  a^(p(n)*2^n)  *  a^(p(n-1)*2^(n-1))  *...*  a^(p(1)*2)  *  a^p(0)
对于p(i)=0的情况, a^(p(i) * 2^(i-1) ) =  a^0  =  1,不用处理

我们要考虑的仅仅是p(i)=1的情况

化简:a^(2^i)  = a^(2^(i-1)  * 2) = (  a^(  p(i)  *  2^(i-1)  )  )^2
(这里很重要!!具体请参阅秦九韶算法:http://baike.baidu.com/view/1431260.htm

时间: 2024-12-25 07:37:45

快速幂算法的相关文章

hdu oj 1061 Rightmost Digit (快速幂算法)

这里首先要讲解一下快速幂算法: 快速幂取模算法 在网站上一直没有找到有关于快速幂算法的一个详细的描述和解释,这里,我给出快速幂算法的完整解释,用的是C语言,不同语言的读者只好换个位啦,毕竟读C的人较多~ 所谓的快速幂,实际上是快速幂取模的缩写,简单的说,就是快速的求一个幂式的模(余).在程序设计过程中,经常要去求一些大数对于某个数的余数,为了得到更快.计算范围更大的算法,产生了快速幂取模算法.[有读者反映在讲快速幂部分时有点含糊,所以在这里对本文进行了修改,作了更详细的补充,争取让更多的读者一目

快速乘法/快速幂 算法

快速幂算法可以说是ACM一类竞赛中必不可少,并且也是非常基础的一类算法,鉴于我一直学的比较零散,所以今天用这个帖子总结一下 快速乘法通常有两类应用:一.整数的运算,计算(a*b) mod c  二.矩阵快速乘法 一.整数运算:(快速乘法.快速幂) 先说明一下基本的数学常识: (a*b) mod c == ( (a mod c) * (b mod c) ) mod c //这最后一个mod c 是为了保证结果不超过c 对于2进制,2n可用1后接n个0来表示.对于8进制,可用公式 i+3*j ==

快速幂算法的理解

首先给出代码: #include <iostream> using namespace std; //计算a^bmodn int modexp(int a,int b,int n) { int ret=1; int tmp=a; while(b) { if(b&1) ret=ret*tmp%n; tmp=tmp*tmp%n; b>>=1; } return ret; } int main() { cout<<modexp(2,10,3)<<endl;

快速幂算法(矩阵快速幂还不是很会。。日后会更新)

PS:转载,自己写的不如人家,怕误导.转载地址:http://www.cnblogs.com/CXCXCXC/p/4641812.html 首先,快速幂的目的就是做到快速求幂,假设我们要求a^b,按照朴素算法就是把a连乘b次,这样一来时间复杂度是O(b)也即是O(n)级别,快速幂能做到O(logn),快了好多好多.它的原理如下: 假设我们要求a^b,那么其实b是可以拆成二进制的,该二进制数第i位的权为2^(i-1),例如当b==11时   a^11=a^(2^0+2^1+2^3) 11的二进制是

快速幂算法(Fast exponentiation algorithm)

对于算式an,其基本运算的时间复杂度为O(n).快速幂能将计算的复杂度降至O(log2n). Step 1. 将n拆分成二进制形式的加法: n = (2j-1 × kj) + (2j-2 × kj-1) + ... + (21 × k2) + (20 × k1) 其中,kj 为n的第j位上的数字,显然 kj = 0, 1, 2, ..., 9. Step 2. 于是,an = a2j-1×kj  +  a2j-2×kj-1  +  ...  +  a21×k2  +  a20×k1    = (

Fibonacci数列的快速幂算法

设Fibonacci数列定义为: 请用矩阵快速幂方法,即利用以下公式求Fibonacci数列第n项. 本题不涉及高精度数. 1 #include<stdio.h> 2 typedef struct matrix{ 3 int m[2][2]; 4 }matrix; 5 6 matrix multi(matrix a, matrix b) 7 { 8 int i, j, k; 9 matrix tmp; 10 for( i = 0; i < 2; ++i) 11 { 12 for( j =

HDU 2138 How many prime numbers(Miller_Rabin法判断素数 【*模板】 用到了快速幂算法 )

How many prime numbers Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 12955    Accepted Submission(s): 4490 Problem Description Give you a lot of positive integers, just to find out how many pr

快速幂算法 - JS 实现

算法思路: 1. 如果是奇数幂,x * p(x,n-1) 2.如果是偶数幂,p(x , n/2) * p (x, n/2) 3. 如果n=0 ,返回1 时间复杂度  : O(logN) 具体实现: function fastPow(x,n){ if(n == 0){ return 1; } else if(n % 2 == 1){ return fastPow(x,n-1) * x; } else{ var r = fastPow(x,n/2); return r * r; } } consol

数论——快速幂算法 a^b mod c

// 快速计算 (a ^ p) % m 的值 __int64 FastM(__int64 a, __int64 p, __int64 m){ if (p == 0) return 1; __int64 r = a % m; __int64 k = 1; while (p > 1) { if ((p & 1)!=0) { k = (k * r) % m; } r = (r * r) % m; p >>= 1; } return (r * k) % m; }