Pomóż Gödelowi w jego funkcji β [zamknięte]


13

Argumenty funkcji Gödela β przyjmują trzy liczby naturalne.

Jest zdefiniowany jako β(x,y,z) = rem(x, 1 + (z + 1) · y) = rem(x, (z · y + y + 1) )

gdzie rem (a, b) oznacza resztę po całkowitym dzieleniu a przez b.

Lemat β stwierdza teraz, że:

Dla dowolnej sekwencji liczb naturalnych (k_0, k_1,…, k_n) istnieją liczby naturalne b i c takie, że dla każdego i ≤ n, β (b, c, i) = k_i.

Gödel potrzebuje pomocy, aby znaleźć bi cdla danego wejścia (k_0, k_1, … , k_n), k_i ∈ ℕ.


Napisz funkcję, która przyjmuje tablicę długości n, wypełnioną liczbami naturalnymi i daje możliwe b,cdane wyjściowe, które spełniają lemat dla tablicy.


Nie zdobywaj rozwiązań brutalną siłą!

(Moim całkowicie nieprofesjonalnym zdaniem jest to brutalna siła, gdy najpierw dostajesz numer, a następnie wykonujesz obliczenia. To zgadywanie liczby, a następnie sprawdzanie, czy przypuszczenie było prawidłowe. To, co chcę zakodować, to rozwiązanie, które oblicza liczb i nie musi sprawdzać, czy spełniają lemat, ponieważ zostały do ​​tego obliczone).

Skonstruuj je na podstawie podanych równań i informacji. Najkrótszy kod wygrywa, punkty bonusowe, jeśli to zrobisz, Javascriptponieważ właśnie się w to włączam:)


Przykład:

[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
Witamy w PPCG! To miłe pierwsze pytanie, ale polecam dodanie kilku przypadków testowych, aby było bardziej jasne.
Laikoni,

4
@Tweakimp Mimo to pojedynczy działający przykład mógłby pomóc wyjaśnić raczej formalną definicję.
Martin Ender


1
Nie jest jasne, co kwalifikuje się jako „brutalna siła”. Oczywiście podejście, które przechodzi przez wszystkie pary, (b, c)aż znajdzie takie, które działa, byłoby brutalną siłą, a podejście, które biegnie w czasie liniowo na długości wejścia, nie byłoby, ale istnieje duża przerwa między nimi. Gdzie jest narysowana linia?
Peter Taylor

6
Czy ktoś powiedział Beta?
Beta Decay

Odpowiedzi:


3

JavaScript (ES6), 104 bajty

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

Zwraca [c, b]jako tablica. Rozwiązanie, które zwraca, nie jest minimalne, cale myślę, że jest minimalne bdla danego c. Dla 120 bajtów zwraca to rozwiązania minimalne dla ci bdla podanego 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 minimalne rozwiązanie solvera:

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
Świetny! Czy byłbyś tak uprzejmy i skomentował kod? :)
Tweakimp 15.04.17
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.