加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 实施BigInteger

发布时间:2020-12-16 07:08:03 所属栏目:百科 来源:网络整理
导读:我需要在C中实现1024位数学运算.I实现了一个简单的BigInteger库,其中整数存储为数组“typedef INT UINT1024 [400]”,其中每个元素代表一个数字.它变得如此之慢,所以我决定使用UINT64的1024位数组来实现BigInteger:“typedef UINT64 UINT1024 [16]” 例如,数
我需要在C中实现1024位数学运算.I实现了一个简单的BigInteger库,其中整数存储为数组“typedef INT UINT1024 [400]”,其中每个元素代表一个数字.它变得如此之慢,所以我决定使用UINT64的1024位数组来实现BigInteger:“typedef UINT64 UINT1024 [16]”

例如,数字:1000表示为{0,1,1}},
18446744073709551615为{0,0xFFFFFFFFFFFFFFFF}和18446744073709551616为{0,0}.

我开始编写函数将char数组编号转换为UINT1024,将UINT1024转换为char数组,它使用数字< = 0xFFFFFFFFFFFFFFFF.
这是我做的:

void UINT1024_FROMSTRING(UIN1024 Integer,const char szInteger[],UINT Length) {
int c = 15;
UINT64 Result = 0,Operation,Carry = 0;
UINT64 Temp = 1;
while(Length--)
{
    Operation = (szInteger[Length] - '0') * Temp;
    Result   += Operation + Carry;
   /*Overflow ?*/
    if (Result < Operation || Temp == 1000000000000000000)
    {
        Carry  = Result - Operation;
        Result = 0;
        Integer[c--] = 0;
        Temp = 1;
    }
    else Carry = 0;

    Temp *= 10;
}

if (Result || Carry)
{
    /* I DONT KNOW WHAT TO DO HERE ! */
}

while(c--) Integer[c] = 0;}

那么请问我该如何实现它,是否可以使用UINT64实现它的速度,或者只是坚持每个数组元素是一个数字的数字,这对1024bit操作来说非常慢.

PS:我不能使用任何现有的库!

提前致谢 !

更新
仍然无法弄清楚如何进行乘法运算.我正在使用这个功能:

void _uint128_mul(UINT64 u,UINT64 v,UINT64 * ui64Hi,UINT64 * ui64Lo)
{
   UINT64 ulo,uhi,vlo,vhi,k,t;
   UINT64 wlo,whi,wt;
   uhi = u >> 32;
   ulo = u & 0xFFFFFFFF;
   vhi = v >> 32;
   vlo = v & 0xFFFFFFFF;
   t = ulo*vlo;    wlo = t & 0xFFFFFFFF;
   k = t >> 32;
   t = uhi*vlo + k;
   whi = t & 0xFFFFFFFF;
   wt = t >> 32;

   t = ulo*vhi + whi;
   k = t >> 32;
   *ui64Lo = (t << 32) + wlo;
   *ui64Hi = uhi*vhi + wt + k;
}

然后

void multiply(uint1024_t dUInteger,uint1024_t UInteger)
{
    int i = 16;
    UINT64 lo,hi,Carry = 0;

        while(i--)
        {
            _uint128_mul(dUInteger[i],UInteger[15],&hi,&lo);
            dUInteger[i] = lo + Carry;
            Carry = hi;
        }
}

我真的需要一些帮助,并提前致谢!

解决方法

您需要为UINT1024类实现两个函数,乘以整数并添加整数.然后,对于您转换的每个数字,将前一个值乘以10并添加数字的值.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读