给定一个正整数Ñ和若干一个,所述Ñ个迭代幂次的一个被定义为一个 ^(一个 ^(一个 ^(... ^ 一))),其中^表示幂运算(或功率)和表达式包含数一正好ñ倍。
换句话说,四方是右缔合的迭代指数。对于n = 4和a = 1.6,四边形为1.6 ^(1.6 ^(1.6 ^ 1.6))≈3.5743。
相对于n的四次方的逆函数是超对数。在前面的示例中,4是3.5743与“超级基数” 1.6的超级对数。
挑战
给定一个正整数n,找到x,使n是超基数x中其自身的超对数。也就是说,找到x使得x ^(x ^(x ^(... ^ x)))(x出现n次)等于n。
规则
允许的程序或功能。
输入和输出格式像往常一样灵活。
该算法理论上应该适用于所有正整数。实际上,由于存储器,时间或数据类型的限制,输入可能被限制为最大值。但是,该代码必须100
至少在不到一分钟的时间内适用于输入。
该算法理论上应能0.001
精确给出结果。实际上,由于数值计算中的累积误差,输出精度可能会更差。但是,0.001
对于指定的测试用例,输出必须准确。
最短的代码胜出。
测试用例
1 -> 1
3 -> 1.635078
6 -> 1.568644
10 -> 1.508498
25 -> 1.458582
50 -> 1.448504
100 -> 1.445673
参考实施
这是Matlab / Octave中的参考实现(请在Ideone尝试)。
N = 10; % input
t = .0001:.0001:2; % range of possible values: [.0001 .0002 ... 2]
r = t;
for k = 2:N
r = t.^r; % repeated exponentiation, element-wise
end
[~, ind] = min(abs(r-N)); % index of entry of r that is closest to N
result = t(ind);
disp(result)
对于N = 10
这给result = 1.5085
。
以下代码使用可变精度算法检查输出精度:
N = 10;
x = 1.5085; % result to be tested for that N. Add or subtract 1e-3 to see that
% the obtained y is farther from N
s = num2str(x); % string representation
se = s;
for n = 2:N;
se = [s '^(' se ')']; % build string that evaluates to iterated exponentiation
end
y = vpa(se, 1000) % evaluate with variable-precision arithmetic
这给出:
- 对于
x = 1.5085
:y = 10.00173...
- 对于
x = 1.5085 + .001
:y = 10.9075
- 因为
x = 1.5085 - .001
它给y = 9.23248
。
因此,这1.5085
是一种.001
精确有效的解决方案。
x
随着n
接近无穷收敛吗?