快速幂个人笔记

## 让计算机很快的计算出a的b次方

------------

暴力相乘的话,计算机要计算b次,而用快速幂,计算机的计算次数达到 log级别

------------

## 原理:
1. 如果将a自乘一次,就会变成a^2,再自乘一次,就是a^4,依次类推..

1. a^x * a^y=a^(x+y),正常的数学运算

1. 将b转化为二进制试试:
比如b=11,转化为二进制就是1011,从左到右,这些1分别代表十进制的8、2、1,那么可以说a^11=a^8 * a^2 * a^1

而在快速幂的过程中,a自乘为a^2,再自乘为a^4,依此类推,达到快速求出的效果


------------
## 过程将会这样
- 假设我们拿到了一个数字a,并且b等于11,但是我们嫌弃乘11次太慢了。

- 那我们稍微转变一下,以计算机的视角来看b的二进制是1011

- 我们定义一个base,让base=a,再定义一个ans=1,用来保存答案,接下来我们在代码中演示

这里的a我们以2为例子
 

int quickPower(int a, int b)
{
	int ans = 1, base = a;
	while (b > 0)
	{
		if (b & 1)
		{
			ans *= base;
			/*
			* 第一次循环,b=1011,最后一位为1?,是的话说明 a^11 = a^8 * a^ 2 * a^1,中的 a^1 存在,所以ans*=base
			* 第二次循环,b=101,最后一位还是1,那么这个时候说明 a^ 2 存在,继续ans*=base
			* 第三次循环,b=10,最后一位不是1,那么这个时候说明 a^4 不存在,那么ans不动
			* 第四次循环,b=1,最后一位是1,那么说明 a^8 存在,继续ans*=base,到此循环结束,ans就是最终的结果
			*/
		}
		base *= base;// base 无论如何都进行自乘
		b >>= 1;//位运算,b右移一位,如101变成10(把最右边的1移掉了),1011变成101。现在b在二进制下最后一位是刚刚的倒数第二位。结合上面b & 1食用更佳
	}
	return ans;
}

同时,快速幂通常结合取余运算,如a^b对p取余,代码如下

int quickPower(int a, int b)
{
	int ans = 1, base = a;
	while (b > 0)
	{
		if (b & 1)
		{
			ans *= base;
			ans %= p;
		}
		base *= base;
        base %= p; 
		b >>= 1;
	}
    ans %= p;
	return ans;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮城大学生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值