数据结构与算法分析 - 快速幂简介
2014-04-10 13:20
218 查看
(1).秦九韶算法:
把一个N次的多项式,改写成如下形式:
\[\begin{array}{l}
f( x ) = a_n{x^n} + a_{n - 1}x^{n - 1} + \cdots + {a_1}x + a_0\\
= ( {a_n}x^{n - 1} + a_{n - 1}x^{n - 2} + \cdots + {a_1} )x + a_0\\
= ( ( ( {a_n}x + a_{n - 1} )x + a_{n - 2}) + \cdots + a_1)x + a_0
\end{array}\]
令:
\[\begin{array}{*{20}{l}}
{{b_1} = {a_n}x + {a_{n - 1}}}\\
{{b_2} = {b_1}x + {a_{n - {\rm{2}}}}}\\
{ \cdots \cdots }\\
{{b_n} = {b_{n - 1}}x + {a_{\rm{1}}}}
\end{array}\]
则:
\[f(x) = {a_n}{x^n} + \cdots + a_0 = b_n\]
这样做的好处就是:通过递归求解数列 {bn} 我们最终获得多项式的值,减少了幂运算和防止INT范围溢出。
(2).快速幂算法
求解:${a^b}\bmod c = ?$
令:
\[b_{( 10 )} = \overline {a_n}a_{n - 1} \cdots a_1{a_0} _{( 2 )} = a_n{2^n} + a_{n - 1}2^{n - 1} + \cdots + a_1{2^1} + a_0\]
故:
\[a^b = a^{a_n{2^n}}a^{a_{n - 1}2^{n - 1}} \cdots a^{a_1{2^1}} a^{a_0}\]
\[{a^b}\bmod c = [ {( {{a^{{a_n}{2^n}}}\bmod c} )( {{a^{{a_{n - 1}}{2^{n - 1}}}}\bmod c} ) \cdots ( {{a^{{a_1}{2^1}}}\bmod c} )( {{a^{{a_0}}}\bmod c} )} \bmod c,{a_i} = \{ {0,1|i \in [ {1,n} ]} \}\]
实际上,我们还可以用移位方式表示 ai :
\[a_i = b > > i \& 1,i \in [ 1,n ]\]
(3).代码模板:
//整数的快速幂 m^n % k 的快速幂:
long long quickpow(long long m , long long n , long long k){
long long ans = 1;
while(n){
if(n&1)//如果n是奇数
ans = (ans * m) % k;
n = n >> 1;//位运算“右移1类似除1”
m = (m * m) % k;
}
return ans;
}
(4).代码解释:
这里的a为底数,需要区别于ai :
\[\begin{array}{l}
if( a_i == 1),a^{a_i{2^i}} = a^{2^i}\\
if (a_i == 0),a^{a_i{2^i}} = 1
\end{array}\]
在这里我们记:(i代表第i位)
\[p_k = a^k,k = 2^i\]
则我们可以获得数列 { pk },递推式为:
\[p_k = ( {p_{k - 1}^2} )\bmod c, p_0 = a\bmod c\]
(5).样例实验
hdu 2035 - 人见人爱A^B
题意:求解(A^B)%1000
解法:自然是快速幂。
附上我的代码:
#include<cstdio>
#include<cstdlib>
using namespace std;
//计算(a^p)%m
long long int fast_pow(long long a,long long p,long long m){
long long ans=1;
while(p){
if(p&1) ans=(ans*a)%m;
p=p>>1;
a=(a*a)%m;
}
return ans;
}
int main(){
int n,m;
while(scanf("%d %d",&n,&m)!=EOF && (n||m)){
printf("%d\n",fast_pow(n,m,1000));
}
}
相关文章推荐
- 【福利】【已送出几本,更新下】囤积书放送(oracle,java web,js,jquery,rcp,android,数据结构设计模式。。。。。)
- 数据结构基础(15)------------QuickSort
- 郝斌数据结构(五):树
- Java常用数据结构
- RMQ问题
- 对单链表实现就地逆置
- 郝斌数据结构(四):静态队列
- 郝斌数据结构(三):动态栈
- 郝斌数据结构(二):单链表
- 郝斌数据结构(一):数组的模拟
- 数据结构绪论
- 重温数据结构:平衡二叉树(AVL树)、红黑树、TreeSet与TreeMap
- 数据结构
- KMP字符串模式匹配详解
- 数据结构(C语言版)摘录--图
- 数据结构基础(14)------------归并排序
- WebRTC音视频引擎研究(2)--VoiceEngine音频编解码器数据结构以及参数设置
- 顺序表的就地逆置
- 删除链表中所有值相同的多余元素
- 在无头结点的动态单链表上实现线性表操作Insert(L,i,b)