c++ 快速幂 代码实现

懒得打代码系列…
不过这个代码挺短的死背下来也ok

解析在最下面
建议自己手动试个数据理解一下 比如 3^5
^^
原理:a ^ b = a ^ (b / 2) * 2
(b是奇数的话还要再乘一个a)

还有就是我发现自己英语词汇还是太少了QAQ
只能乖乖打拼音…
装不了逼了真的超生气

低端版本
这个都看得懂 就懒得注释了嘻嘻:)

int quick_mi( int DiShu , int ZhiShu , int Mo ){
    if(ZhiShu == 1) return DiShu ;
    int ans ;
    ans = quick_mi(DiShu , ZhiShu / 2 , Mo) % Mo;
    ans = ans * ans % Mo ;
    if(ZhiShu >>= 1){
        ans = ans * DiShu % Mo ;
    }
    return ans ;
}

高级版本
(反正那些一眼看上去看不懂的对我来说都挺高级的^^

int quick_mi( int DiShu , int ZhiShu , int Mo ){
    int ans = 1 ;
    while( ZhiShu ){
        if( ZhiShu & 1 ) //如果当前指数为奇数
            ans = ans * DiShu % Mo ;//上下两行代码的顺序要理解一下 
        DiShu *= DiShu ;    
        ZhiShu >>= 1 ; //指数除以二 
    }
    return ans ;
}

[其实就是指数不断除二 底数再不断乘二啦 还要不断 % Mo防止爆掉数据范围]
[不过要特别处理指数为奇数的时候 这里没有写出来]
ans = DiShu ^ ZhiShu % Mo ;
ans = { DiShu ^ ( ZhiShu / 2 ) * DiShu ^ ( ZhiShu / 2 ) } % Mo ;
ans = DiShu ^ ( ZhiShu / 2 ) ^ 2 % Mo ;
[当指数为奇数的时候 当前步还要再多乘一次底数]
ans = ( DiShu * DiShu ) ^ ( ZhiShu / 2 ) % Mo ;
ans = ( DiShu * DiShu ) ^ ( ZhiShu / 2 / 2 ) ^ 2 % Mo ;
ans = { ( DiShu * DiShu ) ^ ( DiShu * DiShu ) } ^ ( ZhiShu / 2 / 2 ) % Mo ;
[同理]
…..
[直到当前指数由 1 / 2 变成0的时候最后的答案就算出来啦]
[不要忘记奇数的处理!]

矩阵快速幂的原理也是一样的
只不过把*变成了矩阵意义上的乘而已
^^

 

posted @ 2018-08-06 17:08  GCCCC  阅读(370)  评论(0)    收藏  举报