数论基础——快速幂……

目录

一、快速幂

二、一些知识


一、快速幂

用法:求a的p次幂%mod

  • 源代码1
int fast_pow(int a,int p)//快速幂求法
{
    int res=1;
    while(p){
         
        if(p%2==0){
            a=a*1ll*a%mod;
            p=p/2;
        }else{
            res=res*1ll*a%mod;
            --p;
        }
    } 
    return res;
} 
  • 源代码2:
    int fast(int a,int b,int mod){
        int res=1%mod;
        while(b){
            //b&1为true说明二进制下的b的第0位为1,即b为奇数,返回false则b为偶数
            if(b&1) res=(ll)res*a%mod;
            a=(ll)a*a%mod;
            b>>=1;//二进制数下的b右移一位等于b/2
        }
        return res;
    }

  • 理解:

/*     当指数为偶数时,a=a*a,指数p/2;

eg:求5^10,a=5,p=10;
       第一次循环,a=25,p=5.显然是正确的,5^10=25^5;
       第二次循环,因为p等于5,不能倍缩了,所以得乘掉一个a,让它继续满足倍缩条件 
       此时res=25,a=25,p=4
       依次循环循环直到p=1时,得到结果,res=1*5^10=1*25^5=1*25*25^4=1*25*625^2=1*25*390625 
 */

二、一些知识

1、a*b%c = (a%c)*(b%c)

2、a^b%p = (a%p)^b%p

3、费马小定理:对于a和素数p,满足a^(p-1)%p ≡ 1。(a*a^(p-2)%p ≡ 1,a的逆元为a^(p-2))

4、逆元:对于b和p(b和p互素),若a*b%p ≡ 1,则称a为b%p的逆元)。

4、a/b%p=a*(b^(p-2))%p(a与p互质))(由费马小定理和逆元定义可得,b的逆元为b^(p-2),分式同乘它即可得到后面那个式子,将除法的余数改成乘法的余数)

5、p>>=1等价于p/=2;//>>a位运算符表示将p二进制数下的位数整体向右移a位,p为正数则左补0,负数左补1,右边多余的舍弃。

参考:数论基础  逆元—组合数求模

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值