comba乘法就是用另外一种顺序来做乘法:
即按照由低到高的顺序计算乘积r的每一个字。其具体算法如下:(参见[3]算法3)
───────────────────────────────────────
算法: comba算法
step1: 。
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)。
step3: 。
step3: 返回
───────────────────────────────────────
其中的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
输出:
返回: -
出处: 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)来实现。请注意这里的参数l和h前后代表的意思不一样:
…………(1.6)
关于这些函数与宏定义的关系请参见下节§1.2.3。