快速幂算法

前言:密码学中一些练习对于大素数取模不知道怎么手算,于是查了下发现存在快速幂进行模运算的算法,这边就来学习下顺便做个笔记

简化高次幂运算

一般对于高次幂可以通过下述操作来进行简化,可以看到就如下两种情况

  • 如果当前幂次为偶数的话,那么直接求底数的平方,然后幂次下降除以2

  • 如果当前幂次为奇数的话,那么直接求底数的平方

非递归快速幂

通过上述的两种情况下,这里编写一个对应的代码即可

typedef long long ll;
ll get_counting(ll a, ll n) {
ll ans = 1;
while (n) {
if (n & 1)
ans *= a;
a *= a;
n >>= 1;
}
return ans;
}

证明(a*b)mod n == ((a mod n)*(b mod n)) mod n

额外的知识点,这里顺便记录下

参考文章:https://www.zhihu.com/question/41361614

其中最后一步的理解,其中N不管是否是大于C的,其实都是可以被C mod掉,那么c*k就可以被消掉

非递归快速幂取模

在非递归快速幂的代码上配合上面的取模的性质修改

typedef long long ll;
ll get_fast_power_mod(ll a, ll n, ll c) {
ll ans = 1;
while (n) {
if (n & 1)
ans = (ans * a) % c;
a = (a * a) % c;
n >>= 1;
}
return ans;
}

posted @   zpchcbd  阅读(85)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
历史上的今天:
2019-11-28 学习:SLT_string容器
2019-11-28 ThinkCMFX任意文件包含漏洞
点击右上角即可分享
微信分享提示