要想要了解快速幂,首先我们要对取模运算进行一个简单的了解
1.模运算
a mod b表示a除以b的余数。模运算同加减乘除一样拥有自己的性质。
(1)p整除a,b之差,则a,b同余。
(2)传递性
(3)交换律,加法交换律,乘法交换律。
(4)加法结合律,乘法结合律
模运算的重要性质
(1)a,b在模p下同余,则a,b与c之和或之积在模p下同余。
(2)a+b在模p下同余并且c+d在模p下同余,则a+c,b+d在模p下同余
模运算的基本四则运算
(1)(a+b)mod p=(a mod p+b mod p)mod p 例如(11+13)mod 5=4
模两次的原因是一次取模很可能 无法取完。
(2)乘法与上述同理
(3)(a^b)mod p=((a mod p)^b)mod p.幂运算
2.简单的幂取模的运算
利用上述模运算的四则运算的幂运算 实现大数据幂运算。
//1.计算a^b mod p
int qumo(int a,int b,int p) {
int ans = 1;
for (int i = 1; i <= b; i++) {
ans = ans * a%p;
}
return ans;
}
int zhucipingfang(int a, int b, int p) {
int ans = 1;
return ans;
}
3.逐次平方法取模(快速幂)
.上述算法可以实现简单的取模运算,但是当数据很大的时候,它的时间复杂度会随之增大,计算2^10000需要运用一万次乘法和一万次取模运算。
而2^10000可以分成2^5000*2^5000,也就是说我们计算2^10000只需要计算出2^5000,计算量一下就少了一半, 以此类推,每次取平方的时候都取一半,奇数的时候在乘一遍它本身即可,而在c语言中,除以二的操作也可以用位运算来实现,所以可以将幂运算的指数看成二进制表示的数,每次都右移一位即可。
int kuaisumi(int a, int b, int p) {
int ans = 1;
while(b>0){
if(b&1) ans = ans * a%p;
a = (a * a)%p;
b >>= 1;
}
return ans;
}