C# C中的大整数#

C# C中的大整数#,c#,biginteger,largenumber,j#,C#,Biginteger,Largenumber,J#,目前我是。以前从未使用过用于处理大整数的库,这似乎很慢,大约慢10倍,甚至对于ulonglength数字也是如此。是否有人有更好的(最好是免费的)库,或者这种性能水平正常吗?我不确定性能如何,但IronPython也有一个BigInteger类。它位于Microsoft.Scripting.Math名称空间中。是的,它的速度会很慢,10倍的差异与我的预期差不多。BigInt使用数组表示任意长度,所有操作都必须手动完成(与大多数可以直接用CPU完成的数学相反) 我甚至不知道在汇编中手工编码是否会给

目前我是。以前从未使用过用于处理大整数的库,这似乎很慢,大约慢10倍,甚至对于
ulong
length数字也是如此。是否有人有更好的(最好是免费的)库,或者这种性能水平正常吗?

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

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


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

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

这听起来可能是一个奇怪的建议,但您是否测试过该类型,看看它的工作速度有多快

小数范围为±1.0×10^−28到±7.9×10^28,因此它可能仍然不够大,但它比一个乌龙大


在.NET 3.5中应该有一个BigInteger类,但是。

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

编辑
这个,看起来只慢了7倍。。。但是,通过上面的优化,您可以让它在小数量的情况下执行与本机类型几乎相同的操作

这对您没有帮助,但在.NET3.5中应该有一个BigInteger类;它被删掉了,但从PDC上的声明来看,它将出现在.NET4.0中。他们显然花了很多时间对其进行优化,因此性能应该比您现在得到的要好得多


此外,这个问题本质上是重复的

参见本节中的答案。您需要使用一个可用的第三方大整数库/类,或者等待包含本机大整数数据类型的C#4.0。

F#
也附带一个。从.NET 4.0开始,您可以在Microsoft.FSharp.Math上获得它。从.NET 4.0开始,您可以使用System.Numerics.BigInteger类。请参阅此处的文档:

另一个选择是课堂

IntX是任意精度 用纯C编写的整数库# 2.0和快速-O(N*logn)-乘法/除法算法 实施它提供了所有 整数的基本运算,如 加法,乘法,比较, 按位移位等


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


Solver Foundation的
BigInteger
类看起来性能非常好。我不知道哪个许可证被释放,但你可以得到它(下载和安装解决方案基金会,并找到微软。解决方案。 我使用过Mono的BigInteger实现,运行速度非常快(我在CompactFramework中使用过)


这看起来很有希望。这是一个C#包装

Net还有其他BigInteger选项,特别是,

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


任意精度整数由类型表示。对这些整数的操作都以
mpz\uz
前缀开始。例如,或。每个操作都给出了源代码示例。

是的,我在最初寻找BigInt库时看到了这一声明。让我伤心。哦,好吧。你必须小心——使用小数可能会导致舍入问题。小数不会导致舍入错误。它不是浮点。十进制只会尽量减少由于舍入而产生的错误。它也不能避免四舍五入。Decimal是一种浮点类型。只是它是一个十进制浮点数,而不是二进制浮点数。请看,如果所有值都是适当范围内的整数,我就不希望出现舍入问题。这里有几个gem。唯一的问题是它们需要安装J#可再发行文件。J#几乎已经死了(至少不是在VS2008中)这一事实可能无助于促进这一点。J#只是为了促进现有Java项目向.NET的迁移。我绝对不会把它的任何库合并到一个新项目中。可能是[我怎样才能在.NET中表示一个非常大的整数?]的副本()@Roger:我宁愿关闭另一个,因为这个库附带了更多的最新信息。我相信J#库在内部使用Byte,它至少有一个ToByteArray()函数,没有其他ToArray()函数。这可能是一个想法,如果我想推出我自己的,我也不是太兴奋的想法。一般来说,你用什么大小的数据?stuff是否会定期溢出Int64大小,或者这是一个例外?我主要是根据具体情况进行操作,当遇到带有选中{}块的溢出时,将其设置为BigInt。如果它这样做一次,那么它很有可能会重复并经常这样做。我认为,对于大量的数据,要让它执行得比codeproject上的实现快得多并不容易。正如我在最初的帖子中所说,我以前从未使用过BigInteger实现,所以我不知道执行的是哪种性能