C#中的大整数

时间:2008-10-07 00:16:09

标签: c# biginteger largenumber j#

目前我borrowing java.math.BigInteger from the J# libraries as described here。从来没有使用过库来处理大整数,这似乎很慢,大约慢了10倍,即使对于ulong长度数也是如此。有没有人有更好的(最好是免费的)库,或者这种性能水平是否正常?

12 个答案:

答案 0 :(得分:64)

从.NET 4.0开始,您可以使用System.Numerics.BigInteger类。请参阅此处的文档:http://msdn.microsoft.com/en-us/library/system.numerics.biginteger(v=vs.110).aspx

另一种选择是IntX类。

  

IntX是任意精度   用纯C语言编写的整数库   2.0 with fast - O(N * log N) - 乘法/除法算法   实现。它提供了所有   对整数的基本操作   加法,乘法,比较,   按位移位等。

答案 1 :(得分:9)

F#也附带一个。你可以在Microsoft.FSharp.Math获得它。

答案 2 :(得分:8)

.NET 4.0中的System.Numerics.BigInteger类基于Microsoft Research的{​​{1}}。

Solver Foundation的Microsoft.SolverFoundation.Common.BigInteger课程看起来非常高效。我不确定它下面发布了哪个许可证,但你可以得到它here(下载并安装Solver Foundation并找到Microsoft.Solver.Foundation.dll)。

答案 3 :(得分:4)

我认为你可以优化实现,如果你在BigInts上执行所有操作,这些操作将在本机类型上返回小于本机类型(例如int64)的结果,并且如果你打算只处理大数组溢出。

修改 这个implementation on codeproject似乎只慢了7倍......但是通过上面的优化,你可以让它与小数字的本机类型几乎相同。

答案 4 :(得分:4)

以下是C#中BigInteger的几种实现。 我使用过Mono的BigInteger实现,工作得非常快(我在CompactFramework中使用过它)

Bouncy Castle

Mono

答案 5 :(得分:3)

我不确定性能,但IronPython也有一个BigInteger类。它位于Microsoft.Scripting.Math名称空间中。

答案 6 :(得分:2)

是的,它会很慢,10倍的差异与我的预期有关。 BigInt使用一个数组来表示任意长度,所有操作都必须手动完成(而不是大多数可以直接用CPU完成的数学运算)

我甚至不知道在汇编中手动编码是否会给你带来超过10倍的性能提升,这非常接近。我会寻找其他方法来优化它 - 有时候根据你的数学问题,你可以采取一些小动作来加快它的速度。

答案 7 :(得分:2)

我在之前的工作中使用了Biginteger。我不知道你需要什么样的性能。我没有在性能密集的情况下使用它,但从来没有遇到任何问题。

答案 8 :(得分:2)

这可能听起来像是一个奇怪的建议,但您是否测试了decimal类型以查看它有多快?

小数范围为±1.0×10 ^ -28到±7.9×10 ^ 28,因此它可能仍然不够大,但它大于ulong。

.NET 3.5中应该有一个BigInteger类,但是it got cut

答案 9 :(得分:1)

这对你没有帮助,但是.Net 3.5中应该有一个BigInteger类;它被削减了,但是从PDC发表的声明来看,它将在.Net 4.0中。他们显然已经花了很多时间来优化它,所以性能应该比你现在得到的要好得多。

此外,这个问题基本上是How can I represent a very large integer in .NET?

的副本

答案 10 :(得分:1)

查看此thread中的答案。您将需要使用可用的第三方大整数库/类之一,或等待包含本机BigInteger数据类型的C#4.0。

答案 11 :(得分:0)

您还可以使用我编写的Math.Gmp.Native Nuget程序包。其源代码可在GitHub上找到,文档也可在here上找到。它向.NET公开了GMP库的所有功能,该库被称为高度优化的任意精度算术库。

任意精度整数由mpz_t类型表示。这些整数的运算都以mpz_前缀开头。例如,mpz_addmpz_cmp。给出了每个操作的源代码示例。