博客
关于我
快速指数算法
阅读量:414 次
发布时间:2019-03-06

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

出问题了,程序好像错了,这两天考试,考完试改

问题简介

在RSA中,加、解密过程都是要求某个整数的整数次幂后再取模。大多时候,这两个整数都会比较大,这时候直接按含义来进行计算时得到的中间结果会超出计算机所允许的整数取值范围(例如计算\(66^{77}\),这还是比较小的);另一方面,我们也要考虑计算的效率,如\(66^{77}\)直接按照定义计算的话需要做76次乘法,开销是相当大的。针对这两个问题,我们就需要有一个好的算法来高效且准确地计算大整数的幂运算。

初步思路

针对第一个问题,即数值过大问题,可以考虑利用模运算的性质:

\[(a*b)(mod n) = [(a (mod n))*(b (mod n))](mod n)\]

就能有效减小中间值。

针对第二个问题,可以利用指数的性质,对每个部分的结果重复做平方运算,最低可以将运算次数减为\(log_2n\),如计算\(x^{16}\)时,可以按照如下方式进行:

\[x^2,x^4,x^8,x^{16}\]

只需要计算4次,比按照定义计算减少了3/4。

快速指数算法

快速指数算法整合了上面两种思想,算法描述如下:

通常,在我们计算\(a^mmodn\)时,先将m表示为二进制形式\(b_k,b_{k-1},...,b_0\),即

\[m = \sum\limits_{b_i=1}2^i\]

因此,

\[a^m = a^{\sum\limits_{b_i=1}2^i} = \prod\limits_{b_i=1}a^{2^i}\]

\[a^mmodn = [\prod\limits_{b_i=1}a^{2^i}]modn = \prod\limits_{b_i=1}[a^{2^i}modn]\]

代码简略实现:

d = 1for i in range(k+1):    d = d*d%n    if b[i] == '1':        d = d*a%n

突然想起来,今天林老师课上说我们讲义上错误真的很多,但我相信以你们的能力都能纠正过来,呜呜呜,我哭辣,一下午就记住这一句话

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

你可能感兴趣的文章
netlink2.6.32内核实现源码
查看>>
Netpas:不一样的SD-WAN+ 保障网络通讯品质
查看>>
NetScaler的常用配置
查看>>
netsh advfirewall
查看>>
NETSH WINSOCK RESET这条命令的含义和作用?
查看>>
Netstat端口占用情况
查看>>
Netty WebSocket客户端
查看>>
netty 主要组件+黏包半包+rpc框架+源码透析
查看>>
Netty 异步任务调度与异步线程池
查看>>
Netty中集成Protobuf实现Java对象数据传递
查看>>
netty之 定长数据流处理数据粘包问题
查看>>
Netty事件注册机制深入解析
查看>>
Netty入门使用
查看>>
Netty原理分析及实战(三)-高可用服务端搭建
查看>>
Netty原理分析及实战(四)-客户端与服务端双向通信
查看>>
Netty发送JSON格式字符串数据
查看>>
Netty和Tomcat的区别已经性能对比
查看>>
Netty基础—1.网络编程基础二
查看>>
Netty基础—3.基础网络协议二
查看>>
Netty基础—7.Netty实现消息推送服务一
查看>>