在RSA中,加、解密过程都是要求某个整数的整数次幂后再取模。大多时候,这两个整数都会比较大,这时候直接按含义来进行计算时获得的中间结果会超出计算机所容许的整数取值范围(例如计算\(66^{77}\),这仍是比较小的);另外一方面,咱们也要考虑计算的效率,如\(66^{77}\)直接按照定义计算的话须要作76次乘法,开销是至关大的。针对这两个问题,咱们就须要有一个好的算法来高效且准确地计算大整数的幂运算。python
针对第一个问题,即数值过大问题,能够考虑利用模运算的性质:算法
就能有效减少中间值。
针对第二个问题,能够利用指数的性质,对每一个部分的结果重复作平方运算,最低能够将运算次数减为\(log_2n\),如计算\(x^{16}\)时,能够按照以下方式进行:spa
只须要计算4次,比按照定义计算减小了3/4。code
快速指数算法整合了上面两种思想,算法描述以下:it
一般,在咱们计算\(a^mmodn\)时,先将m表示为二进制形式\(b_k,b_{k-1},...,b_0\),即class
所以,效率
代码简略实现:二进制
d = 1 for i in range(k+1): d = d*d%n if b[i] == '1': d = d*a%n
忽然想起来,今天林老师课上说咱们讲义上错误真的不少,但我相信以大家的能力都能纠正过来,呜呜呜,我哭辣,一下午就记住这一句话程序