Tôi muốn mã hóa các số nguyên dương xthành các bit, theo cách cho phép giải mã trở lại các số nguyên ban đầu cho một bộ giải mã không trạng thái biết giá trị tối đa mcủa mỗi số x; có thể giải mã duy nhất sự kết hợp của mã hóa, như trường hợp trong mã hóa Huffman.
[Phần giới thiệu ở trên thúc đẩy phần còn lại, nhưng không phải là một phần của định nghĩa chính thức]
Ký hiệu: đối với bất kỳ số nguyên không âm nào i, hãy n(i)là số bit cần thiết để biểu diễn idưới dạng nhị phân; đó là số nguyên không âm nhỏ nhất ksao choi>>k == 0
i : 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ..
n(i): 0 1 2 2 3 3 3 3 4 4 4 4 4 4 4 4 5 5 5 ..
Tôi muốn một hàm F(x,m)được xác định cho 0<xvà x<=m, với đầu ra là một chuỗi ' 0' hoặc ' 1', có các thuộc tính này:
F(x,m)có chiều dài nhỏ hơn2*n(x)hoặc2*n(m)-1, cái nào nhỏ hơn.- Nếu
x<ysau đó:F(x,m)không dài hơnF(y,m);F(x,m)vàF(y,m)khác nhau ở một số vị trí theo chiều dàiF(x,m);- có một
0ởF(x,m)vị trí đầu tiên như vậy.
- Khi cho một số
mxếp hạng 1 và 2 không xác định duy nhấtF(x,m)cho tất cả tích cựcxở hầu hếtm, chúng tôi từ chối bất kỳ mã hóa cho một cònF(x,m)hơn một số mã khác có thể chấp nhận, vì nhỏ nhấtxmà chiều dài không khớp.
Lưu ý: Ở phía trên, ngầm, 0<x, 0<y, 0<m, x<=m, và y<=m, do đó F(x,m)và F(y,m)được xác định.
Nó được yêu cầu chương trình ngắn nhất, đưa ra bất kỳ xvà mđáp ứng các ràng buộc trên và tối đa 9 chữ số thập phân, đưa ra sự F(x,m)phù hợp với các quy tắc trên. Khung C sau (hoặc tương đương với các ngôn ngữ khác) không được tính:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define C(c) putchar((c)?'1':'0') // output '0' or '1'
#define S(s) fputs((s),stdout) // output a string
typedef unsigned long t; // at least 32 bits
void F(t x,t m); // prototype for F
int main(int argc,char *argv[]){
if(argc==3)F((t)atol(argv[1]),(t)atol(argv[2]));
return 0;}
void F(t x,t m) { // counting starts on next line
} // counting ends before this line
Nhận xét: Thuộc tính 1 tích cực giới hạn độ dài được mã hóa; thuộc tính 2 chính thức hóa việc giải mã rõ ràng là có thể, và hợp thức hóa mã hóa; Tôi khẳng định (không có bằng chứng) điều này là đủ để xác định duy nhất đầu ra Fkhi nào m+1là lũy thừa của hai và thuộc tính 3 đó là đủ để xác định duy nhất Fcho khác m.
Đây là một phần bảng (thủ công; phiên bản đầu tiên được đăng bị lỗi, xin lỗi):
x : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
F(x,1) : empty
F(x,2) : 0 1
F(x,3) : 0 10 11
F(x,4) : 0 10 110 111
F(x,5) : 0 10 110 1110 1111
F(x,6) : 0 100 101 110 1110 1111
F(x,7) : 0 100 101 1100 1101 1110 1111
F(x,8) : 0 100 101 110 11100 11101 11110 11111
F(x,15) : 0 100 101 11000 11001 11010 11011 111000 111001 111010 111011 111100 111101 111110 111111
11111, làm cho việc giải mã trở nên khó khăn. Với mã hóa được đề xuất, việc kết hợp một số đầu ra có thể được giải mã duy nhất (bao gồm cả mthay đổi tối đa một cách linh hoạt). Tôi đã cố gắng làm rõ điều đó.