些細なシーケンスのひねり


15

前書き

次のように定義された整数fのシーケンスを考えます。

  1. f(2)= 2
  2. もしnは奇素数である、そして、 =(N)F(+ F(N-1)F(N + 1))/ 2
  3. もしN = P・Qは、その後、複合体であるF(N)= F(P)・F(Q)

n≥2ごとにf(n)= nであることを確認するのはそれほど難しくありません。したがって、fの計算はそれほど興味深い課題ではありません。定義をひねりましょう。最初のケースを半分にし、2番目のケースを2倍にします。次のように定義された新しいシーケンス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)if 2*n+1が素数である場合に成り立ちます。他の多くの奇数では、シーケンスはおそらく偶然一致します。
ズガルブ

1ではなくTrueを返すことは可能ですか?
デニス

@Dennis課題は、決定問題ではなく数値関数を評価することなので、そうではないと思います。
パベル

1
@Pavel しかし、賛成で強力なサポートがあり、少なくともPythonでは、Trueはすべての意図と目的に対して1のように機能します。
デニス

回答:


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プライムになる)までカウントアップされます。をテストする代わりに1バイト短くテストし、モジュラステストにa > x条件(a < x)を追加するa == xと、前者がにバインドさaれるためx+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

オンラインでお試しください!

これは基本的に仕様の直接的な翻訳にすぎません。(少し考えた後、シーケンスを見つけるための閉じた式がある場合、直接的なアプローチよりも多くのバイトになると思います。)

説明

相互に再帰的な関数が2つあります。ヘルパー関数は次のとおりです(素数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の回答のほぼ2倍の長さです!

Ungolfedと説明:

(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)
ニコニール

現在の118バイトのバージョンを返すために11 (t 1025)、多分それはifあることを意図していましたか:when?しかし、その後nth、空のリストのスローIndexOutOfBoundsException
ニコニール

@NikoNyrhうん、それは起こらないはずです-私もそれをテストしましたが、コードは無効です。元のバージョンに戻ります。
clismique

2

Mathematica、83バイト

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

整数を返す、1つの正の整数引数の名前のない再帰関数。結局のところ、それほど短いわけではありません。Tr[#0/@({#-1,#+1}/2)](入力が素数の場合)順序付けられたペアの両方のメンバーで関数を呼び出し{(#-1)/2,(#+1)/2}、結果を追加します。関数がで同じ値を持っているので、これは結構です(#-1)/2#-1、例えば。同様1##&@@#0/@Divisors@#~Part~{2,-2}に、2番目に小さい除数#とその相補的除数(2番目に大きい除数)で関数を呼び出し、答えを乗算します。


名前のない再帰関数はどのように機能しますか?
パベル

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素数です)。


quarしますか?オンです。(フレンドリーな競争?)
clismique

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.