Научная статья на тему 'Быстрый алгоритм нумерационного кодирования для основных задач теории информации'

Быстрый алгоритм нумерационного кодирования для основных задач теории информации Текст научной статьи по специальности «Математика»

CC BY
97
25
i Надоели баннеры? Вы всегда можете отключить рекламу.
Журнал
Вестник СибГУТИ
ВАК
Область наук
Ключевые слова
КОДИРОВАНИЕ / НУМЕРАЦИОННОЕ КОДИРОВАНИЕ / ТЕОРИЯ ИНФОРМАЦИИ / ENCODING / ENUMERATIVE ENCODING / INFORMATION THEORY

Аннотация научной статьи по математике, автор научной работы — Медведева Юлия Сергеевна

Предлагается быстрый алгоритм нумерационного кодирования для основных задач теории информации, таких как: 1) кодирование двоичных слов заданной длины с заданным количеством единиц и частный случай этой задачи, когда количество единиц в слове равно количеству нулей; 2) кодирование слов с ограничением на количество подряд идущих одинаковых символов. Эта задача имеет приложение в магнитной записи и некоторых других областях; 3) кодирование элементов грассманиана и кодирование слов языков Дика. Алгоритм является модификацией метода быстрой нумерации комбинаторных объектов, предложенного Б. Рябко. Предлагаемый нами алгоритм имеет меньшую вычислительную сложность, чем другие известные алгоритмы.

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Fast algorithm of enumerative encoding for main problems of information theory

We propose the algorithm of fast enumeration for main problems of coding theory. These problems are: 1) encoding of binary words with given number of ones and its special case when number of ones equals number of zeroes; 2) encoding of run-length-constrained words. This problem is of interest to magnetic recording and some other fields; 3) encoding of the Grassmannian space elements and encoding of the Dyck language words. We apply the modification of method of fast enumeration of combinatorial objects proposed by B. Ryabko to stated problems. Our algorithm has less computational complexity than other known algorithms do.

Текст научной работы на тему «Быстрый алгоритм нумерационного кодирования для основных задач теории информации»

УДК 519.163, 519.72

Быстрый алгоритм нумерационного кодирования для основных задач теории информации

Ю. С. Медведева

Предлагается быстрый алгоритм нумерационного кодирования для основных задач теории информации, таких как:

1) кодирование двоичных слов заданной длины с заданным количеством единиц и частный случай этой задачи, когда количество единиц в слове равно количеству нулей;

2) кодирование слов с ограничением на количество подряд идущих одинаковых символов. Эта задача имеет приложение в магнитной записи и некоторых других областях;

3) кодирование элементов грассманиана и кодирование слов языков Дика.

Алгоритм является модификацией метода быстрой нумерации комбинаторных объектов, предложенного Б. Рябко. Предлагаемый нами алгоритм имеет меньшую вычислительную сложность, чем другие известные алгоритмы.

Ключевые слова: кодирование, нумерационное кодирование, теория информации.

1. Введение

В теории информации есть несколько задач создания быстрых алгоритмов кодирования и декодирования некоторых особых множеств слов.

Первая из таких задач — задача создания быстрого нумерационного кода для двоичных слов заданной длины с заданным количеством единиц.

Обозначим через Б множество всех двоичных слов заданной длины, имеющих заданное количество единиц. Алгоритм нумерационного кодирования позволяет по данному слову из множества Б находить его кодовое слово или номер, т. е. целое число из промежутка [0, |Б| — 1]. Алгоритм нумерационного декодирования позволяет по кодовому слову, т. е. целому числу из промежутка [0, |Б| — 1], находить соответствующее ему слово из множества Б. Особый интерес имеет частный случай этой задачи, когда количество единиц равно половине длины слова [7], [16].

Следующая задача, привлекающая внимание многих исследователей — задача создания быстрых нумерационных кодов для слов с заданным ограничением на количество подряд идущих одинаковых символов (¿к1г -последовательностей). Эта задача имеет важное приложение в магнитной и оптической записи, также как в оптической передаче данных, и была рассмотрена во множестве работ, таких как [15], [1], [3], [10] и др.

Третья задача — быстрые нумерационные коды для элементов грассманиана. Эта задача имеет приложение в сетевом кодировании [5], [14], [8], [12], [13].

Мы также рассматриваем быстрый нумерационный код для слов языков Дика. Кодируемое множество слов в этом случае — это множество сбалансированных последовательностей длины 2п открывающих и закрывающих скобок к типов. Необходимость быстрой нумерации и денумерации слов языков Дика возникает при работе трансляторов языков высокого уровня, для сжатия правильных последовательностей скобок и случайной генерации правильных последовательностей скобок [21], [17], [18].

В данной работе описывается модификация метода из работы [22] для быстрых алгоритмов нумерации и денумерации и предлагается основывающийся на данном методе алгоритм для названных задач. Алгоритм подробно описывается на примере кодирования слов языков Дика, также кратко описано применение этого алгоритма к кодированию двоичных слов, количество единиц в которых равно половине длины слова. Некоторые результаты, связанные с кодированием последовательностей с ограничением на количество подряд идущих одинаковых символов, опубликованы в работе автора [20]. Результаты, связанные с кодированием элементов грассманиана, опубликованы в работе [19].

2. Быстрый алгоритм нумерации на примере слов языков Дика над алфавитом {0,1}

Словами языка Дика над алфавитом, состоящим из 2т букв, являются последовательности правильно вложенных скобок т типов. Рассмотрим в качестве примера все слова длины п = 4 языка Дика над шестью буквами, т. е. последовательности длины 4 правильно вложенных скобок трёх типов. Всего таких слов 18, см. табл. 1. Сопоставим им номера, записанные в двоичном виде, длины 18] =5 .В первый столбец запишем все такие слова, а во второй - их номера в двоичном виде.

Таблица 1.

Слово Номер Слово Номер

(()) 00000 [][] 01001

()() 00001 [ {} ] 01010

([]) 00010 [] {} 01011

()[] 00011 {()} 01100

({}) 00100 {} () 01101

() {} 00101 {[]} 01110

[()] 00110 {} [] 01111

[]() 00111 {{}} 10000

[[]] 01000 {}{} 10001

Алгоритм нумерации ставит слову, принадлежащему языку Дика над алфавитом, состоящим из 2m букв длины n, последовательность из нулей и единиц, т. е. его номер. Например, для множества слов языка Дика над алфавитом 6 длины 4, расположенных в порядке, указанном в таблице, по данному слову () { } алгоритм должен находить его номер 00101.

В данной статье мы рассмотрим быстрый алгоритм нумерации и денумерации на примере множества слов языков Дика над алфавитом {0,1}.

Алгоритм нумерации слов длины n языков Дика над алфавитом 2m, основанный на методе Ковера [2], имеет сложность O(n2) битовых операций на одно нумеруемое слово, или O(n) битовых операций на один символ нумеруемого слова.

Метод нумерации слов длины n языков Дика над алфавитом 2m, предлагаемый в данной работе и основанный на подходе из работы [22], имеет сложность O(log n/nM(n log n)) битовых операций на один символ нумеруемого слова, где M(n log n) - время умножения или деления слов длины n log n. Если использовать метод Шёнхаге - Штрассена [11], сложность

которого n log n log log n при умножении или делении слов длины n, то сложность рассматриваемого метода O(log3 n log log n) на один символ нумеруемого слова. Если использовать метод Фюрера [4], сложность которого n log n2O(log*n) при умножении или делении слов длины n, то сложность рассматриваемого метода O(log n2O(log*n)) на один символ нумеруемого слова.

Обозначим множество слов языка Дика над алфавитом, состоящим из 2m букв длины

n.

Покажем, как применяется быстрый алгоритм нумерации, предлагаемый в данной статье, для нумерации слов языка Дика длины n над алфавитом {0,1}, т. е. слов множества D2n.

В качестве примера будем искать номер слова w = 01010011 е Df.

Описание будет удобно начать с описания нахождения номера слова w среди множества S, где S — произвольное множество слов длины n, который мы обозначим через codeS (w) с помощью метода Ковера из [2].

Согласно [2], номер слова w = x1 ... xn из заданного множества слов S длины n, упорядоченного лексикографически, можно найти по формуле

n

codes (w) = ^ (Х1Х2 ...Xi-ix), (1)

i=1 X<xi

где Ns(x1x2 ... xi-1 x) — количество слов множества S, начинающихся с x1x2 ... xi-1x.

Для того чтобы использовать эту формулу для нумерации слов множества D^n, нужно опеределить, чему равны значения ND2 (x1... xi), 0 < i < n.

Найдем, чему равно ND2 (01), т. е. сколько слов множества Df начинаются на 01. Словами множества Df, начинающимися на 01, будут являться слова, состоящие из четырёх нулей и четырёх единиц, которые начинаются на 01, кроме тех, которые не соответствуют правильным расстановкам скобок. Количество всех слов, состоящих из четырёх нулей и четырёх единиц, начинающихся на 01, легко найти: оно равно количеству всех слов, состоящих из трёх нулей и трёх единиц, т. е. C = 20.

Слова, начинающиеся на 01 , состоящие из четырёх нулей и четырёх единиц и не соответствующие правильным расстановкам скобок, это такие слова из четырёх нулей и четырёх единиц, для которых существует такое j, 2 < j < 8, что количество единиц в последовательности x1x2 ... xj превышает количество нулей в этой последовательности. Существует взаимооднозначное соответствие таких слов и всех слов, состоящих из трёх нулей и пяти единиц и начинающихся на 01. Это отображение осуществляется следующим образом. Для слова, не соответствующего правильной расстановке скобок, есть такие j, 2 < j < 8, что количество единиц в последовательности x1x2 ... xj превышает количество нулей в этой последовательности. Для каждого такого слова можно найти минимальное среди всех j. Можно видеть, что для такого j количество единиц в последовательности x1x2 ... xj превышает количество нулей на один символ. Заменим теперь в слове все символы после j -го на противоположные. Получаем слово из трёх нулей и пяти единиц, начинающееся на 01. Т. к. это отображение взаимооднозначное, количество слов, начинающихся на 01 , состоящих из четырёх нулей и четырёх единиц и не соответствующих правильным расстановкам скобок, равно количеству всех слов, начинающихся на 01 и состоящих из трёх нулей и пяти единиц. Таких слов столько же, сколько слов, состоящих из двух нулей и четырёх единиц, т. е. C| = 15. Таким образом, Nd| (01) = C3 - C2 = 5.

В общем виде, - C^-"-1 = (n - i)!/((n/2 - z)!(n/2 - i + z)!) - (n - i)!/

/((n/2 - z - 1)! (n/2 - i + z + 1)!) = (n - i)!(2z - i + 1)/((n/2 - z)! (n/2 - i + z + 1)!),

т. е.

/ ч (n - i)!(2z - i + 1)

Nd2(XlX2 • • •xi) = (n/2 -z)!(n/2 - i + z + 1)!' (2)

где z — количество нулей в x^2 • • • xi, при том, что x^2 •.. xi может быть началом слова, соответствующего правильной расстановке скобок длины n. Если ж1ж2 • • • xi не может быть началом слов, соответствующих правильной расстановке скобок длины n, то очевидно

N^2 (xi • • •Xi) = 0.

При применении метода Ковера используется вспомогательная таблица, в которой хранятся все возможные значения Ns(x1x2 • • • xi-1x) или все возможные значения Y^ X < XiNs(x1 x2 • • • xi-1x), 0 < i < n. Эта таблица строится один раз и затем используется для всех последующих поисков номера слов множества S.

В случае множества достаточно таблицы, в которой каждой паре i, 0 < i < n, и z, 0 < z < i сопоставляется значение ND2(x1 • • • xi) = (ra/2-n-)i|)(!n2/2"-ii+1,;)+1)i (2). Размер такой таблицы равен O(n3).

Для получения номера слова w Е D^ согласно (1) для каждого i, 0 < i < n, такого, что xi = 1, находится значение z, равное количеству нулей в слове x1 • • • xi-10, затем находится с помощью таблицы соответствующее паре i и z значение ND2 (x1 • • • xi), затем складываются все найденные значения ND2 (x1 • • • xi).

В данном примере:

codeD2 (01010011) = ND2 (00) + ND2 (0100) + ND2 (0101000) +

8 8 8 8 (3)

+ND2 (01010010) = 9 + 3 + 0 + 0= 12^

Значения ND2 (00), ND2 (0100) при этом берутся из заранее построенной таблицы. При значениях i, равных 2, 4, 6, 8, выполняется xi = 1. При i = 2 слово xi-10 равно 00, следовательно, z = 2, поэтому из таблицы берётся значение ND2 (00), соответствующее паре i = 2 z = 2) и равное (6!3)/(2!5!) = 9. При i = 4 слово x1 •••xi-10 равно 0100, следовательно, z = 3, поэтому по таблице находится значение ND2 (0100), соответствующее паре i = 4, z = 3) и равное (4! 3)/(1! 4!) = 3. Значения же ND2 (0101000) и ND2 (01010010) равны нулю, т. к. не существует слов множества D|, начинающихся на 0101000 или 01010010.

Мы видим, что для такого вычисления требуется совершить максимум n операций сложения слов длин от 1 до n. Т. о., если использовать вспомогательную таблицу, то сложность вычисления номера слова по методу Ковера равно O(n2) или O(n) на один символ нумеруемого слова.

Перейдём теперь к описанию нумерации слова w = x1 • • • xn заданного множества S слов длины n предлагаемым быстрым алгоритмом нумерации, затем покажем, как применяется этот алгоритм для нумерации слов множества Dn2 .

Определим величины P(xi|x1 • • • xi-1), q(xi|x1 • • • xi-1) при 0 < i < n

P(x ) = Ns(x1) P(x , x x ) = Ns(x1x2 •••xi)

P (x1) = -ГТй-, P(xi lx1x2 • • • xi-1) = -Г ,

|S l Ns (x1x2 •••xi-1) (4)

q(x1) = P(x), q(xi|x1 • • • xi-1) = P(x|x1 • • • xi-1

X<X1 X<Xi

Можно видеть, что по (1)

codes (x1 • • • xn) = |S |(q(x1) + q(x2|x1)P (x1) + q(x3|x1x2)P (x2|x1)P (x1) + • • • )• (5)

Идея метода заключается в расстановке скобок в этом выражении таким образом, что при вычислении номера большинство операций производится над короткими числами. Такой расстановкой скобок будет являться

codes(xi.. .Xn) = |S|((q(xi) + q(x2|xi)P(xi)) + ((q(xs|xix2) + +q(x4|xi . . . Хз)Р (Хз |XiX2))P (x2|xi)P (xi)) + ...).

Определим величины pa, К при 0 < а < log n, 1 < b < n/2a следующим образом:

p0 = P(xb|xi.. .Xb-i), Л0 = q(xb|xi.. .xb_i),

(6)

na — n"-i na-i \a — \a-i -L na-i V pb = p2b— ip2b , ЛЬ = Л2Ь— i + p2b— 1Л

(7)

2b

Тогда Л1о®(п) = ((q(xi) + q(x2|xi)P(xi)) + ((q(x3|xix2) + q(x4|xi... Хз)Р(хз|х1 X2))-■P (x2|xi)P (xi)) + ... ).

Отсюда и (6):

codes(xix2 ... x„) = Л1"®n |S|. (8)

Алгоритм заключается в том, что сначала находятся значения P(xi|x1... xi-1), q(xi|x1... xi-1) при 0 < i < n, определённые в (4), затем находится Л^n последовательным вычислением значений pa, Ла при 0 < а < log n, 1 < b < n/2a формулам (7), затем находится искомый номер codeS(w) по формуле (8), при этом значение |S| находится до начала нумерации и используется затем при всех последующих нумерациях.

Покажем, как применить быстрый алгоритм нумерации для нумерации слов множества

D2

n

До начала нумерации необходимо вычислить мощность D2n. Мощность такого множества равна n/2-ому числу Каталана [23],

Dn | = Cn = cn/2 - cn/2-i. (9)

В нашем примере |Df | = C| — C| = 14.

Можно видеть из (2) и определения (4), что для множества D2n значения P(xi|x1... xi-1) ( 0 < i < n ) находятся следующим образом:

при xi = 0,

(n — i)!(2z — i + 1)

P(xi|xix2 . . .xi-i) -

(n/2 — z)! (n/2 — i + z + 1)! ' (n — i + 1)!(2z — i) (2z — i + 1)(n/2 — z + 1)

' (n/2 — z + 1)! (n/2 — i + z +1)! (2z — i)(n — i + 1)

(n — i)!(2z — i + 1)

P(xi|xix2 . . .xi-i)

(n/2 — z)! (n/2 — i + z + 1)! ' (n — i + 1)!(2z — i + 2) (2z — i + 1)(n/2 — i + z + 2)

(n/2 — z)! (n/2 — i + z + 2)! (n — i + 1)(2z — i + 2)

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

(10)

при xi = 1

Таким образом, для нашего примера находим по формулам (10) и (11) значения

Р(Ж1) = р0, Р(Ж2|Ж1) = р0, ..., Р(жз|ж1ж2 ... Х7) = р8, д(ж1) = Л0, д(х2) = Л°, ..., д(х8) = А0,

5

Р(Х1) = 1, Р(Х2|Х1) = Р(1|0) = 14,

6 4

Р(хз|х1 Х2) = Р(0|01) = 6, Р(Х4|Х1Х2Х3) = Р(1|010) = —,

6 10

4 3

Р(х5Ь... х4) = Р(0|0101) = -, Р(х6Х ... х5) = Р(0|01010) = -,

46

6 2 Р(Ж7|Ж1 ...Хб) = Р(1|010100) = -, Р(жв|ж1 ...Х7) = Р(1|0101001) = -, (12)

62

9

9(Х1) = 9(0) = 0, Ф2Ы = д(1|0) = 14,

6

д(жз|ж1ж2) = 9(0101) = 0, д(х4|х1 Х2Х3) = д(1|010) = —,

?(Ж5|Ж1... Х4) = д(0|0101) = 0, д(хбХ ... Х5) = д(0|01010) = 0, ?(Ж7|Ж1... Хб) = д(1|010100) = 0, д(хв|х1... Х7) = д(1|0101001) = 0.

Соответственно, по (7)

5 2 1

р? = 1, р? = , = 1, р0 = 5, р5 = 1, р? = 1, р? = 1, р? = 1,

А? = 0, А2 = 194,А? = 0, А? = 3,А° = 0, А0 = 0, А? = 0, А0 = 0.

(13)

Затем по (7) вычисляем

р1 = 14, р1 = 5, р1 = 2, р4 = 1, А1 = 14, А2 = 5, А? = 0, А? = 0, р1 = 1 ,р2 = 1 ,А1 = 6 ,А2 = 0,р1 = 1 ,А1 = 7.

(14)

По (8) (01010011) = Л? -|Д|| = 6 ■ 14 = 12. Таким образом, мы получили (ад),

номер слова 01010011 е .

Для исследования свойств алгоритма нумерации слов, принадлежащих множеству Б, мы определим несколько величин.

Обозначим через дтах максимальный знаменатель дробей (х1х2 ... х^/Д^(х1х2 ... , х1 ... хп е Б, г = 1,..., п.

Из (7) получаем, что знаменатели рациональных дробей Л^ и р^ не превосходят дтах при всех Ь = 1, 2, ..., п/2а и следовательно,

р'а > 1 /9тах. (15)

Свойства предложенного метода характеризует следующая теорема.

Теорема 1. 1) Скорость кодирования (то есть время кодирования на букву, измеряемое числом операций над однобитовыми словами) слов множества Б длины п равна

O(log nM(n log Qmax)/n), (16)

где M (n) время умножения двух слов длины n.

Следствие 1. При использовании алгоритма быстрого умножения Шёнхаге - Штрассена, для которого M (n) = O(n log n log log n), скорость нумерации равна O(log n log Qmax log(n log qmax) log log(n log qmax)).

Следствие 2. При использовании алгоритма быстрого умножения Фюрера, для которого M (n) = O(n log n2O(log*n)), скорость нумерации равна

O (lOg n l0g(n lOg qmax )2°(log* (n log qmax ))).

2) Объём памяти в битах, используемый при кодировании слов множества S длины n, не превосходит

O((n log qmax)log n). (17)

Доказательство. 1)Из определения qmax и (4) мы видим, что для записи каждой дроби P(xj|xi... xj-i) и q(xj|xi... Xj-i), i = 1,..., n достаточно 2 logq^x бит, log q^x для числителя и столько же для знаменателя. Поэтому вычисление одной величины pi или A1 в соответствии с (7) при любом b = 1,..., n/2 потребует одной операции умножения чисел, длина которых не превосходит log qmax бит, а общее число операций умножения при вычислении всех Ai, pi, b = 1,...,n/2, равно 5n/2. При вычислении A1 используется обычное равенство a/b + c/d = , требующее три умножения. В результате будут получены дроби,

у которых для записи числителя и знаменателя требуется не более 2 log qmax бит. Аналогично, для вычисления A2, p2, b = 1,..., n/4, требуется 5n/4 операций умножения над числами длины 2 log qmax и так далее, для вычисления A", p", b = 1,..., n/2", требуется 5n/2" операций над числами длины 2"-1 log qmax бит. Обозначим через M(a) время умножения двух слов длины a. Получаем, что общее время вычислений A", p" по формулам (7) требует

^M (log qmax) + 54nM (2 log qm„x) +-----+

+5n M (2" log qm„x) + ••• + (18)

2"

5M (n log qw).

Обозначим через M*(n) время умножения двух чисел длины n, делённое на длину этих чисел: M*(n) = ^.

' n

Тогда время вычислений A", p" по формулам (7) требует

5n 5n

— log qmaxM *(log qmax) + "4 2 log qmaxM (2 log q^x) +-----+

5n

+— 2" log qTO"xM *(2" log qTO"x) + ■ ■ ■ + 2"

(19)

5n log qm"xM* (n log qm"x).

В этой сумме log n слагаемых, каждое из которых не превышает 5n log qm"XM* (n log qm"X) = 5M(nlog qm"X), следовательно сумма есть O(log nM(nlog qm"X)). Отсюда число операций на букву слова O(log nM(n log qm"X)/n).

2) Оценим необходимый для осуществления кодирования объем памяти. Заметим, что при вычислении A" и p", a > 1, b = 1,...,n/2", используются только величины A"-1 и p"-1, b = 1,... , n/2"-1. Поэтому при кодировании достаточно иметь память для хранения двух наборов {A", p"}, b = 1,..., 2", и {A", p"}, b = 1,..., 2"+1, a = 1,..., log n — 1. Длина каждой

дроби A", p" не превосходит 2"+1 log qmra бит. Отсюда получаем второе утверждение теоремы.

Я

n

Из(10)и(11) следует, что для слов множества

qmax = П2. (20)

Опишем свойства алгоритма нумерации слов языков Дика из одного вида скобок.

Теорема 2. 1)Скоростъ кодирования слова длины n языка Дика над алфавитом мощности 2, т. е. время, требуемое для кодирования одной буквы, равна O(log nM(n log n)/n) битовых операции, где M(n) - время умножения двух слов длины n.

2)Объём памяти, требуемый для кодирования слова длины n языка Дика над алфавитом мощности 2 равен O(n log n) бит.

Следствие 1. При исполъзовании алгоритма быстрого умножения Шёнхаге - Штрассена, для которого M (n) = O(n log n log log n), скоростъ нумерации равна O(log3 n log log n).

Следствие 2. При исполъзовании алгоритма быстрого умножения Фюрера, для которого M (n) = O(n log n2O(log*n)), скоростъ нумерации равна O(log3 n2O(log*n)).

Доказательство. Следует из теоремы 1 и (20). □

3. Быстрый алгоритм деиумерации на примере слов языков Дика над алфавитом {0,1}

Алгоритм деиумерации слов языков Дика над алфавитом {0,1}, т. е. слов множества D^n, позволяет найти по данному номеру слова codeD2 (w) слово w G D2n.

Начнём с описания общего алгоритма денумерации слов длины n любого заданного множества S, т. е. поиску слова w = x1... xn G S по его номеру codeS(w).

Для описания алгоритма введём вспомогательные функции для верхней и нижней оценки Ла. Пусть p/q — рациональное число, представленное как пара целых положительных чисел p, q, p < q, и пусть t > 1 — целое число. Положим l = [log qj. Пусть (qlql—1... qo)

и (plpl-1.. .p0) — двоичные представления чисел q и p. Тогда определим ф+ ^^ и ф—

следующим образом:

\ / 1

+ I p 1 _ I \ Л „ Qi I ol—t 1 / \ Л „ О i А— I Р 1 _ \ Л „о i / I \ Л „ oi I ol—t

ф+ ( 7 ) = ( £ Pi2i + 2l—Ч / £ qi2i, ф— (p) = £ Pi2iЛ £ qi2i + 2l—4 . (21) \i=l—t / i=l—t i=l—t \i=l—t /

Если I — Ь < 0, домножаем числитель и знаменатель полученной дроби на 2 . Например, ф+(9/17) = 5/8, ф- (9/17) = 4/9. Докажем утверждение, которое понадобится в дальнейшем.

Лемма 1. Пусть р, q, Ь — целые положительные числа и 0 < р < q и Ь > 3. Тогда

0 < ф+Ш — p/q < 23 -*, 0 < p/q — ф-(p/q) < 23 -*. (22)

Доказательство. Легко видеть, что 1/(1 — х) < 1 + 2х при х < 1/2. Это неравенство сразу следует из формулы для суммы геометрической прогрессии. Отсюда оценка первого неравенства в (22) следует из цепочки неравенств

ф+ (р) <р(1 + ^(1+2 2'"'

q / q — 21 * q \ р / \ q

р 21-* р ■ 2 ■ 21-* 21-* ■ 2 ■ 21-* (23) = - +-+ --5-+-5- < (23)

q q q2 q2

< р + 2-* + 22-* + 21-2* < р + 23-* q q

(здесь мы использовали очевидные соотношения 21 < q, р < 21+1). Второе неравенство в (22) получается точно так же. □

Согласно данному ранее определению, для заданного множества слов S цтах равно максимальному знаменателю чисел (х ... ж^)/^(х ... х^), х1 ... хп € 5, 1 < г < п — 1.

Из (7) получаем, что знаменатели рациональных дробей Л' и р' не превосходят ц^ах при всех Ь = 1, 2, ..., п/2а и, следовательно,

Ра > 1 /Ятгах. (24)

Из(10)и(11) следует, что для множества ^П цтах = п2.

Первый шаг поиска слова V из множества 5 по данному номеру (V) заключается

в вычислении оценок Л+(^ п, 1), Л-(log п, 1) по формулам:

\ + л n f codes (v)'

' (25)

W1 n ,_ f codes(v)'

A (10g n, 1)= 0_ra[iog qmaxl+Д |

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

Процедура 1. Опишем рекурсивную процедуру получения по известным префиксу x1.. .x2a(b_i) и оценкам A+(a, b), A_(a, b) (0 < a < log n, 1 < b < n/2a) подслова X2a(b_i)+i... x2ab и значений A^, Pa или такой пары слов, что одно из них равно x2a(b—1)+1... x2ab, и соответствующих им пар предположительных значений Aa, pa. Причём, если b = n/2a, то выполняя эту процедуру, можно однозначно определить подслово

xn_2a + 1 . . . xn .

Вычисляем оценки A+(a — 1, 2b — 1), A_(a — 1, 2b — 1) по формулам:

A+(a — 1, 2b — 1) = ^log wl+l^^ b)) , ^

A_(a — 1, 2b — 1) = ф_a+lfiog qmax1+4(A_(a, b)) ''

Если а > 1, то выполняем процедуру 1 получения по префиксу Ж1 . . . Х2а—1(2Ь—2) и Этим оценкам подслова х2а-1(2Ь_2)+1... х2а-1(2Ь-1) и значений Л'-1, Ра—1! или пары слов, одно из

которых равно х2а-1(2Ь_2)+1... х2а-1(2Ь-1), и соответствующих им пары предположительных

1 . - -

1

Ла-Д, ра-_11. Обозначим лексикографически меньшее слово из пары слов через

х/2а-1(2Ь-2)+1... х/2а-1(2Ь-1), большее - через х'2'а-12(Ь_2)+1... х/2/а-1(2Ь-1), а соответствующие им

предположительные Ла—11, Ра—-через Л'а—, Л"а—, р'а—11 и р"а—.

Если а = 1 , то выполняем процедуру 2 получения по префиксу х1... х2«-1 (2ь—2) и оценкам

Л+(а — 1, 2Ь — 1), Л-(а — 1, 2Ь — 1) буквы х2Ь-1 и пары Л2Ь-1, раЬ-1 или пары букв х'2Ь-1, х'2/ь-1

и пар значений Л/2°ь-1, р2Ь— 1, Л2°- 1, р2°- 1.

Таким образом, на данном этапе выполнения процедуры мы получили подслово

х1... х2а-1(2Ь-2) и значения Л'-- и р'-- или слова х1... х/2а-1(2Ь-2), х1... х/2/а-1(2Ь-2) и значения Л'а—_11, р'а--1, Л"а-_11 и р"а-_11. во втором случае проверяем, выполняются ли следующие неравенства:

A/a__1i + Р^Л < A_(a, b), A//a__11 > A+(a, b).

(27)

Если выполняется первое неравенство, то х1... х2а-1(2Ь-2) = х'/ ра-_11 = /'-Л. Если выполняется второе неравенство, то х1... х2а

а- 1 а- 1

. Х о a — 1

(2b_2)'

л а_ 1 A2b— 1

1(2b_2)

X1

\на_1 A 2b- 1,

л а_ 1 A2b 1

\/а_1 па_1 A 2b-1' p2b— 1

p 2b-1 •

. X2a-1(2b_2)'

Если в результате сравнений (27) или без них нам на этом этапе вычислений известны

2-1 26— 1

точные значения А^Л и р^Л, вычисляем оценки А+(а — 1, 26), Л (а — 1, 26) по формулам:

А+(а — 1 26) = ф++1[1о§^1+4 (

А-(а — 1, 26) = ф

2а+1^ дтах1+4

-А+(а, 6) — Аа-_11

р2--1

А-(а, 6) — А2-Л

Р2--1

(28)

Применяем к ним рекурсивную процедуру, если а > 1 и находим подслово х2а-1(26-1)+1... ж2а-126 и значения А2-1, р2-1 (или, в случае, если 6 = п/22, только подслово х2а-1(26-1)+1... ж2а-126) или пару подслов, такую, что одно из этой пары равно х2а-1(26-1)+1... ж2а-126 и соответствующие пары предположительных значений А2-1, р2-1. Если же а = 1, выполняем процедуру 2 получения по префиксу х1... ж2а-1(26-1) и оценкам А+(а — 1, 26), А-(а — 1, 26) буквы ж26 и пары А06, р26 или пары букв Х26, Х2'6 и пар значений А26, р206, А20, р20 • При этом если 26 = п, то мы однозначно находим ж26.

Если ни одно из неравенств (27) не выполняется, при этом 6 = п/22, то находим последовательно буквы X, 22-1 (26 — 1) + 1 < г < 22-126, такие, что

. . . х2а(6-1)Х2а(6_1) + 1 . . . + Р (ж[|ж1 . . . Ж2а(6-1)Ж2а(6-1) + 1 . . . = 1,

Р . . . Х2а (6— 1) Ж2а(6-1) + 1 . . . > 0

(29)

и находим последовательно буквы ж", 22 1(26 — 1) + 1 < г < 22 126, такие, что

|ж1 . . . Ж2а(6-1)Ж2а(6-1) + 1 . . . = 0,

Р « |Ж1.. . ж2а(6-1)Ж2а(6-1)+1 . . . Хг-1) > 0.

(30)

Считаем рекурсивно по формулам, аналогичным (7), пару чисел А'2- 1, р'2- 1 (в формулах используется префикс Ж1 . . . Ж2а(6-1)Ж2а(б-

1)+1 . .

. Хо

) и пару чисел А используется префикс ж1... ж2а(6-1)ж'2'а(6-1)+1... ж'2'а6).

Если ни одно из неравенств (27) не выполняется и при этом 6

Х2а(б-1)+1 ...Х2«-1 найдено и равно ж'2'а(6-1)+1 22-1 (26 — 1) + 1 < г < 22-126, такие, что

р'2-1 р 26

''2-1, р''2-1 (в формулах

п/22 , это означает, что

'' ...ж2'а-1 • Находим последовательно буквы ж,

?(Хг|Х1 . . .Хг-1) = 0,

Р(ж^|ж1 . . . Ж^-1) > 0.

(31)

Таким образом, на данном этапе выполнения процедуры у нас возможно несколько случа-

ев.

В первом случае нам известно подслово ж2а-1 (26-2)+1... ж2а-1(26-1) и подслово ж2а-1(26-1)+1... ж2а-126, что означает, что нам известно подслово ж2а(6-1)+1... ж2а6. Если 6 = п/22, вычисляем значения А2 и р2 по формулам

Л 2 _ Л 2- 1 | 2— 1 Л 2— 1

А6 = А26-1 + р26-1 " А26 , (32)

р6 = р26-1 ' р26 .

Во втором случае нам известно подслово ж2а-1(26-2)+1... ж2а-1(26-1) и пара слов

Х2а-1(26-1)+1 . . . Х2°-126, Х2>а-1 (26_1)+1 . . . Х2°-126 • Тогда слово Х2а(6-1)+1 . . . Х2а6 считаем равным

слово x/2'a(b-1)+1 • • • x^ab счи-

конкатенации х2«_1(2Ь-2)+1 . . . х2«_1(2Ь-1) И Х2а_1(26-1)+1 ... ж2а-12Ь

таем равным конкатенации ж2а_1(2Ь-2)+1... х2а_1(2Ь-1) и х/2/а_1(2Ь-1)+1... х'2/а_12Ь. Вычисляем значения л'а, р'а, л"а, р''а по формулам

л /а

Л b

\а-1 I па-1 \/ ^b- 1 + 1 ' Л

2b

р b

ра-1 . р/а-1 р2Ь- 1 р 2b ,

л На _ \а— 1 | _а-1 \//а-1

Л b = ^b- 1 + р2Ь- 1 ' Л 2b ,

р//а = ра-1 р//а-1 р b = р2b— 1 р 2b •

(33)

В третьем случае нам известны пары следующих слов: x/2

2a-1(2b-2)+1 • • • x2a-1

x/

l(2b-2)+1

• • • x'

2a-1(2b-1), x2a-1(2b-1)+1

' x2a-12b, x2a-1(2b-1)+1

x

.x

2a(b-1) + 1 • •

/ . x/

. Хла-

2ab считаем равным конкатенации x'2a-1(2b-2)+1 • • • x'2a-1(2b-1)

• • • x2a-12b • xo a — 1

. Слово

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

(2b-1)'

и x2a-1(2b-1)+1 • • • x2a-12b // // x2a-1 (2b-2)+1 • • • x2a-1(2b-1) по формулам

а слово x

и x2a-1

2a(b-1) + 1 (2b-1)+1.

• • • x'

2ab

x//

12b

равным конкатенации . Вычисляем значения Л/'

р/а Р b 5

//а

Л b ,

р//а р b

л/а _ \/а-1 I /а-1 л/а-1

Л b = Л 2b-1 + р 2b-1 ' Л 2b

л//а _ \//а-1 | //а-1 л//а-1

Л b = Л 2b- 1 + р 2b- 1 ' Л

р/а = р/а-1 р/а-1 , Р b = Р 2b 1 Р 2b ,

2b

Р//а р b

р//а-1 . р//а-1 Р 2b 1 Р 2b •

(34)

Процедура 2. Опишем процедуру получения по оценкам Л+(0, b), Л (0,b) и префиксу

х1. ..хь-1 буквы хь и соответствующей ей пары значений Л0, р0 или пары букв

x

x

и соответствующих им пар значений Л/0, р/0, Л//0

0 и р"0.

Находим такие буквы х, X ^ {0,1} для которых одновременно выполнялись бы условия

Р(х1х1.. .хь-1) > 0, Л+(0,Ь) > д(х|х1 ...Хь-1), (35)

Л-(0,Ь) < ?(х|х1.. .хь-1) + Р(х|х1.. .хь-1).

Если существует одно такое х, то хь = х. Если существует два таких х и Ь < п, считаем хЬ равным меньшему такому х, х^' большему такому х. Если Ь = п, то хь равно большему такому х. Если хь найдено однозначно, вычисляем значения Л0 и р0 по формулам (7). Если найдена пара х^ и х£', вычисляем значения Л'0, р'0, Л''0 и р''0 по следующим формулам:

Л/0 = q(xb|x1 • • ^xb-1), Л//0 = q(xb/|x1 • • •xb-O, р/0 = P (xb|x1 • • •xb-O, р//0 = P (xb/|x1 • • ^-1)

(36)

Применяя процедуру 1 для a = log n, b =1 находим по оценкам Л+^og n, 1), Л-(log n, 1) слово x1 • • • xn. (При этом считаем, что нам известен префикс нулевой длины.)

Покажем, как применяется описанный алгоритм денумерации для денумерации слов множества Dn2 .

Сделаем это на примере поиска слова w Е D| по данному номеру codeD2 (w) = 12. По (20) 5тах = n2 = 64.

Находим Л+(3, 1), Л-(3, 1) по формулам (25):

Л+(3,1) = ф+96(12/14) = (12 ■ 2193 + 1)/(14 ■ 2193), Л-(3,1) = 12 ■ 2193/(14 ■ 2193 + 1)

Находим Л+(2, 1), Л-(2, 1), а затем Л+(1, 1), Л-(1, 1), Л+(0, 1), Л-(0, 1) по формулам (26):

Л+(2,1) = ф+00((12 ■ 2193 + 1)/(14 ■ 2193)) = (12 ■ 297 + 1)/(14 ■ 297), А-(2,1) = 12 ■ 297/(14 ■ 297 + 1),

Л+(1,1) = ф+2((12 ■ 297 + 1)/(14 ■ 297)) = (12 ■ 249 + 1)/(14 ■ 249), Л-(1,1) = 12- 249/(14 ■ 249 + 1),

Л+(0,1) = ф+8((12 ■ 249 + 1)/(14 ■ 249)) = (12 ■ 225 + 1)/(14 ■ 225), Л-(0,1) = 12- 225/(14 ■ 225 + 1).

Находим х такие, для которых выполняются неравенства (35), т. е. Л+(0,1) > д(х), Л-(0,1) < д(х) + Р(х), Р(х) > 0. Единственное х, которое удовлетворяет этим неравенствам, это ноль, можно видеть, что Л+ (0,1) > д(0) = 0, Л-(0,1) < д(0) + Р(0) = 1, Р(0) = 1 > 0, в то же время для единицы эти неравенства не выполняются, т. к. Р (1) = 0. Поэтому ж1 = 0.

Находим Л1 и р0 по формулам (7): Л0 = д(0) = 0, р0 = Р(0) = 1.

Находим Л+(0, 2), Л-(0, 2) по формулам (28): Л+(0, 2) = ф+8(((12 ■ 249 + 1)/(14 ■ 249) - 0)/1) = (12 ■ 225 + 1)/(14 ■ 225), Л-(0, 2) = 12 - 225/(14 ■ 225 + 1).

Находим х такие, для которых выполняются неравенства (35), т. е. Л+(0, 2) > д(х|0), Л-(0, 2)

< д(х|0) + Р(х10), Р(х10) > 0. Неравенства выполняются для х = 1, т. к. Л+(0, 2) > д(1|0) = 5/14, Л-(0, 2) < д(1|0) + Р(1|0) = 1, Р(1|0) = 5/14 > 0, неравенства не выполняются для х = 0, т. к. Л-(0, 2) > д(0|0) + Р(010) = 9/14. Поэтому ж2 = 1.

Находим Л° и р0, а затем Л1 и р1 по формулам (7): Л0 = д(1|0) = 9/14, р0 = Р (110) = 5/14, Л1 = Л1 + Л0 ■ р0 = 9/14, р1 = Р1 ■ р2 = 5/14.

Находим Л+(1, 2), Л-(1, 2) по формулам (28): Л+(1, 2) = (3 ■ 250 + 1)/(5 ■ 250), Л-(1, 2) = 3 ■ 250/(5 ■ 250 + 1).

Находим Л+(0, 3), Л-(0, 3), по формулам (26): Л+(0, 3) = (3 ■ 226 + 1)/(5 ■ 226), Л-(0, 3) = 3 ■ 226/(5 ■ 226 + 1).

Находим х такие, для которых выполняются неравенства (35), т. е. Л+(0, 3) > д(х101), Л-(0,3) < д(х 101) + Р(х 101), Р(х 101) > 0. Неравенства выполняются для х = 0, т. к. Л+(0, 3) > д(0|01) = 0, Л-(0, 3) < д(0|01) + Р(0|01) = 1, Р(0|01) = 1 > 0, неравенства не выполняются для х = 1, т. к. Р(1101) = 0. Поэтому ж3 = 0.

Находим Л0 и р0 по формулам (7): Л0 = д(0|01) = 0, р3 = Р(0|01) = 1.

Находим Л+(0, 4), Л-(0, 4) по формулам (28): Л+(0,4) = (3 ■ 226 + 1)/(5 ■ 226), Л-(0,4) = 3 ■ 226/(5 ■ 226 + 1).

Находим х такие, для которых выполняются неравенства (35), т. е. Л+(0, 4) > д(х|010), Л-(0,4) < д(х|010) + Р(х|010), Р(х|010) > 0. Неравенства выполняются для х = 0, т. к. Л+(0, 4) > д(01010) = 0, Л-(0, 4) < д(0|010) + Р(0|010) = 3/5, Р(0|010) = 3/5 > 0, неравенства также выполняются для х = 1, т. к. Л+(0,4) > д(1|010) = 3/5, Л-(0,4) < д(1|010) + Р(1|010) = 1, Р(1|010) = 2/5 > 0. Таким образом, ж4 = 0, х4' = 1. Находим Л40, р40, Л4/0, р4/0 по формулам (36): Л40 = д(0|010) = 0, р40 = Р(0|010) = 3/5, Л4/0 = д(1|040) = 3/5, р40 = Р(1|010) = 2/5.

Находим Л21, р/21, Л/2/1, р/2'1, а затем Л/2, р'2, Л/1'2, р'1/2 по формулам (33): Л/21 = 0, р/21 = 3/5, Л,2/1 = 3/5, р,2/1 = 2/5, Л12 = 9/14, р,12 = 3/14, Л,1/2 = 12/14, р,1/2 = 2/14.

Производим сравнения (27). Обнаруживаем, что одновременно выполняются оба неравенства: Л12 + р/2 > Л-(3,1), Л7/2 < Л+(3,1).

При этом выполняется равенство 1 = п/23, т. е. Ь = п/2а. Поэтому буква ж4 = ж4' = 1,

буквы ж5, ... , ж8 находятся последовательно. Находится такая буква ж5, чтобы выполнялись условия q(x5|0101) = 0, P(ж5|0101) > 0. Эти условия выполняются при ж5 = 0. Находится такое жб, чтобы выполнялись условия q(x6|01010) = 0, P(жб|01010) > 0. Эти условия выполняются при жб = 0. Находится такое ж7, чтобы выполнялись условия q(x7|010100) = 0, P(ж7|010100) > 0. Эти условия выполняются при ж7 = 1. Находится такая буква ж8, чтобы выполнялись условия д(ж810101001) = 0, P(жв|0101001) > 0. Эти условия выполняются при ж8 = 1. Таким образом, искомое слово 01010011.

Теорема 3. Описанный алгоритм денумерации позволяет находить слово v = ж1... жп из множества S по данному номеру codeS(v).

Доказательство. Для доказательства потребуется доказать две вспомогательных леммы.

Лемма 2. Для любого а (0 < а < log n) верно утверждение, что если для всех 0 < i < п/2а по паре оценок А+(а, i), А-(а, i) таких, что

А+(а, i) - А-(а, i) < -1

2а + 1

А-(а, г) <А" + р", (37)

А+(а, г) > Аа,

и префиксу XI ...х2а(г-1) можно, с помощью процедур 1 или 2, найти подслово х2а(г-1)+1... х2«г и значения А", р" или такую пару слов, что одно из них будет равно х2а(г-1)+1... х2«г и соответствующие им значения А^а, А"а, р^а, р"а, причём для г = п/2а при выполнении дополнительного условия

А-(а, г) < Аа (38)

можно однозначно найти подслово х2а(^-1)+1... х2^ и значения А", р" то для всех

0 < г < п/2а+1 по паре оценок А+(а + 1, г), А-(а + 1, г) таких, что

А+(а + 1, i) - А-(а + 1, i) < 1

2а+2 qmai

А- (а + 1, i) < А«+1 + р«+1, А+(а + 1, i) > Аа+1

(39)

и префиксу х1... х2а+1(г-1) можно, с помощью процедуры 1, найти подслово х2а+1(^-1)+1... х2а+1^ (и значения А®+1, р"+1) или такую пару слов, что одно из них будет равно х2а+1(^-1)+1.. .х2а+1^ (и соответствующие им значения А^а+1, А^/а+1, р^а+1, р^'а+1), причём для г = п/2а+1 при выполнении дополнительного условия

А- (а + 1, i) < А«+1 (40)

подслово ж2а+1 (i-1)+1... ж2а+1^ можно найти однозначно.

Доказательство. Для некоторого а (0 < а < logn) предположим, что для всех 0 < i < п/2а по паре оценок А+(а, i), А-(а, i) таких, что

А+(а, i) - А-(а, i) < -т1

2а + 1

А-(а, i) <А" + ра, (41)

А+(а, i) > Аа

и префиксу х1 ...х2а(^_1) можно, с помощью процедур 1 или 2, найти подслово х2а(г-1)+1... х2^ (и значения А", р0) или такую пару слов, что одно из них будет равно х2а(г-1)+1... х2^ (и соответствующие им значения А^а, А"а, р¡а, р"а), причём для г = п/2а при выполнении условия

А-(а, г) < Аа (42)

подслово х2а(г-1)+1... х2^ и значения А", р0 можно найти однозначно.

Пусть для некоторого 3, 1 < 3 < п/2а+1, даны префикс х1... х2а+1(^-1) и оценки А+(а + 1, 3), А-(а + 1, 3), 1 < 3 < 2п/2а+1 такие, что

А+(а + 1, з) — А-(а + 1, 3) <

2а + 2

^'таж

А-(а + 1,з) < Аа+1 + ра+1, (43)

А+(а + 1, з) > Аа+1,

при этом если 3 = п/2а+1, то выполняется также условие

А-(а + 1,з) < А«+1. (44)

Применяем процедуру 1 для а = а + 1, Ь = 3. Находим А+(а, 23 — 1), А-(а, 23 — 1) по формулам (26). Покажем, что выполняются условия (41) для г = 23 — 1.

По лемме (1) и по (43) и по тому, что а > 0, -^ж > 1, выполняются неравенства

А+(а, 23 — 1) — А-(а, 23 — 1) < А+(а + 1, 3) — А-(а + 1, 3) + 2 ■ 23-(2а+2Г1о§<

< оа + 2 + Ол+2 <

2а + 2 1 2а + 2 2а + 1

^'таж ^'таж ^'таж

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

Таким образом,

По (7) отсюда следует, что

А+(а, 23 — 1) — А-(а, 23 — 1) < . (45)

А"+1 = Аа,-1 + Аа,- ■ Р^-Ъ ^ > 0, Р2:,-1 > 0,

л а ^ \а+1 А2^-1 < А .

Отсюда и по (26), (43) выполняются неравенства

А+ (а, 23 — 1) > А+(а + 1,3) > А°а+1 > А^,

таким образом верно неравенство

А+(а, 23 — 1) > А0,--1- (46)

По (7)

А а+1 + ра+1 _ \а + а а а + а а _ а а + (Аа + а ) а

Из (7) следует, что

ао-+ра^- < 1.

1

Это означает, что

\а+1 I „а+1 ^ \а а

Л + р < Л2^-1 + р2^-1. Отсюда и по (26), (43) выполняются неравенства

Л-(а, 23 - 1) < Л-(а + 1,3) < Л^1 + ра+1 < ^.-1 + рО-1, таким образом верно неравенство

Л-(а, 23 - 1) <Л0?--1 + р0,--1. (47)

Из (45), (46), (50) следует выполнение условий (41) для г = 23 - 1. Отсюда по предположению можно найти с помощью процедур 1 или 2 подслово ж2а(2?-2)+1... ж2а(2?-1) и значения

Л0-1, ра^-1 или пару подслов ж/2а(2^-2) + 1 . . . ж/2а(2^-1) и ж/2/а(2^-2)+1 . . . ж/2/а(2^-1) и соотвествую-

щие им значения Л0j-1, р/2^-1, Л/2/^а-1, р/2/а-1.

Во втором случае, согласно процедуре 1, проверяем, выполняются ли неравенства (27) для

а = а + 1, Ь = 3.

Покажем, что если выполняется первое неравенство, то, как и вычисляется при выполнении процедуры 1, ж1. ..ж2а(2^-2) = ж! ... ж/2/а (2^-2), Ла-1 = Л^-, ра?--1 = р//а7-1, если же выполняется второе неравенство, то ж1... ж2а(2^-2) = ж/1... ж/2а(2?-2), Ла?--1 = Л;0:/-1,

р г^*-1 = р'а:/-1.

Из (7) следует, что

Поэтому если

то

Л+(а + 1, 3) > Ла+1 > Л?, 1.

Л/2"_ 1 >Л+(а + 1,3),

\ /а / \ а

Л2^-1 = Л2^-1,

следовательно, ж/2а(2?-2)+1 . ..ж/2а(2?-1) не может быть равно ж2а(2?-2)+1... ж2а(2?--1). Отсюда

ж2а(2^-2) + 1 . . . ж2а(2.7-1) = ж2а(2^-2)+1 . . . ж2а(2^-1) и соответственно Ла?--1 = Л/2/а-1, ра?-1 = р2а-1. Аналогично, если

Л/а-1 + р,2^-1 < Л-(а + 1,3),

то это означает, что ж2а(2?-2)+1... ж2а(2?-1) = ж/2а(2?-2)+1... ж/2а(2?-1) и соответственно / / Л2^-1 = Л2.?-1> р2^-1 = р2^-1-

Если в результате сравнений (27) или без них нам на этом этапе согласно процедуре 1 нам стали известны точные значения Ла:?--1 и ра?-1, вычисляем оценки Л+(а, 23), Л-(а, 23) по формулам (28) для а = а + 1, Ь = 3. Покажем, что выполняются условия (41) для г = 23. По лемме (1) и по (43) и по тому, что а > 0, -тах > 1, выполняются неравенства

Л+ (а, 23) - Л-(а, 2з) < Л+ (а + 1, з)а- Л-(а + 1, 3) + 2 ■ 23-(*"+2По**»«|+0 <

ра7-1

Таким образом,

< 2а + 2 + 2а + 2 < 2а + 1

дтах дтах дтах

Л+(а, 23) - Л-(а, 23) <. (48)

?тах

1

1

1

По (28) и по (43) выполняются неравенства

+ , х А+(а + 1,?) — А», 1 А»+1 — А», 1

А+^ 2?) > —(--— > 3 р— ^ = ^,

р2,-1 р2,- 1

таким образом

А+ (а, 2?) > А»,. (49)

По (7)

А а+1 + р»+1 = А» + А 2 а + 2 а = а а + (ла + ра ) ра

Из (7) следует, что

А» + р», < 1.

Это означает, что

+1 +1 Л,- + р, < А2з-1 + р2,-1.

Отсюда и по (26), (43) выполняются неравенства

А-(а, 2? — 1) < А-(а + 1,?) < А»+1 + р»+1 < А»- + р»,-1, таким образом, верно неравенство

А-(а, 2? — 1) < А О,-1 + рО-1. (50)

По (7), (28) и (43) выполняются неравенства

А-(а + 1,?) — А» А»+1 + р»+1 — А», 1

А-(а, 2?) < -(--^ < А-р»-^ = А», + р»

р2?-1 р2?-1

таким образом, верно неравенство

А-(а, 2?) <Ла, + р»,. (51)

Из (48), (49), (51) следует выполнение условий (41) для г = 2?. Аналогично доказывается выполнение условия (42) при г = 2? = п/2». Отсюда по предположению можно найти с помощью процедур 1 или 2 подслово ж2а(2,-1)+1... ж2а(2,) и значения А»,, р», или пару подслов ж2а(2,-1)+1... ж'2а(2,) и х'2'а(2,-1)+1... ж'2'а(2,) и соотвествующие им значения А'^-, р'2", А,, р2» , причём для ? = п/2»+1 можно найти подслово ж2а(2,-1)+1... ж2а(2,) однозначно.

Покажем, что если ни одно из неравенств (27) для а = а + 1, 6 = ? не выполняется, то действительно, как и вычисляется в результате выполнения процедуры 1, буквы X, ж" 2»(2? — 1) + 1 < г < 2»2?, можно найти последовательно, подбирая значения, удовлетворяющие условиям соответственно (29) и (30).

Очевидно, что невыполнение неравенств (27) равносильно одновременному выполнению неравенств

А2,-1 + р23-1 > А-(а + 1, ?),

А2а-1 < А+ (а + 1,?). ( )

Так как х'2а(2^-2)+1... х'2а(2^-1) лексикографически предшествует х'2'а(2^-2)+1... х'2'а(2^-1), то существует такое минимальное £, 2а(2^' — 2) +1 < £ < 2а(2^' — 1), что х£ < х£'. Это означает, по нахождению ЛЙ 1 и Л2?_ 1, что

\Иа л/а ^ N' ' ' X2a(2j-2) + 1 • • • N(x1 • • • X2a(2j-2)+1 • • • X2a(2j-1) A2j-1 - Л2,-1 ^ -—- >

N (X1 • • •X2a(2j-2)

N (X1 • • • X2a(2j-2)

p2j-1,

то есть

Отсюда и (52)

w« , /« ^ \//а Л2?- 1 + p2j- 1 — Л2?- 1

Л-(а + 1, j) < A'2j-1 + p'2j-1 — Л+(а + 1, j), Л-(а + 1, j) < A j 1 — Л+(а + 1, j)•

(53)

Отсюда и по (43)

а + 1,j) - j <

2а + 2

qmax

(Л, 1 + pj 1) - Л-(а + 1,j) <

^а + 2 '

(54)

Пусть X2a(2j-2)+1 • • • x2a+lj — x2a(2j-2) + 1 • • • x2a+!j • Тогда

/ /

Л2?- 1 — Л2?- 1, p2j- 1 — p2j- 1'

По (7), (54), (43), (24)

Л21 + p2j

(Л«+1 + p«+1) - Л«,_ 1

>

p 2 j—1

Л-(а + 1,j) - Л«.,-! 1

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

>--— > 1 -

p2j 1

Таким образом,

q2a+2 p« imai r2j-1

Л2 j + p2 j > 1 -

q2" 1

> 1 - ^max > 1 -

2a + 2

q2 +

2a

qmax

qm2

Легко убедиться, принимая во внимание (24), что это возможно только при

Л«, + p«j — 0'

Это означает, что если x'2a(2j-2)+1 • • • x'2a(2j-1) — X2a(2j-2)+1 • • • X2a+i(2,-1), то x2a(2j-1)+1 • • • x2a(2j) это слово, которое можно получить, находя последовательно буквы xi, 2«(2j - 1) + 1 — i — 2«2j, удовлетворяющие условиям (29). Пусть X2a(2j-2) + 1 • • • X2a+lj — x'2/a(2j-2)+1 • • • x^a+l, • Тогда

// //

Л2,-1 — Л2,-1, p2j-1 — p2j-1'

По (7), (54), (43), (24)

л Ol Л2,

\«+1 \« Л, - Л2,-1

p2 j 1

<

< Л+(а + 1,j) - Л«,-1 < 1 1

<

2a

qmai

p2j 1

q2a+2 p« — q2a+2 4max ' 2j-1 4max

<

2a qmax

1

1

1

1

UL

1

Таким образом,

л2? < q^

Легко убедиться, принимая во внимание (24), что это возможно только при АО, = 0. Это означает, что если ^(2,-2)+1 . . . ^+1(2,-1) = Х/2/а(2,-2) + 1 . . . Х'а(2,-1), то Х2а(2,-1)+1 . . . Х2а(2,) это слово, которое можно получить, находя последовательно буквы х", — 1) + 1 < к <

2а2, удовлетворяющие условиям (30).

Аналогично доказывается, что при ] — п/2а+1 Ж2а(2,-2)+1... ж

а + 1, - Х2а(2, —2) + 1 . . . Х2а + 1, ,

ж2а(2,-1)+1... ж2а(2,) это слово, которое можно получить, находя последовательно буквы ж", 2а(2^' — 1) + 1 < к < 2°2', удовлетворяющие условиям (30).

Очевидно, что следующие шаги процедуры 1, заключающиеся в конкатенации полученных подслов, приводят к получению подслова ж2а+1(,—1)+1... ж2а+, или такой пары слов, что одно из них будет равно ж2а+1(,—1)+1... ж2а+,, причём для ] — п/2а+1 подслово ж2а+1(,—1)+1... ж2а+1, можно найти однозначно.

Затем, согласно процеду] по формулам (32), (33), (34).

Затем, согласно процедуре 1, находятся значения Л"+1, pj+1 или , pja+1, Л^/а+1, pjto+1

Лемма 3. Для всех 0 < г < п по паре оценок А+(0, г), А (0, г) таких, что

А+(0, г) — А-(0, г) <

q2 !

У max

Л+(0, i) > Л0, Л-(0, i) <Л0 + p0,

(55)

и префиксу x1... xi-1 можно, с помощью процедуры 2, найти букву xi и значения Л0, p0 или такую пару букв xi и xi', что одна из них равна xi и соответствующие им значения Л^0, Л^0, Р?, pi'0, причём для i = n при выполнении дополнительного условия

Л-(0,i) < Л0, (56)

букву xn можно найти однозначно.

Доказательство. Пусть для некоторого i, 0 < i < n, даны оценки Л+(0, i), Л- (0, i) такие, что выполняется условие (55) префикс x1... xi-1.

Применяя процедуру 2 для b = i, находим все х, удовлетворяющие условиям (35). Из (55) следует, что для xi выполняются условия (35).

Покажем, что таких найденных х может быть не более двух, что неочевидно в случае, если нумеруются слова над алфавитом, в котором более двух букв. Пусть таких х более двух. Обозначим их в порядке возрастания х1, Х2, Хз. Тогда для х1 Л0 + p0 = q(x1|x1... xi-1) + P (х11 ...xi-1), что равно по (4) q^|x1 ...xi-1). Для хз Л0 = q^|x1 ...xi-1), что равно, по (4), q^^ ... xi-1) + P(х2|... xi-1). Таким образом, одновременно выполняются неравенства

Л-(0, i) < q(x2|x1.. .xi-1), Л+(0, i) > q(x2|xl... xi-1) + P(х21... xi-1).

Отсюда

Л+(0, i) - Л-(0, i) >P(х2|x1 ...xi-1).

По (24) P(х2|x1.. .xi-1) > i/q max

Л+(0, i) - Л-(0, i) > 1/qmax.

Получили противоречие с условиями (55). Отсюда следует, что может быть не более двух х, удовлетворяющих условиям (35). Значит, мы можем, применяя процедуру 2 для b = i, найти букву ж* или такую пару букв ж* и ж", что одна из них равна ж*.

Аналогично доказывается, что если даны оценки со свойствами (55), (56), то, применяя процедуру 2, можно найти букву ж*.

Очевидно, что в случае, если найдено ж*, с помощью процедуры 2 находятся А0 и р0 по формулам (7); в случае, если найдены ж* и ж", с помощью процедуры 2 находятся А*0, pf, А"0, р*'0, по формулам (36). □

Из леммы 1, следует что оценки А+ (1, log n), А- (1, log n), полученные на первом шаге выполнения алгоритма по формулам (25), обладают свойствами (37), (38) для i = 1, а = log n. Отсюда по леммам 2, 3 описанный алгоритм денумерации позволяет находить слово v = ж1... жп из множества S по данному номеру codeS(v). □

Опишем свойства алгоритма денумерации слов множества S.

Теорема 4. 1) Сложность денумерации, т. е. время, требуемое для нахождения одной буквы денумеруемого слова, равна

O(log nM (n log qw)/n), (57)

где M (n) — время умножения или деления двух слов длины n.

2) Объём памяти, требуемый для денумерации слова множества S длины n, равен

O((n log qWx)log n). (58)

Следствие 1. При использовании алгоритма быстрого умножения Шёнхаге - Штрассена, для которого M (n) = O(n log n log log n), скорость нумерации равна O(log n log log(n log qm„x) log log(n log qma;c)).

Следствие 2. При использовании алгоритма быстрого умножения Фюрера, для которого

M (n) = O(n log n2O(log*n)),

скорость нумерации равна

O (log n log(n log qmax )2O(log*(n log q™"'))).

Доказательство. Одной операции умножения при вычислении А" в (7) соответствует одна операция деления, причём при вычислении оценок А+(а, b), А-(а, b) длина числителя и знаменателя делимого не превосходит 2a log qmax бит, а делителя - 2a log qmax бит.

Длина делимого и делителя пропорциональна длине сомножителей, используемых при вычислении А". Следовательно, и время вычисления А+(а,Ь), А-(а,Ь) будет пропорционально времени вычисления А". Кроме операций деления, при декодировании вычисляются те же величины А" и р" или аналогичные им пары величин А^1, А^'" и рЬ", рЬ'а, которые используются при кодировании и для этого используется столько же времени. Следовательно, время, затрачиваемое на выполнение операций, необходимых на вычисление оценок А+(а, b), А-(а, b), 0 < а < log n, 1 < b < n/2a пропорционально времени кодирования O(log nM(n log qmax)/n).

Из описания алгоритма видно, что декодирование левой половины ж1... жп/2 и правой половины жга/2+1... жп слова проводится независимо и может осуществляться при использовании одной и той же памяти. Рассуждая так же, как при анализе кодирования, легко получить, что объёмы памяти, используемой при кодировании и декодировании, асимптотически совпадают. □

Опишем свойства денумерации слов языков Дика из скобок одного типа.

Теорема 5. 1)Скорость кодирования слова длины n языка Дика над алфавитом мощности 2, т. е. время, требуемое для кодирования одной буквы, равна O(log nM(n log n)/n) битовых операций, где M(n) - время умножения двух слов длины n.

2)Объём памяти, требуемый для кодирования слова длины n языка Дика над алфавитом мощности 2, равен O(nlog n) бит.

Следствие 1. При исполъзовании алгоритма быстрого умножения Шёнхаге - Штрассена, имеющего сложностъ M(n) = n log n log log n, скоростъ денумерацииравна O(log n log log n).

Следствие 2. При исполъзовании алгоритма быстрого умножения Фюрера, имеющего сложностъ M(n) = n log n2O(log*n), скоростъ денумерации равна O(log3 n2O(log*n)).

Доказательство. Следует из теоремы 4 и (20). □

4. Нумерация и денумерация двоичных слов длины п, содержащих п/2 единиц

Обозначим через множество двоичных слов длины п (п - чётное), в которых содержится ровно п/2 единиц. Например, для п = 4 множество В4 будет состоять из следующих слов: 0011, 0101, 0110, 1001, 1010, 1100.

Описанные в частях 2, 3 алгоритмы нумерации и денумерации слов множества Б можно применить для нумерации слов множества .

Значение |ВП| вычисляется исходя из определения множества по формуле

|Вп| = СП/2. (59)

Из определения следует, что

(х1х2 . . . х^) = СП-2-т, (60)

где т — количество единиц в префиксе х1х2 ... х^.

Можно видеть из (60) и определения (4), что для множества значения Р (х^|х1... х^-1) ( 0 < г < п ) вычисляются по формулам:

P(Xi|Xi . . . Xi— i) = (n - i + 1)!

(n — i)!

(n/2 — i + m)!(n/2 — m)!

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

n/2 — i + 1 + m

(61)

(n/2 — i + 1 + m)!(n/2 — m)!

n — i + 1

при xi = 0;

P(Xi|Xi . . .Xi—i)

(n — i)!

(n/2 — i + m)!(n/2 — m)!

(n — i + 1)!

(n/2 — i + m)!(n/2 — m +1)!

n/2 — m + 1 n — i + 1

(62)

при х^ = 1.

Применяя формулы (59), (61) и (62) и алгоритмы нумерации и денумерации слов множества Б, описанные в частях 2, 3, получаем алгоритмы нумерации и денумерации слов множества .

Можно видеть по определению -^ж и из (61) и (62), что для множества

qmax < п. (63)

Свойства алгоритмов кодирования и декодирования описывает следующая теорема.

Теорема 6. Объём памяти, требуемый для кодирования двоичного слова длины n с количеством единиц n/2, равен O(n log n) бит. Скорость кодирования слова длины n с заданным количеством единиц, т. е. время, требуемое для кодирования одной буквы, равна O(log nM(n log n)/n) битовых операций, где M(n log n) - время умножения двух слов длины

n log n.

Следствие 1. При использовании алгоритма быстрого умножения Шёнхаге - Штрассена, для которого M (n) = n log n log log n, скорость нумерации равна O(log3 n log log n).

Следствие 2. При использовании алгоритма быстрого умножения Фюрера, для которого M (n) = n log n2O(log*, скорость нумерации равна O(log3 n2O(log*n)).

Объём памяти, требуемый для денумерации слова длины n с количеством единиц n/2 , равен O(n log2 n).

Сложность денумерации, т. е. время, требуемое для нахождения одной буквы денумеруе-мого слова, равна O(log nM (n log n)/n), где M (n log n) — время умножения или деления двух слов длины n log n .

Следствие 1. При использовании алгоритма быстрого умножения Шёнхаге - Штрассена, имеющего сложность M (n) = n log n log log n, скорость денумерации равна O(log3 n log log n).

Следствие 2. При использовании алгоритма быстрого умножения Фюрера, имеющего сложность M (n) = n log n2O(log*n), скорость денумерации равна O(log3 n2O(log*n)).

Доказательство. Свойства следуют из теорем 1 и 4 и из (63). □

Литература

1. Beenker G. F. M., Immink K. A. S. A generalized method for encoding and decoding run-length-limited binary sequences // IEEE Transactions on Information Theory. 1983. V. 29, № 3. P. 751-754.

2. Cover T. M.Enumerative source encoding // IEEE Transactions on Information Theory. 1973. V. IT-19, №. 1. P. 73-77.

3. Datta S. and McLaughlin S. W. An enumerative method for runlength-limited codes: permutation codes // IEEE Transactions on Information Theory. 1999. V. IT-45, № 6. P. 21992204.

4. FUhrer M.Faster integer multiplication // Proceedings of the Thirty-Ninth Annual ACM Symposium on Theory of Computing (STOC 2007). San Diego, California, USA. 2007. P. 5766.

5. Gadouleau M. and Yan Z. Constant-rank codes and their connection to constant-dimension codes // IEEE Transactions on Information Theory. 2010. V. IT-56. P. 3207-3216.

6. Kautz W. Fibonacci codes for synchronization control // IEEE Transactions on Information Theory. 1965. V. 11, № 2. P. 284-292.

7. Knuth D. E. Efficient balanced codes // IEEE Transactions on Information Theory. 1986. V. IT-32. P. 51-53.

8. Koetter R and Kshcischang F. R. Coding for errors and erasures in random network coding // IEEE Transactions on Information Theory. 2008. V. 54, № 8. P. 3579-3591.

9. Lint J. H., van and Wilson RM. A Course in Combinatorics. Cambridge University Press, 2001 (second edition).

10. Milenkovic O. and Vasic B. Permutation (d; k) -codes: efficient enumerative coding and phrase length distribution shaping // IEEE Transactions on Information Theory. 2000. V. IT-46, № 7. P. 2671-2675.

11. Schonhage A. and Strassen V Schnelle Multiplikation grosser Zahlen // Computing. 1971. V. 7. P. 281-292.

12. Silberstein N. and Etzion T. Enumerative coding for Grassmannian space // IEEE Transactions on Information Theory. 2011. V. 57, № 1. P. 365-374.

13. Silberstein N. and Etzion T. Error-correcting codes in projective space via rank-metric codes and Ferrers diagrams // IEEE Transactions on Information Theory. 2009. V. IT-55. P. 2909-2919.

14. Skachek V. Recursive code construction for random networks // IEEE Transactions on Information Theory. 2010. V. IT-56. P. 1378-1382.

15. TangD. T., Bahl L. R. Block codes for a class of constrained noiseless channels // Information and Control. 1970. V. 17, № 5. P. 436-461.

16. Weber, J. H., Schouhamer Immink. Knuth's balanced codes revisited // IEEE Transactions on Information Theory. 2010. V. 56. P. 1673-1679.

17. Axo А., ЛамМ., Сети P., Ульман Дж. Компиляторы. Принципы, технологии и инструментарий. М.: Вильямс, 2008.

18. Кричевский P. Е. Сжатие и поиск информации. М.: Радио и связь, 1989.

19. Медведева Ю. С. Быстрая нумерация элементов грассманиана // Вычислительные технологии. 2013. Т. 18, № 3. С. 22-33.

20. Медведева Ю. С., Рябко Б. Я. Быстрый алгоритм нумерации слов с заданными ограничениями на длины серий единиц. //Проблемы передачи информ. 2010. Т. 46, № 4. С. 130-139.

21. Рейнольд Э., Нивергельт Ю., Део Н. Комбинаторные алгоритмы. Теория и практика. М.: Мир, 1980.

22. Рябко Б. Я. Быстрая нумерация комбинаторных объектов. // Дискретная математика. 1998. Т. 10. №2. С. 101-119.

23. Шень А. Программирование: теоремы и задачи. М.: МЦНМО, 2004.

Статья поступила в редакцию 03.10.2013; переработанный вариант - 01.11.2013.

Медведева Юлия Сергеевна

аспирант ИВТ СО РАН (630090 Россия, Новосибирск, пр. ак. Лаврентьева, 6), тел. (383) 330-61-50, e-mail: brainwashed@yandex.ru.

Fast algorithm of enumerative encoding for main problems of information theory Yu. Medvedeva

We propose the algorithm of fast enumeration for main problems of coding theory. These problems are: 1) encoding of binary words with given number of ones and its special case when number of ones equals number of zeroes; 2) encoding of run-length-constrained words. This problem is of interest to magnetic recording and some other fields; 3) encoding of the Grassmannian space elements and encoding of the Dyck language words. We apply the modification of method of fast enumeration of combinatorial objects proposed by B. Ryabko to stated problems. Our algorithm has less computational complexity than other known algorithms do.

Keywords: encoding, enumerative encoding, information theory.

i Надоели баннеры? Вы всегда можете отключить рекламу.