我正在寻找.NET 4.x引入的C#BigInteger包的替代品。
使用这个对象的数学运算非常慢,我想这是因为算术是在比原始类型更高的层次上完成的 - 或者是非常优化的,无论如何。
Int64 / long / ulong或其他64位数字是小的并且不能正确计算 - 我说的是64位整数到64位整数的幂。
希望有人可以推荐我的东西。提前谢谢。
答案 0 :(得分:1)
老实说,如果你有非常大的数字并且需要对它们进行繁重的计算并且BigInteger
库仍然没有为你削减它,为什么不使用你使用的任何语言或工具包将它卸载到外部进程上知道那最好吗?你是否真的受限于编写你想要完全用C#完成的任何事情?
例如,您可以卸载到MATLAB in C#。
答案 1 :(得分:1)
BIGInteger确实很慢。其中一个原因是它的不变性。
如果您执行a = a - b,您将获得一份新的副本。通常这很快。使用BigInteger并说一个2048位的整数,它需要额外分配2KB。
它还应该有不同的乘法算法,具体取决于整数(我认为它并不复杂)。我的意思是,对于非常大的整数,使用傅立叶变换的不同算法效果最好,对于较小的整数,您可以用较小的乘法(分而治之的方法)来分解工作。有关http://en.wikipedia.org/wiki/Multiplication_algorithm
的更多信息,请参阅无论哪种方式都有替代品,我没有使用或测试过。对于我所知道的所有内容,它们可能比.NET内部更慢。 (制作测试用例并做一些有效的测试是你的朋友)
谷歌'C#大整数乘法'用于很多自制的BigInteger实现(通常在引入BIGInteger时从C#4.0开始)
http://gmplib.org/(有C#包装器)
http://mathnetnumerics.codeplex.com/(很好的开源,但是对于非常大的整数而言并不多)
答案 2 :(得分:0)
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;
}