首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C中的多精度无符号减法

C中的多精度无符号减法
EN

Stack Overflow用户
提问于 2017-03-25 23:35:58
回答 1查看 416关注 0票数 3

我试图在有限域(p=2^191-19)上实现多精度无符号减法(p=2^191-19),但我不知道如何处理借入位!我的操作数用基-2^16表示为:

代码语言:javascript
复制
typedef unsigned long long T[12];

这意味着T型数组的每个元素都有精确的16位数据(基-2^16表示)。现在我想减去两个T型的操作数,但是我不知道哪一个更小!如果结果为负数,我希望将结果加到素数中,以便在模算法中得到正的结果。以下是基于图书页-30(多精度减法算法)的实现:

代码语言:javascript
复制
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;
    }
}

但我得到了错误的答案!

代码语言:javascript
复制
My inputs:
a =0x2d7e33e5bba0f6bb87ce04b28e940662db8f3f81aaf94576
b =0x28afc585dca4a8003b081f7289de11c2d229d5a967081f72
Myresult=0x4d16e62defd4ebc4cc8e54104b7f4a0096769d843f12604
Crresult=0x4ce6e5fdefc4ebb4cc5e54004b5f4a0096569d843f12604
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-26 00:27:57

您应该修复borrow计算,因为它可能只是01。所以你应该把borrow看成是1

代码语言:javascript
复制
borrow = (r[i] >> 16) != 0;

此外,我还会用更一般的形式重写函数,因为我们可能会把第一关当作没有借来的东西:

代码语言:javascript
复制
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;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43023202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档