Math 如何有效地将基数为2的大整数转换为基数为10的表示形式?

Math 如何有效地将基数为2的大整数转换为基数为10的表示形式?,math,Math,我已经玩了几个月大整数算法(2+)了,并且已经探索了很多实现它的方法和想法。我有基于字符串的实现的工作版本(效率很低),基本1e9和1e18(效率更高,但仍然有点浪费),以及基于模块化算术的实现。目前,我正在构思一个新的想法。(注意:对于处理大整数来说,这可能不是一个“新的”完全不同的想法,但因为我自己一直在探索这个概念,所以对我来说它似乎是新的。我从来没有看过Boost Multiprecision库、GNU GMP或任何其他库中的实现,我自己也提出了大多数算法) 新想法:我将大整数表示为32

我已经玩了几个月大整数算法(2+)了,并且已经探索了很多实现它的方法和想法。我有基于字符串的实现的工作版本(效率很低),基本1e9和1e18(效率更高,但仍然有点浪费),以及基于模块化算术的实现。目前,我正在构思一个新的想法。(注意:对于处理大整数来说,这可能不是一个“新的”完全不同的想法,但因为我自己一直在探索这个概念,所以对我来说它似乎是新的。我从来没有看过Boost Multiprecision库、GNU GMP或任何其他库中的实现,我自己也提出了大多数算法)

新想法:我将大整数表示为32位插槽中的基数2。表示法包括2的补码法

(基数10)
100
=(基数2)
0000000000000000000000001100100

(基数10)
100000000000000
=(基数2)
0000000000 10001110000110110110110111100000100000000000000

…等等,更大的数字

这种表示法在空间损失方面非常有效,在base 2中实现算法要容易得多。我面临的唯一问题是从一个巨大的基数2大整数到基数10的转换。目前,我使用我的base 1e9大整数实现来进行转换。然而,这是非常低效的,并导致算法速度和高内存成本之间的权衡。我不希望存在这种权衡。为什么每次我需要显示一个整数时都要处理这么高的内存开销,就像每次我需要这样做时,我都要运行base 1e9来计算和求2的纯幂


到目前为止,我还不能凭直觉想出一个聪明的转换方法,我想就如何继续提供一些建议。有没有有效的方法?能否仅通过查看设定位来创建基数10表示法?

看看Brent和Zimmerman的“现代计算机算术”。它们有一节描述二次时间和次二次时基转换算法。这里有PDF:@MarkDickinson我觉得这个PDF非常有趣。在过去的两个小时里我一直在读这本书,这本书会让我在接下来的几天里着迷。我可能最终会鼓起勇气去理解FFT,而不会像往常一样被它背后的数学知识吓倒。即使我还没有达到你提到的那一部分,我觉得我会对我正在寻找的东西感到惊讶。谢谢你的链接!我会在完成阅读后回复,如果我找到了我要找的东西,我会告诉你。你写的数字有多大?基于FFT的方法只适用于非常大的数字。有关更多信息,请参见:特别注意其中基于NTT的内容。然而,对于不太多的数字,通常是不太先进的方法,请参阅和@Spektre-Hey!谢谢你的加入!有朝一日,我想将任意多精度库作为一个项目来实现。关于我想用这样一个库做的事情,我脑子里有很多想法,我想用的数字可能会很快变得很大(我也需要很高的精度)。我还没有理解傅里叶变换背后的所有数学知识和实现方法,但我有很多时间(我想)在手学习。是的,FFT只在处理非常大的数字时才有用。谢谢你的链接!当我没有作业时,我一定要看一看。@Spektre你可能想建议我使用一个预先存在的库来阅读我以前的评论,但这是我从第一次学习编程和内置整数类型(C/C++)的局限性开始就想到的一个项目,我真的希望这个项目能看到曙光。因此,除非我为自己重新发明轮子,否则我将无法驾驶我的车:)