粗略的说,两个大整数a、b做绝对值加法r=|a|+|b|就是从低字到高字分别做带进位的加法。具体说来就是:
───────────────────────────────────────
算法: 绝对值加法
step 1. 做低n个字的齐字加法,其中n=min(a的字长,b的字长),最终进位记为carry。
step 2. 将余下的高位字复制到r的相应字。
step 3. 如果carry不为零,则对应的字加上这个进位。
───────────────────────────────────────
step1中低n个字的齐字加法即:
由BN_ULONG bn_add_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, int n)函数实现,其中的n控制a、b的字长,它必须小于等于a、b的实际长度。
绝对值加法的函数为:
───────────────────────────────────────
int BN_uadd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b)
功能: 绝对值加法
输入: a,b
输出: r=|a|+|b|
返回: 1【正常】or 0【出错】
出处: bn_add.c
───────────────────────────────────────
两个大整数a、b做绝对值减法r=|a|-|b|就是从低字到高字分别做带借位的减法。为了保证正确性,要求|a| > |b|。
───────────────────────────────────────
算法: 绝对值减法
step 1. 做低n个字的齐字减法,其中n为b的字长,最终借位记为borrow。
step 2. 将a余下的高位字复制到r的相应字。
step 3. 如果borrow不为零,则对应的字减去这个进位。
───────────────────────────────────────
step1中低n个字的齐字减法即:
由BN_ULONG bn_sub_words(BN_ULONG *r, const BN_ULONG *a, const BN_ULONG *b, int n)函数实现,其中的n控制a、b的字长,它必须小于等于a、b的实际字长。
绝对值加法的函数为:
───────────────────────────────────────
int BN_usub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b)
功能: 绝对值减法
输入: a,b
输出: r=|a|-|b|
返回: 1【正常】or 0【出错】
出处: bn_add.c
───────────────────────────────────────