我正在寻找 NET 4.x 引入的 C# 的 BigInteger 包的替代方案。
这个对象的数学运算非常慢,我猜这是因为算术是在比原始类型更高的级别上完成的 - 或者优化不好,无论如何。
Int64/long/ulong 或其他 64 位数字太小,无法正确计算 - 我说的是 64 位整数的 64 位整数次方。
希望有人可以建议我的东西。提前致谢。
我正在寻找 NET 4.x 引入的 C# 的 BigInteger 包的替代方案。
这个对象的数学运算非常慢,我猜这是因为算术是在比原始类型更高的级别上完成的 - 或者优化不好,无论如何。
Int64/long/ulong 或其他 64 位数字太小,无法正确计算 - 我说的是 64 位整数的 64 位整数次方。
希望有人可以建议我的东西。提前致谢。
老实说,如果您有非常大的数字并且需要对它们进行大量计算并且BigInteger
库仍然没有为您切割它,为什么不使用您所知道的最好的任何语言或工具包将其卸载到外部进程上呢?你真的受限于完全用 C# 编写你想要完成的任何事情吗?
例如,您可以在 C# 中卸载到 MATLAB。
BIGInteger 确实很慢。原因之一是它的不变性。
如果您执行 a = a - b,您将获得 a 的新副本。通常这是很快的。使用 BigInteger 并说一个 2048 位的整数,它将需要分配额外的 2KB。
它还应该有不同的乘法算法,具体取决于整数大小(我认为它不是那么复杂)。我的意思是,对于非常大的整数,使用傅立叶变换的不同算法效果最好,而对于较小的整数,您可以将工作分解为较小的乘法(分而治之的方法)。在http://en.wikipedia.org/wiki/Multiplication_algorithm上查看更多信息
无论哪种方式都有替代品,我没有使用或测试过。据我所知,它们可能比 .NET 内部要慢。(制作一个测试用例并做一些有效的测试是你的朋友)
许多自制 BigInteger 实现的 Google 'C# 大整数乘法'(通常在引入 BIGInteger 时来自 C#4.0 之前的版本)
http://gmplib.org/(有 C# 包装器)
http://mathnetnumerics.codeplex.com/(不错的开源,但对于非常大的整数来说没有太多的板载)
public static int PowerBySquaring(int baseNumber, int exponent)
{
int result = 1;
while (exponent != 0)
{
if ((exponent & 1)==1)
{
result *= baseNumber;
}
exponent >>= 1;
baseNumber *= baseNumber;
}
return result;
}