Допоможіть Геделя з його β функцією [закрито]


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.

Gödel потребує допомоги, щоб знайти 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)

Нерельєфний мінімальний розчинник:

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.