OpenSSL密码库算法笔记——第1.3.1章 除法算法思想

首先考虑简单的除法——n+1个字除以n个字得到的商是一个字。

给定非负整数u=(u_{n},...,u_{1},u_{0})v=(v_{n-1},...,v_{1},v_{0}),不妨假设u/v<B,商q=\left \lfloor u/v \right \rfloor应该怎样计算呢?Knuth给出了q的一个逼近(参见[2],§4.3.1):

                   …………(1.12)

如果

,                                   …………(1.13)

则Knuth给出的逼近值与真实值之间不会相差太多(参见[2],§4.3.1,定理A和定理B):

                                  …………(1.14)

也就是说这个逼近值的确非常接近真实商。

有了这个结果就可以考虑一般的除法了。

对给定的非负整数和,利用除法计算商和余数的算法如下(参见[2],§4.3.1,算法D):

───────────────────────────────────────

算法:    除法

1. [标准化]。让d为2的某个方幂,使得v×d满足(1.13)式。然后更新u、v:

1.1)        

1.2)        

2. [初始化j]。让j=m。

3. [计算\hat{q}]。让,让为对应的余数。测试条件\hat{q}=B\hat{q} v_{n-2}>B\hat{r}+u_{j+n-2}是否成立。如果成立,执行:

3.1)        \hat{q}\leftarrow \hat{q} - 1\hat{r}\leftarrow \hat{r} + v_{n-1}

3.2)         如果\hat{r}<B,重复以上测试。

4. [乘与减]。

5. [测试余数]。令q_{j}\leftarrow \hat{q}。如果step4做减法的结果为负,则进入step6;否则跳转step7。

6. [修正]。让q_{j}\leftarrow q_{j}-1

 

7. [j循环]。j\leftarrow j-1。如果j\geqslant 0,跳转step3;否则跳转step8。

8. [去标准化]。返回商

返回余数

───────────────────────────────────────

 

除法的过程可以参见下图:

图1.5 除法步骤图

 

猜你喜欢

转载自blog.csdn.net/samsho2/article/details/85842171