滑动窗口算法是在修改过的窗口算法的基础上演进而来的。在修改过的窗口算法中每次处理的e的长度都是固定的——k比特,但是在滑动窗口算法中,每次处理的e的长度是不尽相同的——处理长度会小于k比特。
现在来看看滑动窗口算法是怎么回事。同样记窗口大小为k,指数e的二进制展开为。
预计算这部分和修改过的窗口算法一模一样,就不再多说了。重点来看看后面的迭代。在滑动窗口算法中,对二进制展开的指数e从左到右进行处理,但在窗口算法中是做2k进制展开。
滑动窗口算法从当前ei开始,寻找一个长度不超过k的比特串(而窗口算法每次都是处理k位长的比特串),保证该比特串一前一后的比特都是1,然后按照(未做修改的)窗口算法的思想来处理。如果当前ei=0,则转成做一次平方。
由于每次处理的窗口大小都是在变化的,所以这个算法叫滑动窗口算法,以区别于前面的(固定)窗口算法。
下面给出该算法的描述。
───────────────────────────────────────
───────────────────────────────────────
为了便于理解,还是以前面计算过的,k=3为例看看滑动窗口算法。
Step1:预计算g1、g2、g3、g5、g7;
Step2:初始化A: A ← 1;i ← 7;
Step3:迭代过程如下:
表4.5
i | 比特串 | A的迭代 |
7 | (1,0,1) | A←A8×g5 =g5 |
4 | 0 | A←A2 =g10 |
3 | 0 | A←A2 =g20 |
0 | (1,0,1) | A←A8×g5 =g165 |
后面给出的C程序都是以这个滑动窗口算法来实现的。