Эта идея пришла мне в голову, когда я учился программировать и впервые столкнулся с PRNG. Я до сих пор не знаю, насколько это реалистично, но сейчас происходит обмен стека.
Вот схема 14-летнего ребенка для удивительного алгоритма сжатия:
Возьмите PRNG и начните его с seed, s
чтобы получить длинную последовательность псевдослучайных байтов. Чтобы передать эту последовательность другой стороне, вам нужно только передать описание PRNG, соответствующее начальное число и длину сообщения. Для достаточно длинной последовательности это описание будет намного короче, чем сама последовательность.
Теперь предположим, что я могу инвертировать процесс. Если бы у меня было достаточно времени и вычислительных ресурсов, я мог бы выполнить поиск методом «грубой силы» и найти начальное число (и PRNG, или, другими словами: программу), которое дает желаемую последовательность (скажем, забавное фото озорных кошек).
PRNG повторяются после генерации достаточно большого числа битов, но по сравнению с «типичными» циклами мое сообщение довольно короткое, поэтому это не кажется большой проблемой.
Вуаля, эффективный (если рубин-голдбергский) способ сжатия данных.
Итак, предполагая:
- Последовательность, которую я хочу сжать, конечна и известна заранее.
- У меня не хватает денег или времени (до тех пор, пока требуется ограниченное количество обоих)
Я хотел бы знать:
- Есть ли фундаментальный недостаток в обосновании схемы?
- Какой стандартный способ анализа подобных мысленных экспериментов?
Резюме
Часто хорошие ответы проясняют не только ответ, но и то, что я действительно спрашивал. Спасибо всем за терпение и подробные ответы.
Вот моя n-я попытка краткого изложения ответов:
- PRNG / начальный угол ничего не дает, это всего лишь программа, которая выдает желаемую последовательность в качестве выходных данных.
- Принцип "голубиных отверстий": сообщений с длиной> k гораздо больше, чем (генерирующих сообщения) программ с длиной <= k. Таким образом, некоторые последовательности просто не могут быть результатом программы, короче, чем сообщение.
- Стоит отметить, что интерпретатор программы (сообщения) обязательно фиксируется заранее. И его дизайн определяет (небольшое) подмножество сообщений, которые могут быть сгенерированы, когда получено сообщение длиной k.
На данный момент оригинальная идея PRNG уже мертва, но есть еще один последний вопрос:
- В: Могу ли я получить удачу и обнаружить, что мое длинное (но конечное) сообщение просто является результатом программы длиной <k бит?
Строго говоря, это не случайность, поскольку значение каждого возможного сообщения (программы) должно быть известно заранее. Либо это значение некоторого сообщения от <K битов или нет .
Если я выберу случайное сообщение случайным образом> = k бит (зачем мне?), У меня в любом случае будет исчезающая вероятность того, что я смогу отправить его, используя меньше чем k бит, и почти наверняка не смогу отправить это вообще использует меньше чем k бит.
OTOH, если я выберу определенное сообщение из> = k битов из тех, которые являются выходом программы менее чем k бит (при условии, что такое сообщение есть), то в действительности я использую преимущества битов, уже переданных в получатель (дизайн переводчика), который считается частью передаваемого сообщения.
В заключение:
- Q: Что все это за энтропия / колмогоровская сложность бизнеса?
В конечном счете, оба говорят нам то же самое, что (более простой) принцип «голубиных отверстий» говорит нам о том, сколько мы можем сжать: возможно, совсем нет, возможно, некоторые, но определенно не так, как нам кажется (если мы не обманываем).