替代BigInteger.ModPow(); 在C#(Alternative to BigInt

2019-07-31 03:53发布

我在找已经引入了NET 4.x版以C#的BigInteger的包替代

与此对象的数学运算是非常慢的,我想这是由以下事实导致的算术是在比原始类型更高的水平完成 - 或优化不好,等等。

的Int64 /长/ ULONG或其他64位号码的方式小,不会正确地计算 - 我说的是64位整数到整数64位的力量。

希望有人可以建议我的东西。 提前致谢。

Answer 1:

老实说,如果你有非常大的数,需要做繁重的计算与他们和BigInteger库仍然没有削减它适合你,为什么不卸载它使用上,你知道的最做它用什么语言或工具包的外部进程? 你真的不得不写信不管它是你想在C#中完全实现?

例如,你可以卸载到MATLAB在C# 。



Answer 2:

BIGINTEGER确实很慢。 其中一个原因是它的不变性。

如果你做A = A - B,你会得到一个新的副本。 通常,这是快。 随着BigInteger和说的2048位的整数,它需要额外拨款2KB。

它也应该有根据integersize不同的乘法的算法(我假设它不是复杂的)。 我的意思是,非常非常大的整数不同的算法使用傅立叶变换最好的作品和较小的整数你打破的工作在较小的乘降(分而治之的办法)。 查看更多关于http://en.wikipedia.org/wiki/Multiplication_algorithm

无论哪种方式,有替代品,其中没有一个我曾经使用或测试。 他们可能是为.NET内部所有我知道的更慢。 (使一个测试用例,并做一些有效的测试是你的朋友)

  • 谷歌的C#大整数乘法“进行了大量自制的BigInteger实现的(通常来自前C#4.0的时候被引入BIGINTEGER)

  • https://github.com/devoyster/IntXLib

  • http://gmplib.org/ (有C#包装)

  • http://www.extremeoptimization.com/ (商业)

  • http://mathnetnumerics.codeplex.com/ (好的开源,但没有太大的板载非常大的整数)



Answer 3:

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;
}


文章来源: Alternative to BigInteger.ModPow(); in C#