介绍
考虑定义如下的整数f的序列:
- f(2)= 2
- 如果n是奇数素数,则f(n)=(f(n-1)+ f(n + 1))/ 2
- 如果n = p·q是合成的,则f(n)= f(p)·f(q)
不难发现每n≥2 f(n)= n,因此计算f并不是一个非常有趣的挑战。让我们改变一下定义:将第一种情况减半,第二种情况加倍。我们得到一个新的序列g,定义如下:
- g(2)= 1
- 如果n是奇质数,则g(n)= g(n-1)+ g(n + 1)
- 如果n = p·q是合成的,则g(n)= g(p)·g(q)
任务
您的任务是将整数n≥2作为输入,并产生g(n)作为输出。您不必担心整数溢出,但是您应该能够正确计算g(1025)= 81,并且您的算法在理论上应该适用于任意大的输入。
您可以编写完整的程序或函数。最低字节数获胜。
例
我声称g(1025)= 81以上,因此我们手动进行计算。1025的素数分解给出
1025 = 5*5*41 => g(1025) = g(5)*g(5)*g(41)
由于41是素数,我们得到
g(41) = g(40) + g(42)
接下来,我们计算40和42的素因式分解:
40 = 2*2*2*5 => g(40) = g(2)*g(2)*g(2)*g(5) = g(5)
42 = 2*3*7 => g(42) = g(2)*g(3)*g(7) = g(3)*g(7)
对于这些小的素数,我们得到
g(3) = g(2) + g(4) = 1 + 1 = 2
g(5) = g(4) + g(6) = 1 + 2 = 3
g(7) = g(6) + g(8) = 2 + 1 = 3
这意味着
g(41) = g(40) + g(42) = g(5) + g(3)*g(7) = 3 + 2*3 = 9
和
g(1025) = g(5)*g(5)*g(41) = 3*3*9 = 81
测试用例
这是g的值,最大为50。
2 -> 1
3 -> 2
4 -> 1
5 -> 3
6 -> 2
7 -> 3
8 -> 1
9 -> 4
10 -> 3
11 -> 5
12 -> 2
13 -> 5
14 -> 3
15 -> 6
16 -> 1
17 -> 5
18 -> 4
19 -> 7
20 -> 3
21 -> 6
22 -> 5
23 -> 7
24 -> 2
25 -> 9
26 -> 5
27 -> 8
28 -> 3
29 -> 9
30 -> 6
31 -> 7
32 -> 1
33 -> 10
34 -> 5
35 -> 9
36 -> 4
37 -> 11
38 -> 7
39 -> 10
40 -> 3
41 -> 9
42 -> 6
43 -> 11
44 -> 5
45 -> 12
46 -> 7
47 -> 9
48 -> 2
49 -> 9
50 -> 9
a(2*n) = a(n)
,并且a(2*n+1) = a(n) + a(n+1)
认为如果2*n+1
是素数。对于许多其他奇数,这些序列可能是巧合的。
15, 21, 25, 29, 33, 41
,和一帮多,但我无法找到任何真正的模式为什么。)