• 第二十四个知识点:描述一个二进制m组的滑动窗口指数算法


    第二十四个知识点:描述一个二进制m组的滑动窗口指数算法

    简单回顾一下我们知道的。

    大量的密码学算法的大数是基于指数问题的安全性,例如RSA或者DH算法。因此,现代密码学需要大指数模幂算法的有效实现。我们应该从一个简化的方案开始思考:计算(x^amod N),我们可以用指数算法来求(x^a),然后再约减到(N)。然而,对大多数密码算法来说,(x^a)都是非常大的。现在,大多数传统的方法能被简单的在每个阶段模(N)。这回产生一些改进的技术。下面我会介绍一些计算(X^E mod N)可能的方法。

    二进制算法

    二进制模幂算法和传统的求幂的二次方方法非常像。实际上,唯一的不同就是我们把(N)表示成二进制形式然后计算。我们从左向右计算或者从右向左计算。

    m-ary

    m-ary方法也相似,但是它把指数看成位序列,然后把它们堪称(M = 2^m)的元素。实际上,二进制方法被认为是一种m-ary方法在(M = 2)时刻的情况。那么它如何工作呢?首先我们对所有的(X^i),其中(i = 1)(2^m-1),计算一个查找表。然后我们通过基于(M)的指数(E)的算法。然后我们每次计算的值只是才表中查找而不是移动m位。

    这个方法和二进制算法进行比较,意味着我们能提前计算很多东西,然后做更少的乘法。

    滑动窗口

    因此,m-ary窗口会约减我们计算乘法的次数,但是我们可以做的更好吗?答案是对的。假设我们令(m = 4),同时(E = 22 = (0,0,0,1,0,1,1,0)_2 = (1,6)_{2^4})。然后我们用4-ary算法,但是如果我们重新规定窗口大小的话,我们能做的更好:这里只有三个1,但是我们却用一个4-ary的算法。如果我们提前知道,我们就可以用我们的查找表来计算了,同时只需要一次查找。因此滑动窗口的话,我们首先对(E)做一个变换成(E = sum x_i2^i)。这里让(x_i)尽可能是0。这回导致更多的预先运算,但是同时也提升了具体运算的效率。

    参考

    https://zh.wikipedia.org/wiki/平方求幂

  • 相关阅读:
    ABP框架系列之六:(Value-Objects-值对象)
    ElementUI如何展开指定Tree树节点
    JS如何将变量作为一个对象的Key
    分布式追踪系统架构与设计
    11.浅聊几种主流Docker网络的实现原理
    Python连接MongoDB数据库并执行操作
    1.ZooKeeper ACL权限控制
    Pika 连接 rabbitmq 集群
    js for等循环 跳出多层循环
    Django ForeignKey不需要参照完整性?
  • 原文地址:https://www.cnblogs.com/zhuowangy2k/p/12245536.html
Copyright © 2020-2023  润新知