你怎么能处理荒谬的大数字?

时间:2012-11-24 18:28:04

标签: language-agnostic bigdata largenumber

在某些情况下,程序员需要或想要找到非常大的数字。这些往往是如此之大,以至于它们无视程序员的理解。我说的是the largest known prime number(12978189 digits )和最近计算的10 trillion digits of pi等内容。

如何创建处理这些程序的程序?这远远超过整数,long,double,BigInteger,BigDecimal或任何类型。如何创建这些用于发现这些数字的程序?如果没有合适的数据类型,你怎么能将它们存储在内存中,并且它们每个可能会消耗千兆字节的数据?

2 个答案:

答案 0 :(得分:4)

要解决您的具体示例:

  • 对于要处理的典型“大整数”类,1200万位整数并不是非常大。这应该能够存储在内存中。

  • 要存储10万亿个π,您可以使用磁盘文件和 memory-map 它。你需要一个64位的操作系统和应用程序,但你可以在磁盘上创建一个10TB的文件(你可能需要一些磁盘和一个像ZFS这样的文件系统,可以跨磁盘存储它),并映射它进入CPU地址空间。计算π的算法(例如BBP)可以方便地一次计算一个十六进制数字,非常适合半个字节的内存。

答案 1 :(得分:0)

(抽象的)答案是使用机器的本机类型编写算法,以产生所需的结果。例如,当您手工在纸上添加两个非常大的整数时,所需的最大实际计算量仅为9 + 9 + 1(9加9加1加进位)。当然,您需要足够大的纸张以首先将两个数字写下来,并将答案也写下来。因此,只要可以将两个数字和答案存储在计算机的硬盘(纸质文件)中,就可以编写一种算法,使用仅需要19以下的值的变量来完成该算法。因此,即使一个char变量也能够处理这个问题,更不用说int变量了。

(具体的)答案是,真正好的程序员已经做到了这一点,甚至还有FOSS库。一个很好的例子是GNU工程的GMP library,它具有处理任意大小整数算法和任意精度浮点算法的功能。因此,只要您的计算机可以存储计算过程中所需的信息,就可以完成。您需要花时间阅读课程文档。