OpenSSL密码库算法笔记——第1.2.2章 comba乘法

本文深入探讨了Comba乘法算法,这是一种高效的大数乘法运算方式,通过改变传统乘法的计算顺序来提高效率。文章详细介绍了算法的具体步骤,包括如何利用宏定义实现字与字的乘法和加法操作,以及函数bn_mul_comba8和bn_mul_comba4的应用场景。

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

comba乘法就是用另外一种顺序来做乘法:

                    …………(1.4)

即按照由低到高的顺序计算乘积r的每一个字。其具体算法如下:(参见[3]算法3

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

算法:    comba算法

step1:  c_{2} \leftarrow c_{1} \leftarrow c_{0}\leftarrow 0

step2:   对k从0到(m+n-1),执行:

               2.1) 对每一对,执行:

2.2.1)      uv)=ai×bj

2.2.2)      c0←加法(c0,v),c1←带进位加法(c1,u),c2←带进位加法(c2,0)。

               2.2)r_{k}\leftarrow c_{0},c_{0} \leftarrow c_{1}, c_{1} \leftarrow c_{2}, c_{2}\leftarrow 0

step3: r_{m+n+1}\leftarrow c_{0}  。

step3:   (r_{m+n+1},...,r_{1},r_{0})返回

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

其中的u、v、c0、c1、c2、ri都是32比特字,(u,v)表示u和v连接成的64比特数。

步骤2中的一个乘法(uv)=ai×bj和三个加法: c0←加法(c0,v),c1←带进位加法(c1,u),c2←带进位加法(c2,0),可以用宏定义#define mul_add_c(BN_ULONG a, BN_ULONG b, BN_ULONG c0, BN_ULONG c1, BN_ULONG c2) 实现,即

              …………(1.5)

comba乘法算法的函数为:

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

void bn_mul_comba8(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b)

功能:    8个字与8个字的comba乘法

输入:    a,b

输出:   r=(a[7],...,a[1],a[0])\times (b[7],...,b[1],b[0])

返回:    -

出处:    bn_asm.c

备注:    a、b实际长度超过8时,也仅仅将a、b的低8个字相乘。

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

说明:

(1)、另外还有一个使用comba乘法思想的函数void bn_mul_comba4(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b),它是做4个字与4个字的comba乘法。

(2)、和经典乘法一样,其根本就是做字与字的乘法aj×bi,这个同样用宏定义#define mul64 (BN_ULONG l, BN_ULONG h, BN_ULONG bl, BN_ULONG bh)来实现。请注意这里的参数lh前后代表的意思不一样:

                      …………(1.6)

关于这些函数与宏定义的关系请参见下节§1.2.3。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值