C 中的多精度无符号减法
multiprecision unsigned subtraction in C
我正在尝试在 C 中的有限域 (p=2^191-19) 上实现多精度无符号减法,但我不知道如何处理借位!
我的操作数以 radix-2^16 表示为:
typedef unsigned long long T[12];
表示T型数组的每个元素恰好有16位数据(radix-2^16表示)。
现在想把两个T类型的操作数相减,不知道哪个小!如果结果为负,我想将结果与质数相加,以便在模运算中得到正结果。
这是我基于 this 书第 30 页(多精度减法算法)的实现:
void bigint192_sub(T r, const T a, const T b){
int i;
int borrow;
r[0] = a[0] - b[0];
borrow = r[0] >> 16;
r[0] &= 0xFFFF;
for(i=1;i<12;++i){
r[i] = a[i] - b[i] - borrow;
borrow = r[i] >> 16;
r[i] &= 0xFFFF;
}
}
但我答错了!
My inputs:
a =0x2d7e33e5bba0f6bb87ce04b28e940662db8f3f81aaf94576
b =0x28afc585dca4a8003b081f7289de11c2d229d5a967081f72
Myresult=0x4d16e62defd4ebc4cc8e54104b7f4a0096769d843f12604
Crresult=0x4ce6e5fdefc4ebb4cc5e54004b5f4a0096569d843f12604
您应该修复 borrow
评估,因为它可能只有 0
或 1
。所以你应该将下溢视为 borrow
等于 1
:
borrow = (r[i] >> 16) != 0;
此外,我会以更通用的形式重写函数,因为我们可能会将第一遍视为没有借用:
void bigint192_sub(T r, const T a, const T b){
int i;
int borrow;
for (borrow = 0, i = 0; i < 12; ++i) {
r[i] = a[i] - b[i] - borrow;
borrow = (r[i] >> 16) != 0;
r[i] &= 0xFFFF;
}
}
我正在尝试在 C 中的有限域 (p=2^191-19) 上实现多精度无符号减法,但我不知道如何处理借位! 我的操作数以 radix-2^16 表示为:
typedef unsigned long long T[12];
表示T型数组的每个元素恰好有16位数据(radix-2^16表示)。 现在想把两个T类型的操作数相减,不知道哪个小!如果结果为负,我想将结果与质数相加,以便在模运算中得到正结果。 这是我基于 this 书第 30 页(多精度减法算法)的实现:
void bigint192_sub(T r, const T a, const T b){
int i;
int borrow;
r[0] = a[0] - b[0];
borrow = r[0] >> 16;
r[0] &= 0xFFFF;
for(i=1;i<12;++i){
r[i] = a[i] - b[i] - borrow;
borrow = r[i] >> 16;
r[i] &= 0xFFFF;
}
}
但我答错了!
My inputs:
a =0x2d7e33e5bba0f6bb87ce04b28e940662db8f3f81aaf94576
b =0x28afc585dca4a8003b081f7289de11c2d229d5a967081f72
Myresult=0x4d16e62defd4ebc4cc8e54104b7f4a0096769d843f12604
Crresult=0x4ce6e5fdefc4ebb4cc5e54004b5f4a0096569d843f12604
您应该修复 borrow
评估,因为它可能只有 0
或 1
。所以你应该将下溢视为 borrow
等于 1
:
borrow = (r[i] >> 16) != 0;
此外,我会以更通用的形式重写函数,因为我们可能会将第一遍视为没有借用:
void bigint192_sub(T r, const T a, const T b){
int i;
int borrow;
for (borrow = 0, i = 0; i < 12; ++i) {
r[i] = a[i] - b[i] - borrow;
borrow = (r[i] >> 16) != 0;
r[i] &= 0xFFFF;
}
}