Amed писал(а):Вон с российской эстрады!
На*** с пляжа!
Amed писал(а):Вон с российской эстрады!
#Compile Exe
#Dim All
Function PBMain () As Long
Local R As Long
Randomize Cvs(Chr$(4,250,69,45))
For r = 1 To 6
Print Chr$(Rnd(65,88));
Next r
Print " "
Randomize Cvs(Chr$(1,64,241,237))
For r = 1 To 5
Print Chr$(Rnd(65,83));
Next r
Print " "
Randomize Cvs(Chr$(2,210,122,195))
For r = 1 To 6
Print Chr$(Rnd(65,88));
Next r
Print " "
WaitKey$
End Function
Я не математик, так что извините, если что не так Метод был придуман в начале 90-х годов Денисовым В.Е. И первая реализация была осуществлена коллективом ТОО "Гамма-фильм тем самым, чьи игры выходили из издательства Gamos.
Идея метода проста - представить последовательность байт a1,a2,?an. Как результат работы некоторой функции F(x1,x2,..xn).
То есть:
F1(x1...xn)=a1
F2(x1..xn)=a2
и т.д. в итоге Fn(x1..xn)=an. Если набор аргументов x1..xn в памяти компьютера занимает объём меньше чем a1..an то на лицо происходит сжатие данных.
В качестве функции был взят генератор случайных чисел, который по Кнуту имеет вид:
Хn=(a*Xn-1 +с) mod m.
Данная функция давала возможность при использовании аргументов получать последовательности по размеру больше размера аргументов. Первоначально данный метод применялся на 286-х для сжатия картинок. Тогда он полностью провалился, так как либо подбор аргументов происходил слишком долго, либо коэффициент сжатия был слишком низкий. Да и идеальная картинка для этого метода должна выглядеть как набор случайных пикселей. В таком случае последовательности достигали длинны в 70-80 байт притом, что в качестве аргументов использовались 4-х байтные числа. А подбор таких последовательностей шёл несколько суток.
Прошло 10 лет и вот долго собираясь, решил я проверить этот метод на моём PII-450.
И так метод является методом ?сжатия? без потерь. Идеально должен работать на файлах с минимальным кол-вом повторяющихся элементов - я пробовал на *.png.
В качестве первого приближения взял в качестве генератора стандартный перловский rand.
Алгоритм такой:
1) Задаётся $KS отвечающее за коэффициент сжатия и соответственно за время работы
2) Из исходного файла берём $KS байт
3) Генерируем случайным образом начальное значение $Start
4) Генерируем последовательности длинной $KS с srand($Start)
5) Если последовательности совпадают, записываем $Start в конечный файл, иначе возвращаемся в пункт 3
6) Если не конец файла возвращаемся в пункт 2
На выходе имеем файл, состоящий из начальных значений.
Результаты тестирования такие:
Последовательность в 3 байта ($KS=3) подбирается от 20с до 2 -х минут при длине $Start в 2 байта. На более длинные последовательности у меня не хватает терпения:)
Где можно применять данный метод?
Я пока вижу две области:
1) прямое назначение - компрессия. Но применять его надо поверх любого алгоритма, который уменьшает кол-во повторяющихся элементов, например LZW.
2) Криптография - представим, что в формуле из Кнута начальное X0 достаточно длинное число, например в 256 бит, тогда изъяв его из конечного файла, мы получаем файл, раскрыть который достаточно сложно, тем более что на входе мы работаем не с исходными данными, а обработанными и приведёнными к виду с наименьшим числом повторений.
3) При применении повторно снова можно получать компресиию. В теории вообще получается что если неоднократно применять данный метод то можно получить в конечном итоге одно стартовое значение, кожффициент сжатия и кол-во применений алгоритма к файлу.
Минус - на практики теория подтверждена не полностью всвязи с тем что подбор последовательностей занимает много времени.
Debugger писал(а):Конечно.
Сжатие до 1 числа - это такой бред. Попробуйте запихнуть rar-ку в rar-ку и так далее. Сжатие будет сильнее? Сомневаюсь.
Debugger писал(а):Конечно.
Сжатие до 1 числа - это такой бред. Попробуйте запихнуть rar-ку в rar-ку и так далее. Сжатие будет сильнее? Сомневаюсь.
#Compile Exe
#Dim All
Function PBMain () As Long
Local R As Long
Randomize Cvs(Chr$(1,122,19,22))
For r = 1 To 5
Print Chr$(Rnd(65,88));
Next r
Print " " ;
Randomize Cvs(Chr$( 1, 74, 137, 195))
For r = 1 To 5
Print Chr$(Rnd(65,88));
Next r
Print " "
WaitKey$
End Function
Дык, сладкий мой, "генератор" это то же информация, которая то же имеет объем.можно найти такое стартовое число, и такой генератор,
jangle писал(а):Единственное, что нужно для создания такого супер архиватора - неисчерпаемые вычислительные ресурсы, т.е. квантовый компьютер.
ANDLL писал(а):генератор" это то же информация, которая то же имеет объем.
Сразу чувствуется гуманитарный склад ума - ни малейшей попытки анализа.
Тут уж определись - что будет в твоем "архиве"? Затравка генератора, или еще и сам генератор?
Ты просто фразу где-то услышал "квантовый компьютер", или как?
То есть генератор(функция) будет один для всех последовательностей? А передавать будешь одну лишь затравку?Ты же не пересылаешь дистрибутив WinRar`a вместе с каждым архивом. У получателя информации уже установлен архиватор (генератор). По каналу связи - передаем стартовое число для генератора. Получатель генерирует с его помощью гамму - которая собственно и является передаваемым сообщением.
ANDLL писал(а):То есть генератор(функция) будет один для всех последовательностей? А передавать будешь одну лишь затравку?
Randomize Cvs(Chr$(1,122,19,22))
For r = 1 To 5: Print Chr$(Rnd(65,88)):Next r
jangle писал(а):Вероятно с помощью этого алгоритма, можно сжать "Войну и Мир", в одно число
А развер "числа" всегда фиксированный или каждый раз разный?Ну да, к примеру передаем по каналу связи 4 байта
karlex писал(а):Одно число понятие растяжимое, сколько циферок будет в этом числе?
Так же можно и результат сжатия RAR'ом назвать "одним числом", почему бы и нет?
ANDLL писал(а):А развер "числа" всегда фиксированный или каждый раз разный?
ANDLL писал(а):То есть ты предлагаешь алгоритм сжатия шести байт в четыре?
ANDLL писал(а):Я надеюсь понятно, что алгоритма который сжимает произвольные 6 байтов в 4 не существует в природе?
То есть некоторые "шестерки" байтов ты будешь сжимать до четырех, а некоторые - не будешь сжимать.
Вопрос - с чего ты взял что в исходных данных(которые скажем zip-архив) "сжимаемых" шестерок окажеться сколько нибудь существенное количество?
Debugger писал(а):Интересно.
А теперь докажи, что твои 4 байта будут обязательно раскодированы как определенные 6. ИМХО, есть вероятность, что результат раскодирования будет не равен исходному. Подумаем логикой. Если ко всем 6-байтным последовательностям повесить уникальные номерки, то их количество нельзя запихать в 4 байта.
#Compile Exe
#Dim All
Function PBMain () As Long
Local R As Long
Randomize Cvs(Chr$(1,153,128,181))
For r = 1 To 6
Print Chr$(Rnd(65,78));
Next r
Print " " ;
WaitKey$
End Function
Хотелось бы увидеть обоснованиеСжатые данные - очень похожи по статистическому распределению на псевдослучайную последовательность.
Хотелось бы увидеть обоснование
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 83