a^b mod p

Posted innovationv2

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了a^b mod p相关的知识,希望对你有一定的参考价值。

a^b

基础知识

求模就是取余

代码原理

例 3 ^ 7 mod 5
7 = 111
3 ^ 7 = 3^(111) = (3^001) * (3^010) * (3^100) = (3^1) * (3^2) * (3^4)

3 ^ 001 = 3 ^ 1 = 3
3 ^ 010 = (3 ^ 1)^2 = 9
3 ^ 100 = (3 ^ 2)^2 = 81 //每个乘式都是上一个乘式结果的平方

3 ^ 7 mod 5的一般计算过程如下

3^1 % 5 = 3
3 * 3^2 % 5 = 2
2 * 3^4 % 5 = 2

然后拆开

第一步

3 % 5 = 3

第二步-> 3 * 9 % 5 = 2拆开

3 * 3 % 5 = 9 % 5 = 4 //先将9%5计算出来,然后3 * 4%5
3 * 4 % 5 = 2      

 第三步 -> 2 * 81 % 5 = 2 拆为

4 * 4 % 5 = 1 //为什么是 4 * 4而不是9 * 9 
2 * 1 % 5 = 2

这里为什么是4 * 4而不是9 * 9,我们看出每步求余中的数都是上一次结果的平方,
4是由9%5=4也就是第二步计算得出,第三步对应位置本应是9 * 9%5
展开得(5+4) * (5+4)%5=((5 * 5)+(5 * 4)+(4 * 5)+(4 * 4))%5=4 * 4%5
也就是说如果被除数中已经有单位个余数,那么这个数无论乘谁,原本可整除被除数的那部分都是仍可整除被除数的,而改变余数的是原本就不能整除被除数的那部分。
比如18%7=2....4
那么(18 * n)%7==(4 * n)%7
所以说如果这个题改成3^15mod5
那么就应该还有第四步
1 * 1%5=1
1 * 2%5=2

代码

#include<iostream>
using namespace std;
int main(){
    int a , b  , p ;
    int ans = 1 % p;
    while(b){
        if(b&1) ans = ans * a % p;
        a = a * a  % p ;
        b >>=1;
    }
    cout<<ans<<endl;
    return 0;
}



















以上是关于a^b mod p的主要内容,如果未能解决你的问题,请参考以下文章

快速幂(a^b mod p)的模板(两种:递归和迭代)

组合数取模

51nod 1038X^A Mod P

解高次同余方程51nod1038 X^A Mod P

组合数_卢卡斯定理_费马小定理_高精度组合数

题解 P4139 上帝与集合的正确用法