<分区>
这是老新闻了,但我最近读到有关最大素数的文章,大约一年前发现了一个 1700 万位的素数(迄今为止最大的素数)。这让我开始思考,因为您必须能够计算数字以确保它是质数。可以实现哪些方法来做到这一点?我不知道有任何数据类型可以容纳如此多的数据并仍然允许计算这些数据。 BigInt 可以处理这个吗?
标签 c#
<分区>
这是老新闻了,但我最近读到有关最大素数的文章,大约一年前发现了一个 1700 万位的素数(迄今为止最大的素数)。这让我开始思考,因为您必须能够计算数字以确保它是质数。可以实现哪些方法来做到这一点?我不知道有任何数据类型可以容纳如此多的数据并仍然允许计算这些数据。 BigInt 可以处理这个吗?
最佳答案
声称BigInteger
“理论上没有上限或下限”是不正确的。在 .NET 4.0 中,BigInteger
结构在内部使用 uint[]
表示大批。鉴于 uint
的最大值是 4,294,967,295,数组的最大长度是 2,146,435,071,即 BigInteger
的当前实现理论上限为 4,294,967,295 2,146,435,071(假设完美包装)。这允许它存储由数十亿位数字(包括您的质数)组成的整数,但不是数万亿。
编辑:如评论中所述,数组的总大小不能超过 2 GB,除非 <gcAllowVeryLargeObjects>
启用设置(需要 .NET 4.5 和 64 位)。自 uint
数据类型占用4个字节,数组中元素的最大个数限制为229。
为了演示这个上限,您需要做的就是运行以下代码,它会尝试计算 (230)(230).
var bi = BigInteger.Pow(1 << 30, 1 << 30);
几秒钟后,你会得到一个错误:
OutOfMemoryException: Array dimensions exceeded supported range.
不要被异常类型的名称误导;即使您有足够的内存来容纳整个数字,也会抛出此错误。事实上,如果您运行以下代码片段,也会抛出同样的错误:
var s = new uint[1 << 30];
关于c# - 理论上存储非常非常大的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21047633/