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}}, 我开始编写函数将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并添加数字的值.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |