我正在尝试在C中的有限字段(p = 2 ^ 191-19)上实现多精度无符号减法,但是我不知道如何处理借位!
我的操作数在radix-2 ^ 16中表示为:

typedef unsigned long long T[12];


这意味着T型数组的每个元素都具有准确的16位数据(基数为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评估,因为它可能只是01。因此,您应将下溢视为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 - C语言中的多精度无符号减法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43023202/

10-11 22:05