C# 存储一个非常非常大的数字

C# 存储一个非常非常大的数字,c#,C#,这是老新闻了,但我最近读到了关于最大素数的文章,大约一年前发现了一个1700万位数的素数(迄今为止最大的)。这让我思考了一下,因为你必须能够计算出这个数,以确保它是素数。可以采用什么方法来实现这一点?我不知道有哪种数据类型可以保存这么多数据,并且仍然允许对其进行计算。BigInt能处理这个问题吗?声称 BigInteger类型是一个不可变的类型,它表示一个任意大的整数,其值在理论上没有上界或下界 是的,理论上它可以处理这样的数字。此类型还提供了许多可以使用它的数学运算。来自的文档 BigInte

这是老新闻了,但我最近读到了关于最大素数的文章,大约一年前发现了一个1700万位数的素数(迄今为止最大的)。这让我思考了一下,因为你必须能够计算出这个数,以确保它是素数。可以采用什么方法来实现这一点?我不知道有哪种数据类型可以保存这么多数据,并且仍然允许对其进行计算。BigInt能处理这个问题吗?

声称

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


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

来自的文档

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

然而,它接着说:

因为它没有上限或下限,任何导致BigInteger值增长过大的操作都可能引发OutOfMemoryException


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

据我测试,BigInt可以处理绝对巨大的数字。我真的让控制台打印几分钟的号码。唯一的限制是你的内存。

如果你研究这些操作是如何实际实现的,你会发现没有理由将它们限制在32位数字(溢出、无限多项式等)。所以,如果你在软件中复制相同的逻辑,你可以用任意大的数字做任何事情。当然,使其快速运行完全是另一回事。

关于
biginger
“理论上没有上限或下限”的说法是不正确的。在.NET4.0中,
biginger
结构使用
uint[]
数组在内部表示。假定
uint
的最大值为4294967295,数组的最大长度为2146435071,则
BigInteger
的当前实现的理论上限为4294967295 2146435071(假设完全打包)。这允许它存储由数十亿位(包括素数)组成的整数,但不能存储万亿位

编辑:如注释中所述,阵列的总大小不能超过2 GB,除非已启用设置(需要.NET 4.5和64位)。由于
uint
数据类型占用4个字节,因此数组中元素的最大数量限制为229个

为了演示这个上限,您所需要做的就是运行以下代码,尝试计算(230)(230)

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

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

var s=new-uint[1你可以将它保存到string中,这可能是你在大学里不得不做的事情的副本。我只需要使用一个数组并实现你自己的解决方案bigint被限制在2^64
-9223372036854775808
9223372036854775807
@James你把SQL Server中的bigint类型(一个64位的普通整数类型)搞混了在.NET framework中使用
BigInteger
,它是一种仅受内存限制的整数类型。+1非常有用,因为您给出了一个理论最大值的实际数字。我刚刚发现,Java有一个类似的答案:在正常情况下(即不是启用gcAllowVeryLargeObjects的64位.NET 4.5)任何对象的最大大小为2Gb(2^31字节),那么uint数组的最大长度不是只有2^31/4=2^29个uint吗?@Andersforgren这是一个很好的观点,在典型的开发环境中很可能是这样的,但它仍然会保持这个数字,并且考虑到素数发现的速度,我相信在5亿多素数被发现时,2Gb对于大多数人来说都将是过去的事情被发现(如果它们真的不确定)。不要忘记“内存不足”并不意味着“内存不足”,而是意味着“地址空间不足”。在您的机器中放入更多内存只会加快速度,不会使内存不足错误消失。是的,但如果您有一个x64系统……您将有8TB的地址空间。
OutOfMemoryException: Array dimensions exceeded supported range.
var s = new uint[1 << 30];