我正在尝试计算一个大数字,需要BigInteger.Pow()
,但我需要指数也是BigInteger
而不是int
。
即
BigInteger.Pow(BigInteger)
我怎样才能做到这一点?
编辑:我想出了一个答案。用户dog帮助我实现了这一目标。
public BigInteger Pow(BigInteger value, BigInteger exponent)
{
BigInteger originalValue = value;
while (exponent-- > 1)
value = BigInteger.Multiply(value, originalValue);
return value;
}
答案 0 :(得分:7)
仅从一般数学方面来看,这没有意义。这就是为什么它没有实施的原因。
想想这个示例:您的BigInteger
号码 2 ,您需要将其加强1024.这意味着结果是1 KB的数字(2 ^ 1024)。现在假设您使用int.MaxValue
:然后,您的号码将消耗2 GB的内存。使用BigInteger
作为指数将产生超出内存容量的数字!
如果你的应用程序需要这个数字的数字,数字本身对你的记忆来说太大了,你可能想要一个单独存储数字和指数的解决方案,但这是我自己只能推测的东西。它不是你问题的一部分。
如果你的问题是你的exponent变量是BigInteger
,你可以把它转换为int:
BigInteger.Pow(bigInteger, (int)exponent); // exponent is BigInteger
答案 1 :(得分:3)
Pow(2,int64.MaxValue)需要1,152,921太字节才能保持数字,以达到规模感。但是,无论如何,这都是功能,万一你有一台非常好的电脑。
static BigInteger Pow(BigInteger a, BigInteger b) {
BigInteger total = 1;
while (b > int.MaxValue) {
b -= int.MaxValue ;
total = total * BigInteger.Pow(a, int.MaxValue);
}
total = total * BigInteger.Pow(a, (int)b);
return total;
}
答案 2 :(得分:1)
正如其他人所指出的那样,将事物提升到高于int
容量的能力是坏消息。但是,假设您已经意识到这一点并且只是以BigInteger
的形式获得了您的指数,那么您可以转换为int
并继续您的快乐方式:
BigInteger.Pow(myBigInt, (int)myExponent);
或者,甚至更好,
try
{
BigInteger.Pow(myBigInt, (int)myExponent);
}
catch (OverflowException)
{
// Do error handling and stuff.
}
答案 3 :(得分:0)
我想出了:
public BigInteger Pow(BigInteger value, BigInteger exponent)
{
BigInteger originalValue = value;
while (exponent-- > 1)
value = BigInteger.Multiply(value, originalValue);
return value;
}
答案 4 :(得分:0)
对我来说,解决方案是使用函数 BigInteger.ModPow(BigInteger值,BigInteger指数,BigInteger模数),因为无论如何我以后都需要做一个mod。
该函数将给定的BigInteger计算为另一个BigInteger的幂,并使用第三个BitInteger计算模。 尽管它仍然会占用大量CPU资源,但是由于该函数已经知道模数,因此可以对其进行评估,因此可以节省大量内存。
希望这可能对某些问题有所帮助。
编辑: 从.Net Framework 4.0开始可用,并且在.Net Standard 1.1及更高版本中。