- •Министерство образования и науки российской федерации федеральное агентство по образованию
- •Захарова ю.Ф. Дискретная математика и ее приложения
- •Введение
- •Глава 1. Введение в теорию множеств.
- •1.1. Основные определения.
- •1.2. Задание множеств
- •1.3. Операции над множествами
- •1.4. Разбиения и покрытия
- •1.5. Представление множеств в эвм.
- •1.5.1. Включение множеств.
- •1.5.2. Объединение множеств.
- •1.5.3. Пересечение множеств.
- •Глава 2. Булева алгебра.
- •2.1. Основные элементарные функции.
- •2.2. Основные элементарные тождества.
- •2.3. Формы представления булевых функций.
- •2.4. Минимизация булевых функций.
- •2.4.1. Метод Куайна.
- •2.4.2. Метод Карно.
- •Глава 3. Исчисление высказываний и исчисление предикатов.
- •3.1. Исчисление высказываний.
- •3.2. Исчисление предикатов.
- •Глава 4. Теория сжатия текстовой информации.
- •4.1. Метод Хаффмена
- •4.1.1. Общие положения
- •4.1.2. Краткое описание метода Хаффмена.
- •4.1.3. Пример использования метода Хаффмена.
- •4.2. Метод Зива Лемпеля (lz-метод)
- •4.2.1. Основные определения
- •4.2.2. Краткое описание lz-метода
- •4.2.3. Пример lz-метода
- •4.3. Метод Зива-Лемпеля-Велча (lzw-метод)
- •4.3.1. Общие положения
- •4.3.2. Краткое описание lzw-метода
- •4.3.3. Пример lzw-метода.
- •4.4. Метод Барроуза-Уиллера.
- •4.4.1. Общие положения.
- •4.4.2. 1 Этап. Преобразование Барроуза-Уилера.
- •4.4.3. 2 Этап. Mtf–метод.
- •4.4.4. 3 Этап. Статистический кодер.
- •4.4.5. Модификации различных этапов.
- •4.4.6. Сравнение алгоритмов сжатия на базе bwt с другими методами.
- •Глава 5. Теория сжатия графической информации. Введение.
- •5.2. Волновой метод (wavelet-метод)
- •5.2.1. Описание метода
- •5.2.2. Пример волнового метода
- •5.3. Дискретное косинус-преобразование (дкп-метод).
- •5.3.1. Описание метода.
- •5.3.2. Пример дкп-метода.
- •5.4. Классический алгоритм jpg.
- •5.5. Фрактальный алгоритм.
- •Глава 6. Введение в криптографию. Введение.
- •6.1. Методы перестановки
- •6.1.1. Матрицы
- •6.1.2. Маршруты Гамильтона
- •6.1.3. Электрический монтаж
- •6.1.4. Особенности перестановки
- •6.2. Методы подстановки
- •6.2.1. Вектор замен
- •6.2.2. Таблицы Вижинера
- •6.3. Метод замены. Использование алгебры матриц.
- •6.4. Аддитивные методы
- •6.5. Стеганология
- •6.6. Ключ. Основные понятия, связанные с ключом и алгоритмом.
- •6.6.1. Основные понятия.
- •6.6.2. Ключ.
- •6.6.3. Случайные и псевдослучайные числа.
- •6.6.4. Действия по шифрованию информации.
- •6.7. Блочные и поточные шифры.
- •6.8. Алгоритмы des, Triple des и их заменяющие.
- •6.8.2. Алгоритм Triple des
- •6.8.3. Коммерческие алгоритмы, заменившие des
- •6.9. Системы с открытым ключом.
- •6.10. Электронная подпись.
- •6.11. Взлом защищенных файлов.
- •6.11.1. Атака на ключ
- •6.11.2. Атака на алгоритм.
- •6.11.3. Скомпрометированный пароль.
- •6.11.4. Подделка открытых ключей.
- •6.11.5. Не до конца удаленные файлы.
- •6.11.6. Вирусы и закладки.
- •6.11.7. Виртуальная память.
- •6.11.8. Нарушение режима физической безопасности. Радиоатака. Фальшивые даты подписи.
- •6.11.10. Утечка информации в многопользовательской среде.
- •Содержание
- •Глава 6. Введение в криптографию. 1
4.4.2. 1 Этап. Преобразование Барроуза-Уилера.
Прямое преобразование.
Это преобразование, конечно, является основой описываемого алгоритма сжатия. Вкратце, его можно описать как способ перестановки символов в блоке данных, позволяющий осуществить эффективное сжатие. Процедуру преобразования можно условно разделить на четыре этапа:
1) выделяется блок из входного потока,
2) формируется матрица всех перестановок, полученных в результате
3) все перестановки сортируются в соответствии с лексикографическим порядком символов каждой перестановки,
4) на выход подается последний столбец матрицы и номер строки, соответствующей оригинальному блоку.
На всякий случай следует принять специальные меры, способные предотвратить возможное зацикливание при попытке сравнить две одинаковые строки. Например, при переходе через границу блока прерывать сравнение и принимать однозначное решение в пользу одной из строк.
На вход первого этапа зададим фразу “абракадабра” и получим матрицу всех перестановок.
абракадабра
бракадабраа
ракадабрааб
акадабраабр
кадабраабра
адабраабрак
дабраабрака
абраабракад
браабракада
раабракадаб
аабракадаб
р
Затем отсортируем полученные строки, предварительно пометив исходную.
0 аабракадабр
1 абраабракад
2 абракадабра исходная строка
3 адабраабрак
4 акадабраабр
5 браабракада
6 бракадабраа
7 дабраабрака
8 кадабраабра
9 раабракадаб
10 ракадабрааб
Таким образом, на выходе первого этапа, взяв последний столбец, мы получили строку "рдакраааабб" и номер исходной строки в отсортированной матрице, равный 2.
Следует отметить основополагающее свойство преобразования. Поскольку осуществлялись именно циклические сдвиги, символы последнего столбца предшествуют начальным символам строк, которые в наибольшей степени участвовали в сортировке. Таким образом, если в исходном файле есть две похожие строки, то символы, предшествующие им обоим, будут находиться поблизости друг от друга в блоке, полученном в результате преобразования. И чем больше эти строки похожи, тем больше вероятность того, что эти символы будут находиться рядом. Здесь и далее строки, следующие во входном блоке за символами из блока выходного, будут называться контекстами.
Поскольку BWT преобразует поток данных, обладающий сложными статистическими свойствами высокого порядка, в поток со статистикой гораздо меньшего порядка, данный метод очень удобен для последующего сжатия.
И действительно, если у нас в тексте часто встречается какое-то слово, например, как слово "архиватор", то в матрице перестановок нам будут часто встречаться строки, начинающиеся с "рхиватор". Легко догадаться, что практически во всех этих строках в конце будет находиться символ "а". Таким образом, чем больше в файле похожих строк, тем больше похожих символов мы получим рядом в результате преобразования и тем легче нам будет при сжатии.
По результатам тестов на стандартном тестовом наборе, используемом для сравнения свойств алгоритмов сжатия, Calgary Corpus, количество нулей на paperi (статья на английском языке) составило 58.4%, на progp (программа) - 74%, geo (двоичный файл) - 35.8%.
Обратное преобразование.
Для восстановления матрицы перестановок отсортируем единственное, что у нас есть - символы последнего столбца. И благодаря этому получим первый столбец. Ведь строки матрицы были отсортированы именно начиная с первого столбца - значит, упорядоченные символы - это и есть первый столбец.
0 |
а………р |
1 |
а………д |
2 |
а………а |
3 |
а………к |
4 |
а………р |
5 |
б………а |
6 |
б………а |
7 |
д………а |
8 |
к………а |
9 |
р………б |
10 |
р………б |
Можно заметить, что символы последнего столбца с символами первого образуют пары - ведь строки получены в результате циклического сдвига. И отсортировав эти пары мы получим уже два известных столбца в левой части матрицы. И так далее, пока не восстановим всю матрицу целиком.
0 |
аа..……р |
ааб.……р |
аабр……р |
… |
аабракадабр |
1 |
аб..……д |
абр.……д |
абра……д |
абраабракад |
|
2 |
аб..……а |
абр.……а |
абра……а |
абракадабра |
|
3 |
ад..……к |
ада.……к |
адаб……к |
адабраабрак |
|
4 |
ак..……р |
ака.……р |
акад……р |
акадабраабр |
|
5 |
бр..……а |
бра.……а |
браа……а |
браабракада |
|
6 |
бр..……а |
бра.……а |
брак……а |
бракадабраа |
|
7 |
да..……а |
даб.……а |
дабр……а |
дабраабрака |
|
8 |
ка..……а |
кад.……а |
када……а |
кадабраабра |
|
9 |
ра..……б |
раа.……б |
рааб……б |
раабракадаб |
|
10 |
ра..……б |
рак.……б |
рака……б |
ракадабрааб |
И, зная номер исходной строки, без труда находим ее в матрице перестановок.
На самом деле нет необходимости воспроизводить посимвольно все строки матрицы по одному символу. Обратите внимание, что при каждом проявлении доселе неизвестного столбца выполнялись одни и те же действия. А именно, из строки, начинающейся с некоторого символа последнего столбца получалась строка, в которой этот символ находится на первой позиции. Из строки 0 получается строка 9, из 1 - 7 и т.п.:
0 |
а………р |
9 |
1 |
а………д |
7 |
2 |
а………а |
0 |
3 |
а………к |
8 |
4 |
а………р |
10 |
5 |
б………а |
1 |
6 |
б………а |
2 |
7 |
д………а |
3 |
8 |
к………а |
4 |
9 |
р………б |
5 |
10 |
р………б |
6 |
Для получения вектора обратного преобразования, определим порядок получения символов первого столбца из символов последнего (отсортируем последнюю таблицу по третьему столбцу):
2 |
а………а |
0 |
5 |
б………а |
1 |
6 |
б………а |
2 |
7 |
д………а |
3 |
8 |
к………а |
4 |
9 |
р………б |
5 |
10 |
р………б |
6 |
1 |
а………д |
7 |
3 |
а………к |
8 |
0 |
а………р |
9 |
4 |
а………р |
10 |
Полученные значения { 2, 5, 6, 7, 8, 9, 10, 1, 3, 0, 4 } и есть искомый вектор, содержащий номера позиций символов, упорядоченных в соответствии с положением в алфавите, в строке, которую нам надо декодировать.
Д
ля
получения исходной строки необходимо
лишь выписать символы из строки
преобразованной ("рдакраааабб")
в порядке, соответствующему данному
вектору, начиная с номера, переданного
нам вместе со строкой (т.е. 2).
2 |
а………а |
0 |
5 |
б………а |
1 |
6 |
б………а |
2 |
7 |
д………а |
3 |
8 |
к………а |
4 |
9 |
р………б |
5 |
1 0 |
р………б |
6 |
1 |
а………д |
7 |
3 |
а………к |
8 |
0 |
а………р |
9 |
4 |
а………р |
10 |
Критерием правильности выполненных действий в данном случае является тот факт, что маршрут должен закончится на той же позиции, что и начинался.
