考虑以下操作 - 我们采用正整数n并将其替换为其素因子的总和(如果在n的因子分解中多次出现素数,那么它将被计为相同的数字在总和中的次数)。该操作首先顺序地应用于给定数量,而不是第一结果,而不是第二结果,依此类推,直到结果保持不变。 给定任意数字,找到操作的最终结果。
实施例:
24 -> (2 + 2 + 2 + 3) = 9 -> (3 + 3) = 6 -> (2 + 3) = 5 -> 5.
所以24的答案是5。
除了蛮力解决方案,我找不到更好的解决方案
答案 0 :(得分:0)
您可能需要查看the OEIS page此序列。
它包含几个代码片段,例如Maple中的这个代码片段:
f:= proc(n) option remember;
if isprime(n) then n
else `procname`(add(x[1]*x[2], x = ifactors(n)[2]))
fi
end proc:
f(1):= 0: f(4):= 4:
map(f, [$1..100]); # Robert Israel, Apr 27 2015
我不知道Maple,但这看起来很像你所建议的递归定义。因此,我倾向于说迭代直到达到质数(除了1和4的特殊情况)是最有效的计算方法。
还有一个Mathematica脚本,但它对我来说完全无法穿透:
ffi[x_] := Flatten[FactorInteger[x]] lf[x_] := Length[FactorInteger[x]] ba[x_] := Table[Part[ffi[x], 2*w-1], {w, 1, lf[x]}] ep[x_] := Table[Part[ffi[x], 2*w], {w, 1, lf[x]}] slog[x_] := slog[x_] := Apply[Plus, ba[x]*ep[x]] Table[FixedPoint[slog, w], {w, 1, 128}]
f[n_] := Plus @@ Flatten[ Table[ #[[1]], {#[[2]]}] & /@ FactorInteger@n]; Array[ FixedPoint[f, # ] &, 87] (* Robert G. Wilson v, Jan 18 2006 *)
fz[n_]:=Plus@@(#[[1]]*#[[2]]&/@FactorInteger@n); Array[FixedPoint[fz, #]&, 1000] (* Zak Seidov, Mar 14 2011 *)
This related sequence给出了达到结果所需的迭代次数。它说只有一个n<需要超过10次迭代的10000,所以它似乎也是一种快速收敛的算法。