Hilf Gödel bei seiner β-Funktion


13

Gödels β-Funktion verwendet drei natürliche Zahlen als Argumente.

Es ist definiert als β(x,y,z) = rem(x, 1 + (z + 1) · y) = rem(x, (z · y + y + 1) )

wobei rem (a, b) den Rest nach ganzzahliger Division von a durch b bezeichnet.

Das β-Lemma besagt nun, dass:

Für jede Folge von natürlichen Zahlen (k_0, k_1,…, k_n) gibt es natürliche Zahlen b und c, so dass für jedes i ≤ n β (b, c, i) = k_i gilt.

Gödel braucht Hilfe bei der Suche nach bund cfür einen bestimmten Input (k_0, k_1, … , k_n), k_i ∈ ℕ.


Schreiben Sie eine Funktion, die ein nmit natürlichen Zahlen gefülltes Array von Länge einnimmt und eine mögliche b,cAusgabe liefert , die das Lemma für das Array erfüllt.


Erhalten Sie keine Lösungen mit roher Gewalt!

(Meiner völlig unprofessionellen Meinung nach ist es brachiale Gewalt, wenn man zuerst eine Zahl erhält und dann die Berechnung durchführt. Das bedeutet, die Zahl zu erraten und dann zu prüfen, ob die Vermutung richtig war. Was ich hier codieren möchte, ist eine Lösung, die die berechnet Zahlen und muss nicht überprüfen, ob sie das Lemma erfüllen, weil sie dazu berechnet wurden.)

Konstruieren Sie sie mit den angegebenen Gleichungen und Informationen. Der kürzeste Code gewinnt, Bonuspunkte, wenn Sie es tun, Javascriptweil ich gerade dabei bin:)


Beispiel:

[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
Willkommen bei PPCG! Dies ist eine nette erste Frage, aber ich würde empfehlen, einige Testfälle hinzuzufügen, um es klarer zu machen.
Laikoni

4
@Tweakimp Trotzdem könnte ein einzelnes Beispiel helfen, die eher formale Definition zu verdeutlichen.
Martin Ender


1
Es ist nicht klar, was als "Brute Force" zu qualifizieren ist. Offensichtlich wäre ein Ansatz, der alle Paare durchläuft, (b, c)bis einer gefunden wird, der funktioniert, rohe Gewalt, und ein Ansatz, der zeitlich linear in der Länge der Eingabe verläuft, nicht, aber es gibt eine große Lücke zwischen diesen. Wo ist die Linie gezeichnet?
Peter Taylor

6
Hat jemand Beta gesagt?
Beta Decay

Antworten:


3

JavaScript (ES6), 104 Byte

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)]

Gibt [c, b]als Array zurück. Die Lösung, die es zurückgibt, ist nicht minimal in, caber ich denke, es ist minimal in bfür das gegebene c. Für 120 Bytes gibt dies Lösungen zurück, die in cund bfür das gegebene minimal sind 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-Minimallösungslöser:

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
Groß! Würdest du so nett sein und den Code kommentieren? :)
Tweakimp
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.