Ajude Gödel com sua função β [fechado]


13

A função β de Gödel usa três números naturais como argumentos.

É definido como β(x,y,z) = rem(x, 1 + (z + 1) · y) = rem(x, (z · y + y + 1) )

onde rem (a, b) denota o restante após a divisão inteira de a por b.

O lema β agora declara que:

Para qualquer sequência de números naturais (k_0, k_1,…, k_n), existem números naturais bec que, para todo i ≤ n, β (b, c, i) = k_i.

Gödel precisa de ajuda para encontrar be cpara qualquer entrada (k_0, k_1, … , k_n), k_i ∈ ℕ.


Escreva uma função que tenha uma matriz de comprimento n, preenchida com números naturais, e forneça uma b,csaída possível que atenda ao lema da matriz.


Não obtenha soluções por força bruta!

(Na minha opinião totalmente pouco profissional, é uma força bruta quando você obtém um número e depois faz o cálculo. Isso é adivinhar o número e depois verificar se o palpite estava correto. O que eu quero ser codificado aqui é uma solução que calcula o números e não precisa verificar se eles cumprem o lema porque foram calculados para isso.)

Construa-os com as equações e informações fornecidas. O código mais curto ganha, pontos de bônus se você o fizer, Javascriptporque eu estou entrando nele:)


Exemplo:

[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
Bem-vindo ao PPCG! Esta é uma boa primeira pergunta, mas eu recomendaria adicionar alguns casos de teste para torná-lo mais claro.
Laikoni

4
@Tweakimp Mesmo assim, um único exemplo trabalhado pode ajudar a esclarecer a definição bastante formal.
Martin Ender


1
Não está claro o que qualifica como "força bruta". Obviamente, uma abordagem que itera por todos os pares (b, c)até encontrar uma que funcione seria força bruta, e uma abordagem que corre no tempo linear no comprimento da entrada não seria, mas existe uma grande lacuna entre elas. Onde é traçada a linha?
Peter Taylor

6
Alguém disse Beta?
Beta Decay

Respostas:


3

JavaScript (ES6), 104 bytes

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

Retorna [c, b]como uma matriz. A solução que ele retorna não é mínima, cmas acho que é mínima bpara o dado c. Para 120 bytes, isso retorna soluções mínimas para dentro ce bpara o dado 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)

Solucionador de solução mínima não-jogado:

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
Ótimo! Você seria tão gentil e comentar o código? :)
Tweakimp
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.