如何从n中获得一个提升到自身幂的数字等于n?

时间:2017-01-17 10:31:44

标签: c++ math pow

我有一个整数n,我希望得到一个数字,它自身的功率等于n。我怎么能这样做?

3 个答案:

答案 0 :(得分:5)

所以我们要解决等式x^x = n。这与找到相当于y^n = n的y = n的n根完全不同。

查看权力时要做的第一件事就是现在使用自然日志来考虑日志, x ln x = ln n。这对我们没有多大帮助,并且它不是标准函数,因此需要某种形式的收敛例程,我们想要解决f(x) = x ln x - ln n = 0。这个函数很好地单调增加比x快一点,所以它应该很容易解决。

我们可以使用Newton's method。首先找到衍生物 f'(x) = log x + 1。从猜测x1开始,更新的猜测将为x2 = x1 - f(x1) / f'(x)。如果你这样做了几次它应该很好地收敛。在我的实验中,找到了x x^x = 21 只有不到6个迭代收敛。

在psudocode中

x[0] = ln(n);
for(i=0; i<6;++i ) {
    fx = x[i] * ln( x[i] ) - ln(n); 
    df = ln( x[i] ) + 1;
    x[i+1] = x[i] - fx / df;
}
println(x[6], pow(x[6], x[6]))

答案 1 :(得分:4)

你质疑两件事。

  

我希望获得n

n

这意味着找到x^n=n的解决方案。对于这个std::pow(n, 1./n)将是一件好事。请注意,如果1/n是整数,n可能会执行整数除法,因此最终可能会得到std::pow(n, 0) 1

  

我想获得一个数字,它自身的力量等于n

这是完全不同的东西。您正在尝试为x^x=n解决x。根据{{​​1}}和asking Wolfram Alpha about it的具体情况,它会返回

  

n=2

其中x = exp(W(log(2)))Lambert W function。据我所知,这不是C ++标准的一部分,因此您可能必须找到一个库(源代码或动态链接)来为您计算该函数。 GSL可能会服务。但是,推广到W的不同值应该是显而易见的。

答案 2 :(得分:1)

TL; DR :使用std::pow

您希望找到1/n n的强大功能。有一个标准函数可以找到y x的{​​{1}}幂,称为std::pow。使用标准函数总是一个好主意,除非你有充分的理由不这样做。

所以,最好将这个问题改为“你有没有理由使用std::pow?”,而且,既然你问社区,看起来你不喜欢吨。