繁体   English   中英

C#中的大整数

[英]Big integers in C#

目前我正在从这里描述的J#库中借用java.math.BigInteger 从来没有使用过库来处理大整数,这看起来很慢,大约慢了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编写的任意精度整数库,具有快速O(N * log N) - 乘法/除法算法实现。 它提供了整数的所有基本操作,如加法,乘法,比较,按位移位等。

F#还附带一个。 您可以在Microsoft.FSharp.Math获取它。

System.Numerics.BigInteger在.NET 4.0中类是基于Microsoft.SolverFoundation.Common.BigInteger来自微软研究院。

Solver Foundation的BigInteger类看起来非常BigInteger 我不确定它下面发布了哪个许可证,但是你可以在这里获得它(下载并安装Solver Foundation并找到Microsoft.Solver.Foundation.dll)。

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

充气城堡

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

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

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

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

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

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

这可能听起来像一个奇怪的建议,但你测试了十进制类型,看看它有多快?

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

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

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

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

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

这看起来很有希望。 它是GMP的C#包装器。

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

此处还有.Net的其他BigInteger选项,特别是Mpir.Net

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM