琐碎的序列的扭曲


15

介绍

考虑定义如下的整数f的序列:

  1. f(2)= 2
  2. 如果n是奇数素数,则f(n)=(f(n-1)+ f(n + 1))/ 2
  3. 如果n = p·q是合成的,则f(n)= f(p)·f(q)

不难发现每n≥2 f(n)= n,因此计算f并不是一个非常有趣的挑战。让我们改变一下定义:将第一种情况减半,第二种情况加倍。我们得到一个新的序列g,定义如下:

  1. g(2)= 1
  2. 如果n是奇质数,则g(n)= g(n-1)+ g(n + 1)
  3. 如果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)

接下来,我们计算4042的素因式分解:

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

极其相似A002487,而尚未(在不同的15, 21, 25, 29, 33, 41,和一帮多,但我无法找到任何真正的模式为什么。)
加布里埃尔Benamy

@GabrielBenamy好吧,我的序列也令人满意a(2*n) = a(n),并且a(2*n+1) = a(n) + a(n+1)认为如果2*n+1是素数。对于许多其他奇数,这些序列可能是巧合的。
Zgarb

返回True而不是1是可以接受的吗?
丹尼斯,

@Dennis面临的挑战是关于评估数字函数,而不是决策问题,因此我认为不会。
帕维尔

1
@Pavel虽然有很多人的支持,但至少在Python中,True在所有意图和目的上都像1
丹尼斯,

Answers:


7

Haskell,69个字节

x#a|x<3=1|a>x=a#2+(x-1)#2|mod x a<1,a<x=a#2*div x a#2|b<-a+1=x#b
(#2)

用法示例:(#2) 1025->81

将对参数a进行递增计数,直到它除以x或达到x(即为x质数)为止。它要测试一个短一个字节,a > xa < x在模数测试中添加另一个条件()而不是测试a == x,因为前者绑定ax+1,这有助于递归调用。比较:

|a==x=(x+1)#2+(x-1)#2|mod x a<1=
|a>x=a#2+(x-1)#2|mod x a<1,a<x=

4

果冻,18字节

‘;’Ñ€Sµ1n2$?
ÆfÇ€P

在线尝试!

这基本上只是规范的直接翻译。(经过一番思考后,我怀疑如果有一个封闭的公式来查找序列,那么比直接方法要多得多的字节数。)

说明

我们有两个相互递归的函数。这是辅助函数(用于计算素数n的g(n)):

‘;’Ñ€Sµ1n2$?
           ?  If
        n2$     the input is not equal to 2 (parsed as a group due to $)
      µ       then do all the following (parsed as a group due to µ):
‘;’             Find the list [n+1, n-1];
   р           Call the main program on each element (i.e. [g(n+1),g(n-1)]);
     S          and return the sum of the list (i.e. g(n+1)+g(n-1)).
              Otherwise:
       1        Return 1.

这是主程序,它为任何n计算g(n)

ÆfÇ€P
Æf            Factorize the input into its prime factors;
  ǀ          Call the helper function on each element of that list;
    P         Then take the product.

显然,如果我们以质数调用主程序,则除了以外的所有内容都是无操作的Ç,因此在这种情况下它将返回g(n)。程序的其余部分处理复合n的行为。


4

JavaScript(ES6),59个字节

f=(n,d=2)=>n-2?d<n?n%d?f(n,d+1):f(n/d)*f(d):f(n-1)+f(n+1):1

测试


3

Python 2,85 69字节

g=lambda n,k=3:(n&~-n<1)or n%k and g(n,k+2)or(g(k+1)+g(k-1))*g(n/k,k)

3

果冻,13个字节

Æfḟ2µ‘,’߀€SP

在线尝试!

怎么运行的

Æfḟ2µ‘,’߀€SP  Main link. Argument: n

Æf             Yield the array of prime factors of n.
  ḟ2           Remove all occurrences of 2.
    µ          Begin a new, monadic chain. Argument: A (array of odd prime factors)
     ‘         Increment all elements of A.
       ’       Decrement all elements of A.
      ,        Pair; yield [A+1, A-1].
        ߀€    Map the main link over all elements of A+1 and A-1.
           S   Column-wise reduce by addition.
            P  Reduce by multiplication.

3

Clojure,126个字节

(defn t[n](if(= n 2)1(let[a(+(.indexOf(for[b(range 2 n)](mod n b)2)0))](if(> a 1)(*(t(/ n a))(t a))(+(t(dec n))(t(inc n)))))))

好极了!它几乎是Python答案的两倍!

脱节和解释:

(defn trivial [n]
  ; Define the function.
  (if (= n 2) 1
  ; If the number is 2, return 1
    (let [a (+ 2 (.indexOf (for [b (range 2 n)] (mod n b)) 0))]
      ; Let a be the lowest prime factor of n
      (if (> a 1)
        ; The .indexOf function returns -1 if a is a prime, so -1 + 2 = 1.
        ; Checks if a is a prime.
        (* (trivial (/ n a)) (trivial a))
        ; If a is prime, return the trivial(a/n) * trivial(a).
        (+ (trivial (dec n)) (trivial (inc n)))))))
        ; Else, return trivial(n-1) + trivial(n + 1).

酷,我不知道你能做到(.indexOf (for [...] ...) x)
NikoNyrh,2017年

当前的118字节版本返回11 (t 1025),也许if是这样:when?但是然后nth空列表抛出IndexOutOfBoundsException
NikoNyrh

@NikoNyrh是的,这不应该发生-我也对其进行了测试,并且代码无效。将恢复为原始版本。
基督教

2

Mathematica,83个字节

Which[#<4,#-1,PrimeQ@#,Tr[#0/@({#-1,#+1}/2)],0<1,1##&@@#0/@Divisors@#~Part~{2,-2}]&

一个正整数参数的未命名递归函数,返回一个整数。最后,还没有那么短。Tr[#0/@({#-1,#+1}/2)](在输入为素数的情况下)在有序对的两个成员上调用该函数{(#-1)/2,(#+1)/2}并添加结果;这很好,因为该函数在(#-1)/2和处具有相同的值#-1。同样,1##&@@#0/@Divisors@#~Part~{2,-2}在第二小除数#和它的对数除数(第二大除数)上调用函数,并将答案相乘。


未命名的递归函数如何工作?
Pavel

1
退房的部分大约#0这个答案
格雷格·马丁

2

Clojure,120字节

(defn g[n](if(= n 2)1(if-let[F(first(for[i(range 2 n):when(=(mod n i)0)]i))](*(g F)(g(/ n F)))(+(g(dec n))(g(inc n))))))

用途:when得到的除数nF就是nil如果没有这样的除数被找到(n为素数)。


先生,你想吵架吗?开了 (友好竞争?)
clismique

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.