comba平方就是将comba乘法和经典平方的思想结合在一起:
…………(1.9)
具体算法如下:(参见[3]算法4)
───────────────────────────────────────
算法: comba平方
step1: 。
step2: 对k从0到(2n-1),执行:
2.1) 对每一对,执行:
2.1.1) (uv)=ai×bj,
2.1.2) 如果(i < j),(uv)<<1,c2←带进位加法(c2,0),
2.1.3) c0←加法(c0,v),c1←带进位加法(c1,u),c2←带进位加法(c2,0)。
2.2) 。
step3: 。
step3: 返回r
───────────────────────────────────────
在步骤2中:当i=j时,做一个乘法(uv)=ai×bj和三个加法: c0←加法(c0,v),c1←带进位加法(c1,u),c2←带进位加法(c2,0),这可以用宏定义#define sqr_add_c (BN_ULONG a, int i, BN_ULONG c0, BN_ULONG c1, BN_ULONG c2) 实现,即
。 …………(1.10)
当i < j时,还要多做(uv)<<1和c2←带进位加法(c2,0),此时用#define sqr_add_c2 (BN_ULONG a, int i, int j, BN_ULONG c0, BN_ULONG c1, BN_ULONG c2) 实现,即
。 …………(1.11)
comba平方算法的函数为:
───────────────────────────────────────
void bn_sqr_comba8(BN_ULONG *r, const BN_ULONG *a)
功能: 8个字的comba平方
输入: a
输出:
返回: -
出处: bn_asm.c
备注: a实际长度超过8时,也仅仅将a的低8个字平方。
───────────────────────────────────────
说明:另外还有一个使用comba乘法思想的函数void bn_sqr_comba8(BN_ULONG *r, const BN_ULONG *a),它是做4个字的comba平方。
关于这些函数与宏定义的关系请参见下节§1.2.6。