学弟讲算法-数论-快速幂

一、提出

3 13 3^{13} 313

二、研究

2.1 常规算法

3 13 3^{13} 313 = 3 * 3 * 3 * 3 * 3 * 3 * 3 * 3 * 3 * 3 * 3 * 3 * 3
需要算 14 次,太麻烦,不符合程序员的逼格

2.2 快速幂

( 13 ) ∗ 10 (13)*{10} (13)10 = ( 1101 ) ∗ 2 (1101)*2 (1101)2 = 1 * 2 3 2^3 23 + 1 * 2 2 2^2 22 + 0 * 2 1 2^1 21 + 1 * 2 0 2^0 20

3 13 3^{13} 313 = 3 1 ∗ 2 3 + 1 ∗ 2 2 + 0 ∗ 2 1 + 1 ∗ 2 0 3^{1 * 2^3 +1 * 2^2 + 0 * 2^1 + 1 * 2^0 } 3123+122+021+120

3 13 3^{13} 313 = 3 8 3^8 38 * 3 4 3^4 34 * 3 1 3^1 31
需要算 7 次,方便运算

推导过程
3 1 3^1 31 = ( 3 1 ) (3^1) (31)

3 2 3^2 32 = ( 3 1 ) 2 (3^1)^2 (31)2

3 4 3^4 34 = ( 3 2 ) 2 (3^2)^2 (32)2

3 8 3^8 38 = ( 3 4 ) 2 (3^4)^2 (34)2

快速幂就是运算过程不断对底数进行平方运算,并当指数的二进制某位为 1 时,保存当前底数的值

2.3 代码实现

代码实现

typedef long long ll;
//a为底数,b为指数
ll fastPower(ll a, ll b, ll mod) {
	if(b==0) {
		return 1%mod;
	}
	//res用来保存结果
	ll res = 1;
	while(b) {
		//指数当前位为1时,保存底数的值
		if(b&1) {
			res = (res * a)%mod;
		}
		//判断指数的下一位
		b>>=1;
		//底数做平方运算
		a = (a * a)%mod;
	}
	return res;

}

运行结果:

在这里插入图片描述

b&1 表示 b 与 1 进行按位与操作,若 b 当前二进制位为 1 则结果为 1;同时若 b 为奇数时,该操作结果也为 1

>> 表示位移运算

2.4 教程

二进制按位与,位移运算教程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值