我有一个整数n
,我希望得到一个数字,它自身的功率等于n
。我怎么能这样做?
答案 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
?”,而且,既然你问社区,看起来你不喜欢吨。