ゲーデルのβ関数を手伝う[終了]


13

ゲーデルのβ関数は、3つの自然数を引数として取ります。

次のように定義されます β(x,y,z) = rem(x, 1 + (z + 1) · y) = rem(x, (z · y + y + 1) )

ここで、rem(a、b)は、aをbで整数除算した後の剰余を示します。

β補題は次のように述べています:

自然数のシーケンス(k_0、k_1、…、k_n)には、i≤nごとにβ(b、c、i)= k_iとなる自然数bとcがあります。

ゲーデルは見つけるために助けを必要とbし、c任意の入力のために(k_0, k_1, … , k_n), k_i ∈ ℕ


n自然数で満たされたlengthの配列を受け取り、配列のb,c補題を満たす可能性のある出力を与える関数を作成します。


総当たりで解決策を得ないでください!

(私の完全に非専門家の意見では、最初に数字を取得してから計算するときは総当たりです。それは数字を推測し、次に推測が正しいかどうかを調べることです。ここでコーディングしたいのは、それらはそうするように計算されたため、補助定理を満たしているかどうかをチェックする必要はありません。)

与えられた方程式と情報でそれらを構築します。最短コード勝ボーナスポイントあなたがそれを行う場合Javascript、私はちょうどそれに取得していますので、:)


例:

[5, 19, 7, 8] -> (1344595, 19)
1344505 % (1 + (0 + 1) * 19) = 5
1344505 % (1 + (1 + 1) * 19) = 19
1344505 % (1 + (2 + 1) * 19) = 7
1344505 % (1 + (3 + 1) * 19) = 8

5
PPCGへようこそ!これは良い最初の質問ですが、より明確にするために、いくつかのテストケースを追加することをお勧めします。
ライコニ

4
@Tweakimpたとえそうであっても、単一の有効な例は、かなり正式な定義を明確にするのに役立ちます。
マーティンエンダー


1
何が「ブルートフォース」とみなされるかは明確ではありません。明らかに、機能するペア(b, c)が見つかるまですべてのペアを反復するアプローチは強引であり、入力の長さで線形に実行されるアプローチはそうではありませんが、それらの間に大きなギャップがあります。線はどこに描かれますか?
ピーターテイラー

6
誰かがベータと言いましたか?
ベータ崩壊

回答:


3

JavaScript(ES6)、104バイト

a=>[c=a.reduce(c=>c*++i,Math.max(...a),i=0),a.reduce(g=(x,k)=>x%m-k?g(x+n,k):(n*=m,m+=c,x),0,n=1,m=c+1)]

[c, b]配列として返します。それが返すソリューションは最小ではありませんcが、私はそれがb与えられたために最小であると思いますc。120バイトの場合、これは、指定cbれた最小および最小のソリューションを返しますc

f=(a,c=1,b=a.reduce(g=(x,k)=>x%m-k?d--?g(x+n,k):0/0:n%m?g(x,k,n+=o):(o=n,d=m+=c,x),0,o=n=1,d=m=c+1))=>1/b?[b,c]:f(a,c+1)

Ungolfed最小解ソルバー:

function godel(a) {
    for (c = 0;; c++) {
        var b = 0, n = 1, i = 0;
        for (;;) {
            var m = c * i + c + 1;
            // Increase b until β(b,c,i) = a[i]
            // Adding n won't change output for smaller i
            for (j = 0; j < m; j++) if (b % m != a[i]) b += n;
            if (j == m) break; // couldn't find a remainder, c too low
            i++;
            if (i == a.length) return [b, c]; // Result!
            // Next time we want adding n to b not to change β(b,c,i)
            for (j = 1; n * j % m != 0; j++);
            n *= j;
        }
    }
}

1
すごい!あなたはとても親切で、コードにコメントしますか?:)
Tweakimp
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.