目前我正在从这里描述的 J# 库中借用java.math.BigInteger
。以前从未使用过处理大整数的库,这似乎很慢,大约慢了 10 倍,即使对于ulong
长度数字也是如此。有没有人有更好的(最好是免费的)库,或者这种性能水平是否正常?
13 回答
从 .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 编写的任意精度整数库,具有快速 - O(N * log N) - 乘法/除法算法实现。它提供了整数的所有基本操作,如加法、乘法、比较、按位移位等。
F#
还附带一个。你可以在Microsoft.FSharp.Math
.
.NET 4.0 中的System.Numerics.BigInteger
类基于Microsoft.SolverFoundation.Common.BigInteger
Microsoft Research。
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# Wrapper 。
http://web.rememberingemil.org/Projects/GnuMpDotNet/GnuMpDotNet.html