
快速指数算法
发布日期:2021-05-09 01:25:57
浏览次数:10
分类:博客文章
本文共 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
突然想起来,今天林老师课上说我们讲义上错误真的很多,但我相信以你们的能力都能纠正过来,呜呜呜,我哭辣,一下午就记住这一句话
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2025年04月02日 00时49分27秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
1045 Favorite Color Stripe
2021-05-09
B. Spreadsheets(进制转换,数学)
2021-05-09
等和的分隔子集(DP)
2021-05-09
基础练习 十六进制转八进制(模拟)
2021-05-09
L - Large Division (大数, 同余)
2021-05-09
39. Combination Sum
2021-05-09
41. First Missing Positive
2021-05-09
80. Remove Duplicates from Sorted Array II
2021-05-09
83. Remove Duplicates from Sorted List
2021-05-09
410. Split Array Largest Sum
2021-05-09
开源项目在闲鱼、b 站上被倒卖?这是什么骚操作?
2021-05-09
Vue3发布半年我不学,摸鱼爽歪歪,哎~就是玩儿
2021-05-09
《实战java高并发程序设计》源码整理及读书笔记
2021-05-09
Java开源博客My-Blog(SpringBoot+Docker)系列文章
2021-05-09
程序员视角:鹿晗公布恋情是如何把微博搞炸的?
2021-05-09
【JavaScript】动态原型模式创建对象 ||为何不能用字面量创建原型对象?
2021-05-09
Linux应用-线程操作
2021-05-09
多态体验,和探索爷爷类指针的多态性
2021-05-09