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

本文详细介绍了如何使用Knuth给出的逼近方法计算大整数的除法,包括标准化、初始化、计算、修正等步骤,展示了算法的具体实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先考虑简单的除法——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 除法步骤图

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值