题
目前我正在借用 java.math.BigInteger
来自这里描述的J#库。从来没有使用过库来处理大整数,这似乎很慢,大约慢了10倍,即使对于 ulong
长度数也是如此。有没有人有更好的(最好是免费的)库,或者这种性能水平是否正常?
解决方案
从.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) - 乘法/除法算法 实现。它提供了所有 对整数的基本操作 加法,乘法,比较, 按位移位等。
其他提示
F#
也附带一个。您可以在 Microsoft.FSharp.Math
。
.NET 4.0中的 System.Numerics.BigInteger
类基于Microsoft Research的 Microsoft.SolverFoundation.Common.BigInteger
。
Solver Foundation的 BigInteger
类看起来非常高效。我不确定它发布了哪个许可证,但是你可以通过这里获取它(下载)并安装Solver Foundation并找到Microsoft.Solver.Foundation.dll。
我认为你可以优化实现,如果你在BigInts上执行所有操作,这些操作将在本机类型上返回小于本机类型(例如int64)的结果,并且如果你打算只处理大数组溢出。
修改强> 这个在codeproject上的实现似乎只慢了7倍......但随着在优化之上,您可以使它与小数字的本机类型几乎完全相同。
我不确定性能,但IronPython也有一个BigInteger类。它位于Microsoft.Scripting.Math名称空间中。
是的,它会很慢,10倍的差异与我的预期有关。 BigInt使用一个数组来表示任意长度,所有操作都必须手动完成(而不是大多数可以直接用CPU完成的数学运算)
我甚至不知道在汇编中手动编码是否会给你带来超过10倍的性能提升,这非常接近。我会寻找其他方法来优化它 - 有时候根据你的数学问题,你可以采取一些小动作来加快它的速度。
我在以前的工作中使用了 Biginteger 。我不知道你需要什么样的性能。我没有在性能密集的情况下使用它,但从来没有遇到任何问题。
这对你没有帮助,但是.Net 3.5中应该有一个BigInteger类;它被削减了,但是从PDC发表的声明来看,它将在.Net 4.0中。他们显然已经花了很多时间来优化它,所以性能应该比你现在得到的要好得多。
此外,这个问题基本上与重复。我怎样才能在.NET中表示一个非常大的整数?
请参阅此螺纹。您将需要使用可用的第三方大整数库/类之一,或等待包含本机BigInteger数据类型的C#4.0。
这看起来很有希望。它是 GMP 上的C#包装。
http://web.rememberingemil.org/Projects/GnuMpDotNet/GnuMpDotNet.html