【快速幂】幂运算的快速入门

要想要了解快速幂,首先我们要对取模运算进行一个简单的了解
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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值