BigInteger.Pow(BigInteger,BigInteger)?

时间:2015-05-13 20:27:16

标签: c# biginteger

我正在尝试计算一个大数字,需要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;
}

5 个答案:

答案 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及更高版本中。