博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
快速幂算法
阅读量:7216 次
发布时间:2019-06-29

本文共 1099 字,大约阅读时间需要 3 分钟。

快速幂算法思想:迭代/二进制

我们知道一个公式:a*b%c=(a%c*b%c)%c

如果要求ab%c:

一、迭代

  当b为奇数:ab%c=((a2b/2*a)%c,记k=a2%c,那就是求(kb/2%c*a)%c

  当b为偶数:ab%c=(a2b/2%c,记k=a2%c,那就是求kb/2%c

  然后问题转化为求kb/2%c,

  我们假设

令k1=a2%c,问题转化为求k1b/2%c

令k2=k12%c=a4%c,问题转化为求k2b/4%c

令k3=k22%c=a8%c,问题转化为求k3b/8%c

……

这个过程就可以迭代下去,一开始k=a,每次b=b/2,k=k*k%c,每当b为奇数时,都要把此时的k(还未平方的)乘进答案,求到最后,b=1时(最后b一定先=1,然后=0),答案就一定会乘进去的,然后b=0就结束算法了。

#include
int main(){ int a,b,c,k,ans; scanf("%d%d%d",&a,&b,&c); ans=1; k=a; while(b){ if(b%2)//b是奇数 ans=ans*k%c; k=k*k%c; b=b/2; } printf("%d",ans); return 0;}

 

二、二进制

  假设b=(18)10=(10010)2

  那ab%c=a(10)2*a(10000)2%c=a2*a16%c

  每次循环就相当于对b的二进制位从右到左审查,如果为1,那就乘上k,

  k是什么? 就是a以b的这个二进制位为幂的值,比如到了10010的从右到左第二个位置时,k=a(10)2=a2,到了第五个位置时,k=a(10000)2=a16

  所以每次k=k*k%c,k的变化是:k=a(1)2%c,k=a(10)2%c,k=a(100)2 %c,……

#include
int main(){ int a,b,c,k,ans; scanf("%d%d%d",&a,&b,&c); ans=1; k=a; while(b){ if(b&1)//b的二进制的最后一位为1 ans=ans*k%c; k=k*k%c; b=b>>1;//b的二进制去掉最后一位 } printf("%d",ans); return 0;}

 

  

 

转载地址:http://zmtym.baihongyu.com/

你可能感兴趣的文章
Apache Shiro 使用手册
查看>>
CentOS mini 6.5 安装DB2 Express-C 问题处理记录
查看>>
DirectByteBuffer
查看>>
Docker Compose文件详解 V2
查看>>
Memcached的原理与应用(未完)
查看>>
基于 Confluence 6 数据中心的 SAML 单点登录设置你的身份提供者
查看>>
mysql总结
查看>>
Navicat for MySQL版本更新至v11.2.12,修复多项问题|附下载
查看>>
整理 JAVA中的IO流 (字符流和字节流两个大类)
查看>>
uefi与win8 (根据网络资料整理)
查看>>
Eclipse优化
查看>>
Log4j tutorial with Tomcat examples
查看>>
Kong 网关
查看>>
三层结构视频中的DBHelper.cs
查看>>
[转载] 信息系统项目管理师视频教程——18 项目沟通管理
查看>>
在Windows下建立QT开发环境
查看>>
Jedis、JedisPool、ShardedJedis和ShardedJedisPool,java对redis的基本操作
查看>>
[转载] 致命伴侣
查看>>
HTML5 localStorage本地存储实际应用举例
查看>>
Scala访问修饰符
查看>>