使用一个大的基数2 ^ 64的数组的递归除法

时间:2011-11-14 05:39:28

标签: biginteger

我需要能够划分两个大整数A和B并得到一个结果商Q和余数R.我发现了很多关于“只是在小学里做分工”的帖子但是看不出这是怎么回事适用于这种情况,其中基数为2 ^ 64。

例如,假设我的数字A由a_2 = 120,a_1 = 2和a_0 = 240组成,其中a_2对应于2 ^(64 * 2),a_1到2 ^(64 * 1)等我希望将它除以B,b_1 = 1300,b_0等于3.

我将如何做到这一点?

由于

1 个答案:

答案 0 :(得分:0)

Java BigInteger类有一个divideAndRemainder(BigInteger val)方法,它将(Q,R)作为数组返回。

示例:

BigInteger a=new BigInteger("2").pow("128").multiply("120").add(new BigInteger("2").pow("64").multiply("2")).add(new BigInteger("240"));
BigInteger b=new BigInteger("2").pow("64").multiply("1300").add(new BigInteger("3"));
BigInteger[] qr=a.divideAndRemainder(b);

虽然那不是相当你所要求的,是吗?

我没有做你所要求的,但我已经偷看了其他解决方案。无论你是否使用大数字,数学基本相同,所以为了学习这个技术,我建议你学习一个小的机器字大小,然后将知识应用到64位版本。这样可以更轻松地进行建模和验证。

如果我(现在)明白你在问什么,你可以有一系列4位数字(十六进制)和一个8位处理器,可以进行mod,div,add,multiply操作。你怎么把它分成几块来解决任意宽度的数字划分?

例如,您可以验证十进制,1441/3 = 480r1。在您的8位机器中,您需要(Q,R),等式(0x05a1 / 0x3)。您可以从左到右计算,取余数并将其应用到下一个数字的高阶nybble。因此,您计算0x5 / 0x3 = 1r2,然后0x2a / 0x3 = er0,然后0x01 / 0x3 = 0r1。结果中的序列“1e0”与您的预期值(0x1e0 = 480)匹配,最后的余数与您期望的1匹配。

外推到64位,您将使用相同的技术,但是以32位块的形式处理,这样您就可以将前一个余数放在单词的高位。