c# - 理论上存储非常非常大的数字

标签 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/

相关文章:

c# - 如何在 Unity 3D 中处理体重秤?

c# - 在语义上表示泛型

C# String to DateTime 这种格式 2018-05-26T00 :00:00

c# - 来自 BinaryFormatter.Deserialize 的 OutOfMemory 异常来自其内部 StringBuilder 调用

c# - 是什么让 Winform 职位最初变得陈旧?

c# - 为什么 WPF DataGrid 的垂直滚动太大?

c# - Controller 函数上方的自定义属性

c# - 转向MVVM之前需要WPF知识

c# - 有没有派生类应该隐藏的情况......?

c# - 如何使用 Automapper 映射父/子集合模型?