快速幂学习笔记

本文详细介绍了快速幂算法,包括其功能(计算x^p),原理(基于二进制拆分和倍增),操作步骤(根据二进制位判断乘法或不变),以及C++的uint64_tpow函数实现,特别强调了时间复杂度为O(log2p)
摘要由CSDN通过智能技术生成

1. 快速幂

1.1. 功能

x p x^p xp

1.2. 原理:二进制拆分,倍增

p p p表示为二进制
n = l o g 2 p p = ∑ i = 1 n a i × 2 i ( a i = 0 或 a i = 1 ) n=log_2p\\ p=\sum_{i=1}^na_i\times 2^i(a_i=0或a_i=1) n=log2pp=i=1nai×2i(ai=0ai=1)

x p = x a 0 × 2 0 + a 1 × 2 1 + . . . + a n × 2 n = x a 0 × 2 0 × x a 1 × 2 1 × . . . × x a n × 2 n x^p=x^{a_0\times2^0+a_1\times2^1+...+a_n\times2^n}\\ =x^{a_0\times2^0}\times x^{a_1\times2^1}\times ...\times x^{a_n\times2^n} xp=xa0×20+a1×21+...+an×2n=xa0×20×xa1×21×...×xan×2n
对于 f ( u ) = x 2 u ( u ∈ N ∗ ) f(u)=x^{2^u} (u\in N*) f(u)=x2u(uN)
f ( u ) = x    ( u = 0 ) f ( u ) = f ( u − 1 ) 2    ( u > 0 ) f(u)=x\space\space(u=0)\\ f(u)=f(u-1)^2\space\space(u>0) f(u)=x  (u=0)f(u)=f(u1)2  (u>0)
故可以递推求 x 2 i x^{2^i} x2i

1.3. 操作

遍历 a a a,也就是 p p p的二进制位
a i = 0 a_i=0 ai=0,则该项整个为 1 1 1,所以:
如果 a i = 1 a_i=1 ai=1,答案*= x 2 i x^{2^i} x2i
如果 a i = 0 a_i=0 ai=0,答案*=1 (相当于没操作)

时间复杂度 l o g 2 p log_2p log2p

1.4. 实现

uint64_t pow(int x,int p){
    uint64_t r=1,f=x;//答案和f(i)
    while(p){
        if(p&1){//该位二进制为1
            r*=f;
        }
        p>>=1;
        f*=f;
    }
    return r;
}
  • 29
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值