分数大

Eta*_*tan 5 c++ biginteger division

我需要一些可以处理大整数(128位)的除法算法.我已经问过如何通过位移操作符来做到这一点.但是,我目前的实施似乎要求更好的方法

基本上,我将数字存储为long long unsigned int格式中的两个

A * 2 ^ 64 + BB < 2 ^ 64.

这个数字可以被整除24,我想将它除以24.

我目前的做法是改变它

A * 2 ^ 64 + B     A             B
--------------  = ---- * 2^64 + ----
      24           24            24

           A               A mod 24                    B         B mod 24
= floor( ---- ) * 2^64 +  ---------- * 2^64 + floor( ---- ) +   ----------
           24               24.0                      24           24.0
Run Code Online (Sandbox Code Playgroud)

然而,这是错误的.

(需要注意的是地板A / 24,并且modA % 24该部门正常存储在long double,整数被存储在long long unsigned int.

因为24等于11000二进制,所以第二个加数不应该在第四个加数的范围内改变,因为它向左移位64位.

因此,如果A * 2 ^ 64 + B可以被24整除,而B不可以,则很容易显示它是错误的,因为它返回一些非整数.

我的实施中有什么错误?

int*_*jay 13

我能想到的最简单的方法是将128位数字视为四个32位数字:

A_B_C_D = A*2^96 + B*2^64 + C*2^32 + D
Run Code Online (Sandbox Code Playgroud)

然后做24分的长分:

E = A/24 (with remainder Q)
F = Q_B/24 (with remainder R)
G = R_C/24 (with remainder S)
H = S_D/24 (with remainder T)
Run Code Online (Sandbox Code Playgroud)

X_Y表示X*2^32 + Y.然后答案是E_F_G_H剩下的T.在任何时候你只需要划分64位数字,所以这应该仅适用于整数运算.

  • 实际上,F,G和H将小于2 ^ 32,因为Q,R和S都小于24.因此E_F_G_H表示法*是*连接. (2认同)