64

目前我正在从这里描述的 J# 库中借用java.math.BigInteger。以前从未使用过处理大整数的库,这似乎很慢,大约慢了 10 倍,即使对于ulong长度数字也是如此。有没有人有更好的(最好是免费的)库,或者这种性能水平是否正常?

4

13 回答 13

66

从 .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) - 乘法/除法算法实现。它提供了整数的所有基本操作,如加法、乘法、比较、按位移位等。

于 2009-04-27T19:06:08.720 回答
9

F#还附带一个。你可以在Microsoft.FSharp.Math.

于 2009-01-31T13:22:23.287 回答
8

.NET 4.0 中的System.Numerics.BigInteger类基于Microsoft.SolverFoundation.Common.BigIntegerMicrosoft Research。

Solver Foundation 的BigInteger类看起来非常高效。我不确定它是根据哪个许可证发布的,但您可以在此处获取它(下载并安装 Solver Foundation 并找到 Microsoft.Solver.Foundation.dll)。

于 2009-06-19T17:48:05.223 回答
4

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

编辑codeproject 上的 这个实现,似乎只慢了 7 倍......但是通过上面的优化,你可以让它执行几乎与小数字的本机类型相同。

于 2008-10-07T00:33:45.293 回答
4

以下是 C# 中 BigInteger 的几个实现。我使用了 Mono 的 BigInteger 实现,运行速度非常快(我在 CompactFramework 中使用过)

充气城堡

单核细胞增多症

于 2009-06-23T09:48:40.900 回答
3

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

于 2008-10-07T00:20:52.887 回答
2

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

我什至不知道在汇编中手动编码是否会给你带来超过 10 倍的性能提升,这非常接近。我会寻找其他方法来优化它——有时取决于你的数学问题,你可以做一些小技巧来让它更快。

于 2008-10-07T00:23:35.393 回答
2

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

于 2008-10-07T00:29:04.617 回答
2

这听起来像是一个奇怪的建议,但是您是否测试过十进制类型以查看它的工作速度?

小数范围是±1.0 × 10^−28 到±7.9 × 10^28,所以可能还是不够大,但比ulong大。

.NET 3.5 中应该有一个 BigInteger 类,但它被 cut 了

于 2008-10-07T00:31:26.360 回答
1

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

此外,这个问题本质上是如何在 .NET 中表示一个非常大的整数?

于 2008-11-08T20:41:33.337 回答
1

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

于 2008-11-10T20:28:47.073 回答
1

这看起来很有希望。它是GMP之上的 C# Wrapper 。

http://web.rememberingemil.org/Projects/GnuMpDotNet/GnuMpDotNet.html

.Net这里还有其他 BigInteger 选项,特别是Mpir.Net

于 2015-08-25T01:39:19.620 回答
1

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

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

于 2019-05-18T09:10:27.217 回答