所谓的经典平方就是利用经典乘法的那套思想为基础,再结合ai×aj+aj×ai=2ai×aj来简化运算:
。 …………(1.7)
即用字与字的平方做ai2,用字与字的乘法做ai×aj(i≠j)。
经典平方的函数为:
───────────────────────────────────────
void bn_sqr_normal(BN_ULONG *r, const BN_ULONG *a, int n, BN_ULONG *tmp)
功能: 经典平方算法
输入: a,n【a的字长】,tmp【临时变量】
输出:
返回: -
出处: bn_sqr.c
───────────────────────────────────────
说明:
(1)、(1.7)式的第二个求和项直接用函数void bn_sqr_words(BN_ULONG *r, const BN_ULONG *a, int n)可以实现。而第一个求和项,可以用经典乘法的思想将之分割成a×a0和a×ai(i≠0),分别调用函数BN_ULONG bn_mul_words(BN_ULONG *rp, const BN_ULONG *ap, int num, BN_ULONG w)和BN_ULONG bn_mul_add_words (BN_ULONG *rp, const BN_ULONG *ap, int num, BN_ULONG w)实现。
(2)、平方的基础是字的平方ai2,用宏定义#define sqr64(BN_ULONG lo, BN_ULONG ho, BN_ULONG in)来实现。即:
…………(1.8)
关于这些函数与宏定义的关系请参见§1.2.6。