zoukankan      html  css  js  c++  java
  • 快速指数算法

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

    问题简介

    在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 = sumlimits_{b_i=1}2^i ]

    因此,

    [a^m = a^{sumlimits_{b_i=1}2^i} = prodlimits_{b_i=1}a^{2^i} ]

    [a^mmodn = [prodlimits_{b_i=1}a^{2^i}]modn = prodlimits_{b_i=1}[a^{2^i}modn] ]

    代码简略实现:

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

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

  • 相关阅读:
    element ui 表单清空
    element ui 覆盖样式 方法
    element ui 修改表单值 提交无效
    element ui 抽屉里的表单输入框无法修改值
    element ui 抽屉首次显示 闪烁
    css 左侧高度 跟随右侧内容高度 自适应
    PICNUF框架
    elementui 抽屉组件标题 出现黑色边框
    vue 子组件跨多层调用父组件中方法
    vue 编辑table 数据 未点击提交,table里的数据就发生了改变(深拷贝处理)
  • 原文地址:https://www.cnblogs.com/chuaner/p/12019791.html
Copyright © 2011-2022 走看看