Ayuda a Gödel con su función β [cerrado]


13

La función β de Gödel toma tres números naturales como argumentos.

Se define como β(x,y,z) = rem(x, 1 + (z + 1) · y) = rem(x, (z · y + y + 1) )

donde rem (a, b) denota el resto después de la división entera de a por b.

El β Lemma ahora dice que:

Para cualquier secuencia de números naturales (k_0, k_1, ..., k_n), hay números naturales byc tales que, para cada i ≤ n, β (b, c, i) = k_i.

Gödel necesita ayuda para encontrar by cpara cualquier entrada dada (k_0, k_1, … , k_n), k_i ∈ ℕ.


Escriba una función que tome una matriz de longitud n, llena de números naturales, y dé una b,csalida posible que cumpla el Lema de la matriz.


¡No obtengas soluciones por fuerza bruta!

(En mi opinión totalmente poco profesional, es la fuerza bruta cuando obtienes un número y luego haces el cálculo. Eso es adivinar el número y luego ver si la suposición es correcta. Lo que quiero que se codifique aquí es una solución que calcula el números y no tiene que verificar si cumplen con el lema porque fueron calculados para hacerlo).

Construirlos con las ecuaciones y la información dada. El código más corto gana, puntos de bonificación si lo haces Javascriptporque solo estoy entrando en él:)


Ejemplo:

[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

55
Bienvenido a PPCG! Esta es una buena primera pregunta, pero recomendaría agregar algunos casos de prueba para que quede más claro.
Laikoni

44
@Tweakimp Aun así, un solo ejemplo trabajado podría ayudar a aclarar la definición bastante formal.
Martin Ender


1
No está claro qué califica como "fuerza bruta". Obviamente, un enfoque que recorre todos los pares (b, c)hasta encontrar uno que funcione sería la fuerza bruta, y un enfoque que se ejecute en el tiempo lineal en la longitud de la entrada no lo sería, pero hay una gran brecha entre ellos. ¿Dónde está dibujada la línea?
Peter Taylor

66
¿Alguien dijo Beta?
Beta Decay

Respuestas:


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

Devuelve [c, b]como una matriz. La solución que devuelve no es mínima, cpero creo que es mínima bpara lo dado c. Para 120 bytes, esto devuelve soluciones mínimas en cy bpara lo 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 soluciones mínimas sin golf:

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
¡Excelente! ¿Serías tan amable y comentarías el código? :)
Tweakimp
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.