Algorithm 从10^x到2^x的大整数基/基转换 前言

Algorithm 从10^x到2^x的大整数基/基转换 前言,algorithm,math,gmp,bigint,Algorithm,Math,Gmp,Bigint,我通过编写和完善自己的BigInt库来学习计算机数学。到目前为止,我的第一次化身将以10为基数的数字的每一位存储在向量的连续元素中。它可以以任意精度进行乘法和加法。我想通过使用标准C++数据类型中的所有可用空间来加速它,转换为基2×x/< 问询处 我在STATIN中读取1000或10个以上的数字,我希望把它们转换成基2 ^ x,这样我就可以很容易地把它们存储在一个标准的C++数据类型的数组或向量中,可能是无符号int。我只有一个想法来做基数转换,用余数法重复划分。下面是一些C++代码描述该方法:

我通过编写和完善自己的BigInt库来学习计算机数学。到目前为止,我的第一次化身将以10为基数的数字的每一位存储在向量的连续元素中。它可以以任意精度进行乘法和加法。我想通过使用标准C++数据类型中的所有可用空间来加速它,转换为基2×x/< 问询处

我在STATIN中读取1000或10个以上的数字,我希望把它们转换成基2 ^ x,这样我就可以很容易地把它们存储在一个标准的C++数据类型的数组或向量中,可能是无符号int。我只有一个想法来做基数转换,用余数法重复划分。下面是一些C++代码描述该方法:

vector<int> digits;
while(num!=0) {
   int mod = num%base;
   num = num/base;
   digits.push_back(mod);
}
矢量数字;
while(num!=0){
int mod=num%基数;
num=num/基;
数字。推回(mod);
}
难题 有些事情我搞不清楚了,是否用余数除法是对大整数进行基数转换的正确方法。我试着看看GMP库是如何做到这一点的。是发生“魔法”的相关c源文件,但我不确定其中发生了什么。Matt McCutchen的似乎使用了带余数的重复除法。如果我使用这个方法,我基本上需要编写两个版本的BigInt类,一个用于Base10,另一个用于Base2^x

结论
  • 提供有关将大量数字从字符串转换为32位字数组的正确步骤的建议
  • 请帮助我了解GMP如何将字符串转换为32位单词数组,而无需涉过许多抽象层
使用4位字长的示例 我们要储存的数量(显然是小尺寸):123456789

无符号字符的范围为0-255,如果要将数字拆分并存储在向量中,可以采用以下三种方法之一:

  • 以10为基数,我们的向量如下:[1,2,3,4,5,6,7,8,9]
    • 这就是我的向量在第一个实现中的样子
  • 以100为基数,我们的向量如下:[1,23,45,67,89]
    • 易于从基数10转换为基数100,具有ciel(基数10/2中的数字)元素
  • 作为基数256,我们的向量如下:[7,91205,21]

显然,对于内部表示,第三种解决方案是最理想的,这正是我试图解决的问题。

一旦您有了适用于bigint库的乘法和加法函数,将字符串转换为bigint本身就是简单的。以零的转换结果开始。对于您处理的每个数字(从左到右),将之前的结果乘以10,然后将新数字的值相加(使用bigint乘法和加法函数)。

通常,要将一个基数转换为另一个基数(从最高有效位数转换为最低有效位数),算法如下所示:

output = 0
foreach digit in digits:
    output = output * base + digit
按照相反的顺序,它如下所示:

output = 0
multiplier = 1
foreach digit in digits:
    output = output + multiplier * digit
    multiplier = multiplier * base

您可以使用这个数学递归地使用bigint库来找出如何存储数字。我的意思是,你需要实现BigInt*BigInt和BigInt+BigInt,这就是你转换基的方法。这不是最有效的方法,但它比除法快得多。

FryGuy的帖子中没有提到的一件事是,在这种方法中,算术必须在将转换为的基数中执行,而用作乘数的基数与原始数字的基数相同;您不再需要的基础或您正在转换的基础

整数的基数转换有两个公式。(1) 使用基数B(我们正在将其转换为
(目标基数))作为重复除数,并与在基数B中执行的算术相结合,其中B是从
转换为的基数。(2) 另一方面,使用基数b作为我们正在转换的数字的乘法器,这些数字恰好位于同一个基数b中,并且在基数b中进行算术运算

(1) 公式使用B作为参数,并以B为基数进行运算

(2) 公式使用b作为参数,并以b为基数进行运算


这是knuth,vol 2,4.4的基数转换

有没有可能把字符串到bigint的转换和bigint到字符串的转换混淆了?@MarkRansom-没有,我试图读入一个字符串并将其存储为bigint。bigint类最好存储较大的块,而不是较小的块。与其从10降到2,不如升到2^31-1或其他什么。C接口与实现这本书有一个完整的工作过的bigint库,详细解释过。这不是一本很棒的书(没关系,只是不例外),但听起来它对您来说非常适合。尽管应该注意,将BigInt转换为整数几乎是BigInt库必须实现的最复杂的函数;)这个答案没有抓住问题的要害。如果我读入1234的每个数字并将其存储在向量中,它看起来像[1,2,3,4]。我希望能够使用这些单独的char元素的全部范围。1234可以表示为两个字符元素[4210]。4*(256^1) + 210*(256^0) = 1234@Dezzimal:对于您读取的每个数字,将x乘以10,然后将该数字与x相加(x是您的基本256变量)。对于“1000”,x的进展是这样的:[0]、[1]、[10]、[100]、[3232]。我也错过了这个答案的简单性,@Tom启发我。高中数学,各位=)还记得小学的1、10和100栏=)非常好而且清晰的答案,尽管如此,一些进一步的信息:一些基b的算术模可以用同一本书中提到的著名算法来实现