C#中的大整数
目前我从这里描述的J#库中借用java.math.BigInteger
。 从来没有使用过一个图书馆来处理大整数,这看起来很慢,慢了10倍,即使是超长数字也是如此。 有没有人有更好的(最好是免费的)库,或者这个级别的性能是否正常?
从.NET 4.0开始,您可以使用System.Numerics.BigInteger类。 在这里看到文档: http : //msdn.microsoft.com/en-us/library/system.numerics.biginteger(v=vs.110).aspx
另一种select是IntX类。
IntX是一个用纯C#2.0编写的任意精度整型库,具有快速O(N * log N) – 乘/除algorithm实现。 它提供了所有关于整数的基本操作,如加法,乘法,比较,按位移等。
F#
也附带一个。 你可以在Microsoft.FSharp.Math
。
.NET 4.0中的System.Numerics.BigInteger
类基于Microsoft Research的Microsoft.SolverFoundation.Common.BigInteger。
Solver Foundation的BigInteger
类看起来非常BigInteger
。 我不确定它在哪个版本下发布,但你可以在这里下载(下载并安装Solver Foundation并findMicrosoft.Solver.Foundation.dll)。
我想你可以优化实现,如果你对BigInts执行所有的操作,返回的结果小于本地types的本地types(例如int64),只处理大数组,如果你要溢出。
编辑 codeproject上的这个实现 ,似乎只有7倍慢…但通过上述优化,你可以得到它几乎相同的本机types为小数字。
这里有几个BigInteger在C#中的实现。 我使用Mono的BigInteger实现,工作速度非常快(我在CompactFramework中使用过)
充气城堡
单
我不确定性能,但IronPython也有一个BigInteger类。 它位于Microsoft.Scripting.Math命名空间中。
是的,这将是缓慢的,10倍的差异是关于我所期望的。 BigInt使用一个数组来表示一个任意的长度,所有的操作都必须手动完成(而不是直接用CPU来完成的大部分math操作)
我甚至不知道是否在汇编中手写代码会使您的性能提升超过10倍,这相当接近。 我会寻找其他方法来优化它 – 有时取决于你的math问题,有一些小技巧,你可以做的更快。
我在之前的工作中使用过Biginteger 。 我不知道你有什么样的performance需要。 在性能密集的情况下,我没有使用它,但是从来没有遇到任何问题。
这可能听起来像一个奇怪的build议,但是你testing了十进制types,看它有多快?
小数点的范围是±1.0×10 ^ -28到±7.9×10 ^ 28,所以它可能还不够大,但是大于一个长度。
在.NET 3.5中应该有一个BigInteger类,但是它被切断了 。
这不会对你有所帮助,但是.Net 3.5中应该有一个BigInteger类。 它得到了削减,但从PDC发表的声明,将在。NET 4.0。 他们显然花了很多时间来优化它,所以性能应该比现在好得多。
此外,这个问题本质上是一个重复的如何在.NET中表示一个非常大的整数?
看到这个线程的答案。 您将需要使用可用的第三方大整数库/类之一,或者等待包含本机BigInteger数据types的C#4.0。
这看起来很有希望。 它是GMP上的C#包装器。
http://web.rememberingemil.org/Projects/GnuMpDotNet/GnuMpDotNet.html
在这里还有其他的BigInteger选项,特别是Mpir.Net