点击箭头处“蓝色字”,关注我们哦!!
算法
快速幂算法
● ○ ●
Fast Power Algorithm
● ○ ●
设a,b,c都是正整数,计算a的b次方对c取模(a ^ b % c)
在非对称密钥算法RSA中是一个很基本的问题,由于a,b,c
可能会比较大,直接计算显然无法满足效率要求,可以借鉴快速幂的思想减少计算次数。
做法是根据b的奇偶性,分情况讨论:
❉❉❉❉❉❉❉❉❉❉
b为偶数
如果b为偶数
,不妨设b = 2k
,那么
a ^ b % c = a ^ 2k % c = (a ^ k % c) * (a ^ k % c) % c = (a ^ k % c) ^ 2 % c
![1af2c86599399c8b11f1d2cd04e70062.png](https://i-blog.csdnimg.cn/blog_migrate/9707cdb9ead61f6203c2fc4767f9ea44.png)
b为奇数
如果b为奇数
, 不妨设b = 2k + 1
,那么
a ^ b % c = (a * a ^ 2k) % c = (a % c) * (a ^ 2k % c) % c = (a % c) * ((a ^ k % c) ^ 2 % c) % c
![46969d955ecd9aca3827ec954bec4728.png](https://i-blog.csdnimg.cn/blog_migrate/480112cced00a8611df828c26ed8e635.png)
可见,无论奇偶,计算规模都可以缩至原来的一半,时间复杂度由O(b)降至O(logb)
。
根据以上递推式,很容易写出解决该问题的递归算法。
int powmod(int a, int b, int c) { if (0 == b) return 1; long long x = powmod(a, b/2, c); x = x * x % c; if (b & 1) x = x * a % c; return x;}
如果将实现改成迭代方式就是这样:
int powmod(int a, int b, int c) { long long x = 1, t = a; while (b) { if (b & 1) x = x * t % c; t = t * t % c; b /= 2; } return x;}
♡♡♡♡♡♡♡♡♡♡
![f435378533975a8190c0a25864bf8dc8.png](https://i-blog.csdnimg.cn/blog_migrate/dd77cfa2ed347acfa33d420a3e2407c3.png)
算法设计
C++
![685c9ec5bad3ddbe71e7e8999227430b.png](https://i-blog.csdnimg.cn/blog_migrate/7b500983ef90c54537fe6b632d15ed35.jpeg)
扫码关注我
一起感悟科学魅力
点分享
点点赞
点在看
点击