存储非常非常大的理论数

时间:2014-01-10 15:06:17

标签: c#

这是个老消息,但我最近读到了最大的素数,大约一年前发现了一个1700万的数字素数(迄今为止最大的)。这让我思考了一点,因为你必须能够计算数字以确保它是素数。可以实施哪些方法来实现这一目标?我不知道任何数据类型可以容纳这么多数据并仍然允许它被计算。 BigInt可以处理这个吗?

5 个答案:

答案 0 :(得分:19)

理论上BigInteger“没有上限或下限的说法”是不正确的。在.NET 4.0中,BigInteger结构在内部使用uint[]数组表示。鉴于uint的最大值为4,294,967,295,并且该数组的最大长度为2,146,435,071,BigInteger的当前实现具有理论上限4,294,967,295 2,146,435,071 (假设完美包装)。这允许它存储由数十亿个数字(包括你的素数)组成的整数,但不能存储数万亿个。

编辑:正如评论中所提到的,除非启用<gcAllowVeryLargeObjects>设置(需要.NET 4.5和64位),否则数组总大小不能超过2千兆字节。由于uint数据类型占用4个字节,因此数组中的最大元素数限制为2 29

要演示此上限,您需要做的就是运行以下代码,该代码尝试计算(2 30 (2 30 )< / SUP>

var bi = BigInteger.Pow(1 << 30, 1 << 30);

在几秒钟内,您将收到错误:

OutOfMemoryException: Array dimensions exceeded supported range.

不要被异常类型的名称误导;即使您有足够的内存来容纳整个数字,也会抛出此错误。事实上,如果您运行以下代码段,则会抛出相同的错误:

var s = new uint[1 << 30];

答案 1 :(得分:5)

MSDN声称

  

BigInteger类型是一个不可变类型,表示任意大整数,其理论值 没有上限或下限

所以是的,它理论上可以处理这样的数字。这种类型还提供了许多可以使用它的数学运算。

答案 2 :(得分:3)

来自BigInteger的文档。

  

BigInteger类型是一个不可变类型,表示一个任意大的整数,其理论上的值没有上限或下限。

然而,它继续说:

  

因为它没有上限或下限,因此任何导致BigInteger值过大的操作都会抛出OutOfMemoryException。

所以我猜答案是,是的它可以处理它,但是你必须有一台有足够内存的机器。

答案 3 :(得分:0)

据我测试过,BigInt可以处理绝对庞大的数字。我真的让控制台打印数字几分钟。唯一的限制是你的记忆。

答案 4 :(得分:0)

如果你研究一下如何实际操作,你会发现没有理由将它们限制在例如。 32位数字(溢出,无穷多项式等)。因此,如果您在软件中复制相同的逻辑,则可以使用任意大数字执行任何操作。当然,快速快速是另一回事。