Giúp Gôdel với chức năng [của mình [đóng]


13

Hàm Gö của Godel lấy ba số tự nhiên làm đối số.

Nó được định nghĩa là β(x,y,z) = rem(x, 1 + (z + 1) · y) = rem(x, (z · y + y + 1) )

trong đó rem (a, b) biểu thị phần còn lại sau khi chia số nguyên của a cho b.

Β Bổ đề bây giờ nói rằng:

Đối với bất kỳ chuỗi số tự nhiên nào (k_0, k_1, Mạnh, k_n), có các số tự nhiên b và c sao cho, với mọi i ≤ n, (b, c, i) = k_i.

Gôdel cần giúp đỡ để tìm bccho bất kỳ đầu vào nào (k_0, k_1, … , k_n), k_i ∈ ℕ.


Viết hàm lấy một mảng có độ dài n, chứa đầy các số tự nhiên và đưa ra một b,cđầu ra có thể đáp ứng Bổ đề cho mảng.


Đừng có giải pháp bằng vũ lực!

(Theo ý kiến ​​hoàn toàn không có lợi của tôi, đó là sức mạnh vũ phu khi bạn lần đầu tiên nhận được một số và sau đó thực hiện phép tính. Đó là đoán số và sau đó tìm xem đoán có đúng không. Điều tôi muốn được mã hóa ở đây là một giải pháp tính toán những con số và không phải kiểm tra xem chúng có đáp ứng bổ đề hay không bởi vì chúng được tính toán để làm như vậy.)

Xây dựng chúng với các phương trình và thông tin đã cho. Mã ngắn nhất sẽ thắng, điểm thưởng nếu bạn làm điều đó Javascriptbởi vì tôi chỉ đang tham gia vào nó:)


Thí dụ:

[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
Chào mừng đến với PPCG! Đây là một câu hỏi đầu tiên hay, nhưng tôi khuyên bạn nên thêm một số trường hợp thử nghiệm để làm cho nó rõ ràng hơn.
Laikoni

4
@Tweakimp Mặc dù vậy, một ví dụ hoạt động duy nhất có thể giúp làm rõ định nghĩa khá chính thức.
Martin Ender


1
Không rõ những gì đủ điều kiện là "lực lượng vũ phu". Rõ ràng là một cách tiếp cận lặp đi lặp lại qua tất cả các cặp (b, c)cho đến khi tìm thấy một cách hoạt động sẽ là lực lượng vũ phu, và một cách tiếp cận chạy theo tuyến tính theo thời gian theo chiều dài của đầu vào sẽ không có, nhưng có một khoảng cách lớn giữa các cặp . Đường vẽ ở đâu?
Peter Taylor

6
Có ai nói Beta không?
Beta Decay

Câu trả lời:


3

JavaScript (ES6), 104 byte

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

Trả về [c, b]dưới dạng một mảng. Giải pháp mà nó trả về không phải là tối thiểu cnhưng tôi nghĩ nó là tối thiểu bcho c. Đối với 120 byte, điều này trả về các giải pháp tối thiểu trong cbcho 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)

Giải quyết tối thiểu giải quyết:

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
Tuyệt quá! Bạn sẽ rất tử tế và nhận xét mã? :)
Tweakimp
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.