计算e到2万亿位数的最快方法是什么?

时间:2012-11-09 18:34:46

标签: c performance arbitrary-precision

我想计算 e 到2万亿(2,000,000,000,000)个数字。这大约是1.8 TiB的纯。我刚刚使用GMPcode can be found here)实现了泰勒系列扩展算法。

不幸的是,当我在计算机上总计超过4000个术语时崩溃了,可能是因为内存不足。

计算 e 的当前技术水平是什么?哪种算法最快?任何值得关注的开源实现?请不要提及 y-cruncher ,它是封闭源。

2 个答案:

答案 0 :(得分:62)

由于我是你提到的y-cruncher计划的作者,我将加2美分。

对于如此庞大的任务,必须解决的两大障碍如下:

  1. 内存
  2. 运行时复杂性
  3. <强>内存

    2万亿位是极端 - 至少可以说。这是current record set by Shigeru Kondo and myself back in 2010的两倍。 (使用y-cruncher计算1万亿个数字需要9天以上的时间。)

    在纯文本中,小数约为1.8 TiB。在压缩二进制表示中,即773 GiB。

    如果您要对这个数量的数字进行算术运算,那么每个操作数 773 GiB 不计算临时存储器。

    可以说,y-cruncher实际上需要 8.76 TiB的内存才能在ram中完成所有计算。因此,您可以期望其他实现需要相同的给出或最多采用2倍。

    那就是说,我怀疑你会有足够的公羊。即使你这样做,它也会是NUMA。所以另一种方法是使用磁盘。但这并非易事,为了提高效率,您需要将内存视为缓存并对内存和磁盘之间传输的所有数据进行微观管理。


    运行时复杂性

    这里我们有另一个问题。对于2万亿个数字,你需要一个非常快速的算法。不仅是任何快速算法,而且是准线性运行时算法。

    您当前的尝试大约在O(N^2)。因此,即使你有足够的记忆力,也不会在你的一生中完成。

    e计算为高精度的标准方法在O(N log(N)^2)中运行,并结合了以下算法:

    幸运的是,GMP已经使用了基于FFT的大型乘法。但它缺乏两个关键特征:

    1. 在内存不足时使用磁盘进行核外(交换)计算。
    2. 它没有并行化。
    3. 第二点并不重要,因为你可以等待更长时间。但是出于所有实际目的,你可能需要推出自己的产品。这就是我写y-cruncher时的所作所为。


      也就是说,还有许多其他松散的东西需要照顾:

      1. 最后一个部门需要像牛顿法这样的快速算法。
      2. 如果你要用二进制计算,你需要进行基数转换。
      3. 如果计算需要花费大量时间和大量资源,您可能需要实现容错来处理硬件故障。

答案 1 :(得分:7)

由于您的目标是您想要多少位数(2万亿),因此您可以估算计算e到该位数所需的术语数。由此,您可以估计需要跟踪的精确度的额外数字,以避免在2万亿分之一处出现舍入错误。

如果我根据斯特林的近似计算是正确的,那么10到2万亿的倒数大约是1000亿阶乘的倒数。这就是你需要多少个术语(1000亿)。不过,这个故事要好一点,因为在开始计算之前你会开始丢掉很多数字。

由于e被计算为反因子的总和,因此您的所有术语都是合理的,因此它们可以表示为重复小数。因此,您的术语的十进制扩展将是(a)指数,(b)非重复部分,以及(c)重复部分。如果以这种方式查看术语,可以利用一些效率。

无论如何,祝你好运!