Помогите Геделю с его β-функцией [закрыто]


13

Β-функция Геделя принимает в качестве аргументов три натуральных числа.

Определяется как β(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) существуют натуральные числа b и c такие, что для каждого i ≤ n β (b, c, i) = k_i.

Гедель нуждается в помощи, чтобы найти bи cдля любого заданного вклада (k_0, k_1, … , k_n), k_i ∈ ℕ.


Напишите функцию, которая принимает массив длины n, заполненный натуральными числами, и дает возможный 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 байтов это возвращает решения, минимальные в cи bдля данного 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.