Ý tưởng này xảy ra với tôi khi còn bé học lập trình và lần đầu tiên gặp PRNG. Tôi vẫn không biết nó thực tế như thế nào, nhưng bây giờ có trao đổi ngăn xếp.
Đây là sơ đồ của một đứa trẻ 14 tuổi cho một thuật toán nén tuyệt vời:
Lấy một PRNG và gieo nó bằng hạt giống s
để có được một chuỗi dài các byte giả ngẫu nhiên. Để truyền chuỗi đó cho một bên khác, bạn chỉ cần truyền đạt một mô tả về PRNG, hạt giống thích hợp và độ dài của tin nhắn. Đối với một chuỗi đủ dài, mô tả đó sẽ ngắn hơn nhiều so với chính chuỗi đó.
Bây giờ giả sử tôi có thể đảo ngược quá trình. Có đủ thời gian và tài nguyên tính toán, tôi có thể thực hiện tìm kiếm vũ phu và tìm hạt giống (và PRNG, hay nói cách khác: một chương trình) tạo ra chuỗi mong muốn của tôi (Giả sử một bức ảnh thú vị về những chú mèo tinh nghịch).
Các PRNG lặp lại sau khi đã tạo ra một số lượng bit đủ lớn, nhưng so với các chu kỳ "thông thường" thì thông điệp của tôi khá ngắn nên điều này dường như không có vấn đề gì.
Voila, một cách hiệu quả (nếu rube-Goldbergian) để nén dữ liệu.
Vì vậy, giả sử:
- Trình tự tôi muốn nén là hữu hạn và được biết trước.
- Tôi không thiếu tiền mặt hoặc thời gian (Chỉ cần một lượng hữu hạn của cả hai)
Tôi muốn biết:
- Có một lỗ hổng cơ bản trong lý luận đằng sau kế hoạch này?
- Cách tiêu chuẩn để phân tích các loại thí nghiệm suy nghĩ này là gì?
Tóm lược
Đó thường là trường hợp câu trả lời tốt làm rõ không chỉ câu trả lời, mà đó là điều tôi thực sự hỏi. Cảm ơn sự kiên nhẫn và câu trả lời chi tiết của mọi người.
Đây là nỗ lực thứ n của tôi trong phần tóm tắt các câu trả lời:
- Góc PRNG / hạt giống không đóng góp gì cả, nó không khác gì một chương trình tạo ra chuỗi mong muốn làm đầu ra.
- Nguyên tắc pigeonhole: Có nhiều thông điệp có độ dài> k hơn so với các chương trình (tạo tin nhắn) có độ dài <= k. Vì vậy, một số chuỗi đơn giản không thể là đầu ra của một chương trình ngắn hơn thông báo.
- Điều đáng nói là trình thông dịch của chương trình (tin nhắn) nhất thiết phải được sửa trước. Và thiết kế của nó xác định tập hợp con (nhỏ) của các tin nhắn có thể được tạo khi nhận được tin nhắn có độ dài k.
Tại thời điểm này, ý tưởng PRNG ban đầu đã chết, nhưng có ít nhất một câu hỏi cuối cùng để giải quyết:
- H: Tôi có thể gặp may mắn và thấy rằng tin nhắn dài (nhưng hữu hạn) của tôi chỉ là đầu ra của một chương trình có độ dài <k bit?
Nói đúng ra, đó không phải là vấn đề may rủi vì ý nghĩa của mọi thông điệp (chương trình) có thể phải được biết trước. Đó là ý nghĩa của một số thông điệp của <k bit hoặc không .
Nếu tôi chọn một tin nhắn ngẫu nhiên> = k bit một cách ngẫu nhiên (tại sao tôi lại như vậy?), Trong mọi trường hợp tôi sẽ có xác suất biến mất khi có thể gửi nó bằng cách sử dụng ít hơn k bit và gần như chắc chắn không thể gửi nó hoàn toàn sử dụng ít hơn k bit.
OTOH, nếu tôi chọn một thông báo cụ thể> = k bit từ những bit là đầu ra của chương trình có ít hơn k bit (giả sử có một thông báo như vậy), thì thực tế tôi đang tận dụng các bit đã được truyền đến người nhận (thiết kế của trình thông dịch), được tính là một phần của thông điệp được chuyển.
Cuối cùng:
- Q: Tất cả những gì kinh doanh phức tạp entropy / kolmogorov này là gì?
Cuối cùng, cả hai đều nói với chúng ta điều tương tự như nguyên tắc pigeonhole (đơn giản hơn) cho chúng ta biết về mức độ chúng ta có thể nén: có lẽ không phải, có lẽ một số, nhưng chắc chắn không nhiều như chúng ta ưa thích (trừ khi chúng ta gian lận).