12.5 Lempel–Ziv 符号

ここまでの符号は,どれも 定義 12.1.1 の枠組みの中にあった.分布の族が与えられていて,そのどれが真かだけが分からない,という設定である.冗長度もミニマックス冗長度も,その族に対して定めた量だった.本節はその枠組みを離れる.前節の終わりに立てた問い,すなわち記憶のある情報源に対して,族を用意せずに文字あたりの符号長をエントロピーレート(定義 3.2.1)まで下げる符号があるか,に答えるためである.定義 12.1.1 の族の分布はどれも文字ずつの積なので,記憶のある情報源は,族をどう取り替えてもそこには入らない.そこで情報源の分布を持ち出さず,手元にある一本の系列だけを見て符号を作る.手がかりにするのは,系列の中で同じ並びが繰り返し現れることである.同じ並びが何度も出てくるなら,二度目からはその並びを指し示すだけで済む.どこがどう繰り返しているかは,分布を知らなくても系列そのものから読み取れる.

作り方はこうである.系列を先頭から読み,これまでに切り出した断片のどれとも違う並びが現れたところで区切り,その断片を辞書に加える.次からは辞書にある断片を足がかりにできるので,同じ並びが何度も出てくる系列では,断片がだんだん長くなり,本数が減っていく.断片の本数が減れば,それを書き並べるビット数も減る.これが 1978 年に提案された方式(LZ78 と呼ばれる)で,本書では Lempel–Ziv 符号 と呼ぶ.本節は分解の性質を三つ(フレーズが相異なること,長さの総和,本数の範囲)押さえ,そこから符号長を定めて評価する.

先に断りを一つ置く.本節が「符号長」と呼ぶのは,分解から決まるビット数のことである.12.2 節で述べた本章の方針では,長さの組が Kraft の不等式(定義 4.2.4)を満たすことを確かめたうえで,その長さをもつ符号の存在を 定理 4.2.2 に任せてきた.本節が定めるビット数については,その不等式を本書では確かめない.以下の評価はそのビット数についてのものであって,それを符号語長とする符号が読む側で復号できることまでは述べていない.

道具を一つ借りる.実数に対し,以下の最大の整数をと書き,床関数と呼ぶ.床関数についてが成り立つこと,およびならばであることを既知とする.当てる相手は,補題 12.5.6 の証明で対数の値を整数に切り下げるところ,定義 12.5.9 の符号長,定理 12.5.10 の証明で二つの床関数の値を比べるところ,そして 系 12.5.12 の証明でを使うところである.第14章 14.2 節 命題 14.2.3 の証明も,時分割の切れ目を評価するのにこの宣言を引く.ただしあちらが引くのは挟み撃ちの不等式のほうだけで,単調性は使わない.

系列を分解する

定義 12.5.1(最長一致の貪欲な分解). を空でない有限アルファベット,の文字を並べた有限列とする.辞書 を空の並び,区切り候補 を空列として始め,の文字を先頭からつずつ読む.読んだ文字を区切り候補の末尾に足した列をとし,が辞書にあれば区切り候補をに置き換え,が辞書になければフレーズ として出力したうえで辞書の末尾に加え,区切り候補を空列に戻す.を読み終えた時点で区切り候補に残っているものは出力しない.出力されたフレーズを出力順に並べた列をと書き,その項数と書く.最長一致の貪欲な分解 と呼ぶ.

形式化: lz78PhraseStrings (ソース)

定義 12.5.1 の分岐をそのまま読むと,区切り候補は辞書にある列である限り伸び続け,辞書から外れた瞬間に区切られる.すなわち区切り候補は,つねに空列であるか辞書にある列であるかのどちらかで,出力されるフレーズは「辞書にある列(または空列)に文字足したもの」である.最長一致という名前は,区切る前に候補をできるところまで伸ばす,というこの動きから来ている.読み終えたところで候補に残った切れ端を出力しないので,フレーズを全部つないでもに届かないことがある.そのぶんが 命題 12.5.4 の「以下」である.ただし,この切れ端も空列であるか辞書にある列であるかのどちらかだから,フレーズの並びに加えて,切れ端が辞書の何番目かを最後にもう一つ書き添えれば,全体が読み取れる.書き添えないとは決まらない.たとえばは,どちらも分解がで,違いは切れ端が空列かかというところにしかないからである.

例 12.5.2(文字の二値系列). X ={0,1}𝑥 =1011010100010(長さ)とすると

S(𝑥)=(1,0,11,01,010,00,10)

であり,|S(𝑥)| =7,フレーズの長さの総和はである.

証明. 定義 12.5.1 の手続きを追う.辞書は空,候補は空列から始まる.第の文字となり,辞書は空だからを出力して辞書に加える.第の文字となり,辞書にはしかないからを出力して加える.第の文字となり,これは辞書にあるから候補がになる.第の文字となり,辞書に無いからを出力して加え,候補を空に戻す.以下同様に,第・第の文字を,第から第の文字を(も辞書にあるので候補が二度伸びる),第・第の文字を,第・第の文字を出力する.出力は本で,読み終えた時点の候補は空列だから,長さの総和はの長さに等しい.

形式化上の注記. 具体的な系列を入れて分解を計算した宣言は無い.定義 12.5.1 の形式化 lz78PhraseStrings (InformationTheory/Shannon/LZ78/GreedyLongestPrefix.lean) は,辞書と候補を引数にとる補助関数の再帰としてそのまま計算できる形で書かれている.

例 12.5.2 では,本のフレーズのうち本が文字以上である.辞書が育つほど候補が長く伸びられるようになる,というのが 定義 12.5.1 の仕掛けである.逆に,どのフレーズも短いままなら,長さの総和が同じでも本数が増える.本数と長さのこのやりとりが,次の三つの主張で押さえる分解の性質であり,符号長の評価をそのまま決める.

分解の性質

命題 12.5.3. を空でない有限アルファベット,の文字を並べた有限列とすると,S(𝑥)定義 12.5.1)のフレーズはどの二つも相異なる.

証明(読んだ文字数についての数学的帰納法). 「辞書は,そこまでに出力したフレーズを出力順に並べたものに一致する」という不変量を示す.文字読んだ時点では辞書も出力も空であり,定義 12.5.1 の二つの分岐のどちらでも保たれる(第の分岐は辞書も出力も変えず,第の分岐は同じ列を両方の末尾に同時に加える).

フレーズが出力されるのはが辞書に無いときだけで,そのとき辞書はそれまでに出力したフレーズの全体だから,出力されるフレーズはそれ以前のどのフレーズとも異なる.出力の順に見れば,どの二つのフレーズも相異なる.

形式化: lz78PhraseStrings_nodup (ソース)

命題 12.5.4. を空でない有限アルファベット,の文字を並べた有限列とする.S(𝑥)定義 12.5.1)のフレーズはどれも空列でなく,それらを出力順に連結した列はの語頭(定義 4.1.2)であり,フレーズの長さの総和はの長さ以下である.

証明(読んだ文字数についての数学的帰納法). フレーズが空列でないことは,出力されるのが区切り候補に読んだ文字をつ足した列だからである.

残りの二つには,「そこまでに出力したフレーズを出力順に連結した列に,その時点の区切り候補をつないだものは,そこまでに読んだ文字を順に並べた列に等しい」という不変量を立てる.文字読んだ時点では三つとも空列であり,読んだ文字をとすると,定義 12.5.1 の二つの分岐のどちらでも保たれる(第の分岐は候補の末尾にを足し,第の分岐は候補にを足した列を出力へ移して候補を空列に戻すので,どちらもつないだ列の末尾にを足す).

を読み終えた時点で不変量を読むと,フレーズを連結した列に最後の区切り候補をつないだものがに等しい.よって連結した列はの語頭であり,その長さ,すなわちフレーズの長さの総和はの長さ以下である.

形式化: lz78PhraseStrings_forall_ne_nillz78PhraseStrings_flatten_prefixlz78PhraseStrings_total_length_le (ソース)

系 12.5.5. を空でない有限アルファベット,の文字を並べた長さの有限列とするとであり,さらにならばである(定義 12.5.1 の貪欲な分解).

証明. 上界から見る.命題 12.5.4 よりフレーズはどれも空列でないから,長さはどれも以上であり,本数は長さの総和以下である.同じ命題より長さの総和は以下だから,本数も以下である.

下界に移る.だから,定義 12.5.1 で最初の文字を読んだ時点で文字の列になり,そのときの辞書は空だからは出力される.よってフレーズは少なくとも本ある.

形式化上の注記. 系 12.5.5 の上界に対応する宣言は lz78PhraseStrings_count_le (InformationTheory/Shannon/LZ78/GreedyLongestPrefix.lean) である.下界に対応する宣言は無く,系 12.5.5 に付した証明がその保証のすべてである.二つを一つにまとめた宣言も無いので,形式化ポインタは付けない.

系 12.5.5 の上界は,どのフレーズも文字のままだった場合,つまり分解が何も学ばなかった場合の勘定である(実際には 命題 12.5.3 よりフレーズは相異なるので,文字のフレーズは高々本しかなく,を超えるとこの上界は達成されない.二値ならで達成されない).命題 12.5.4 より長さの総和はを超えないから,フレーズが長くなればそのぶん本数は減る.次はその減り方を,系列の中身によらない形で押さえる.効くのは 命題 12.5.3 の「相異なる」と,命題 12.5.4 の「空列でない」「長さの総和が以下」の三つだけで,どんな並びであろうと,相異なる列を何本もそろえるには文字数が要る,という一点に帰する.

フレーズは何本まで作れるか

補題 12.5.6(相異なる列の詰め込み). を空でない有限アルファベット,とし,の文字を並べた空でない有限列で,どの二つも相異なるものとすると

𝑘log2𝑘3log2(|X|+1)𝑘𝑗=1|𝑠𝑗|

である.

証明. と置く.は空でないからであり,である.また各以上だからである.のときは左辺がで右辺は以上だから,以下とする.

まず詰め込みを数える.以上の整数とすると,の文字を並べた長さ以下の列は高々本しかない.実際,に属さない記号を一つ用意し,長さ以下の列に,末尾にを足して長さちょうどにそろえた組を対応させる.もとの列には現れないから,組の最初のの手前までを読めばもとの列が復元でき,この対応は単射である.行き先はを足した個の記号を個並べた組の全体で,その個数はである.

次に長さで分ける.

𝑚0:=log2(𝑘/2)log2(|X|+1)

と置く.よりだから以上の整数であり,床関数の性質とから,すなわちである.前段より長さ以下のは高々本,すなわち本以下だから,長さ以上の本以上ある.長さは非負だから

𝑇(𝑚0+1)𝑘2

である.床関数の性質を入れ,を掛けると

2𝑇log2(|X|+1)>𝑘(log2𝑘1)

となる.

最後にまとめる.からである.前段の不等式に足してを得る.

形式化上の注記. 補題 12.5.6 に対応する宣言として total_length_ge_count_mul_log (InformationTheory/Shannon/LZ78/PhraseCounting.lean) がある.仮定は本文より弱く,本数が以上であることを要さない(列が相異なることと空でないことだけを課す).

形式化上の注記(本節と次節の詰め込みの不等式に共通). この形の不等式に対応する宣言は,を自然対数にとる.どの不等式も両辺が次なので,底を変えると両辺が同じ倍率で変わり,自然対数で書いた宣言と底で書いた本文の主張は同じことを述べている.そのうえで本節の三つ,すなわち 補題 12.5.6定理 12.5.7系 12.5.12 に対応する宣言は,詰め込みの数え上げの定数をでとる.本文はこれをでとるので,宣言はいずれも本文より弱い不等式を述べていることになり,三つとも形式化ポインタは付けない.機械検証が及んでいるのは,定数をにした形までである.

補題 12.5.6 の読み方は素直である.長さをある値以下に抑えた列は,その値で決まる本数しかないので,相異なる列を多く用意するほど,そのうち長いものの割合が増え,文字数の合計が膨らむ.裏返せば,文字数の合計がしかないところに詰め込める相異なる列の本数には限りがある.次の定理はこれを分解に当てる.

定理 12.5.7(貪欲な分解のフレーズ数). を空でない有限アルファベット,𝑛 1とすると

|S(𝑥)|log2|S(𝑥)|3log2(|X|+1)𝑛

である(定義 12.5.1 の貪欲な分解).

証明. と置くと,だから 系 12.5.5 よりである.命題 12.5.3 よりフレーズはどの二つも相異なり,命題 12.5.4 よりどれも空列でないから,補題 12.5.6に当てて

𝑘log2𝑘3log2(|X|+1)𝑘𝑗=1|𝑠𝑗|

を得る.命題 12.5.4 より右辺の和は以下で,は正だから,主張が従う.

形式化上の注記. 定理 12.5.7 に対応する宣言として lz78PhraseStrings_mul_log_le (InformationTheory/Shannon/LZ78/PhraseCounting.lean) がある.仮定は本文より弱く,長さが以上であること(すなわち)を要さない.

系 12.5.8. を空でない有限アルファベット,𝑛 2とすると

|S(𝑥)|6log2(|X|+1)𝑛log2𝑛

である(定義 12.5.1 の貪欲な分解).右辺の係数はだけで決まり,にもにも依らない.

証明. と置く.よりであり,よりである.定理 12.5.7 よりである.の大小で二つに分ける.

の場合を見る.は整数でだからであり,である.の両辺をで割ると

𝑘3log2(|X|+1)𝑛log2𝑘6log2(|X|+1)𝑛log2𝑛

である.

の場合に移る.補題 1.1.7 の対数不等式を底のもとでに当てるとである.ここでであり,よりだから,である.両辺にを掛けてで割るとを得る.と合わせて主張が従う.

形式化上の注記. 系 12.5.8 に対応する宣言として lz78PhraseStrings_count_isBigO (InformationTheory/Shannon/LZ78/PhraseCounting.lean) がある.ただしこれは,各に長さの系列を一つずつ与えた列に対し,フレーズ数がの定数倍で抑えられることを述べたもので,本文より狭いところが二つある.一つは係数で,本文はと具体的に書き,系列の取り方によらないと述べている.もう一つは範囲で,宣言は十分大きいについての評価であり,本文がのすべてで述べていることは覆っていない.そのため形式化ポインタは付けない.宣言が使う 定理 12.5.7 の形(lz78PhraseStrings_mul_log_le)のほうは系列ごとに成り立つ.機械検証が及んでいないのは,そこから系列に依らない係数を取り出すところと,のすべてに広げるところである.

系 12.5.8 が言っているのは,分解のフレーズ数が長さに比べて小さい,ということである.系 12.5.5本という上界に対し,が大きいところでは分のの水準までしか作れない(短い系列では 系 12.5.5 のほうが小さい.なら 系 12.5.8 の右辺がを下回るのはからで,例 12.5.2ではである).しかもこれは系列の中身によらず,どんな並びに対しても成り立つ.この差がそのまま符号長に効く.フレーズ本を書くのに要するビット数は,次の定義で見るとおりの水準だからである.次はその勘定を最後まで書き下す.

符号長

定義 12.5.9(Lempel–Ziv 符号長). を空でない有限アルファベット,𝑛 0とし,𝑘 :=|S(𝑥)|定義 12.5.1)と置く.Lempel–Ziv 符号長

LZ𝑛(𝑥):=𝑘(log2(𝑘+1)+log2|X|+2)

で定める.

形式化: フレーズあたりのビット数 LZ78Phrase.bitLength (ソース),符号長 lz78GreedyEncodingLength (ソース)

括弧の中は,フレーズ本を書くのに割り当てるビット数である.内訳はこうである.定義 12.5.1 の分岐から読んだとおり,各フレーズは辞書にある列(または空列)に文字足したものだった.そこで各フレーズを,足す前の列が辞書の何番目かという番号と,足した文字との対で書く.番号のほうは,空列の場合を合わせて通りを区別すればよいのでビット,文字のほうは通りだからビットである.二つを足したものが括弧の中で,どのフレーズにも同じだけ割り当てる(辞書が小さいうちは番号がもっと短く書けるが,本数を掛けたときの見積もりを簡単にするため,最後の大きさにそろえておく).対の並びを先頭から読めば,番号の指す列に文字を足してフレーズが一本ずつ決まり,辞書もそのつど組み直せるから,フレーズの列はここから復元できる.定義 12.5.1 の直後に見たとおり,に戻るにはさらに,読み残した切れ端が辞書の何番目かを書き足す必要がある.そのぶんは番号だけで足りるので,フレーズ本に割り当てるビット数より少ないが,定義 12.5.9 はこの本を数えていない.本節のはじめに断ったとおり,本書はこれらを主張として述べず,証明もしない.以下の評価は,定義 12.5.9 の右辺について述べたものである.

形式化上の注記. 対を固定長のビット列に書く割り当てが一意復号可能であること,すなわちビット列の並びから対の並びが復元できることは,ビット列の並びから符号語の並びが復元できることを述べた uniquelyDecodable_lz78TokenCode と,符号語から対に戻せることを述べた injective_lz78TokenCode (InformationTheory/Shannon/LZ78/ConverseUDObject.lean) の二つを合わせたものである.対の並びから系列そのものが決まる側には単独の宣言が無く,三つの合成で得られる.親の番号と足した文字がすべてのフレーズで一致すればフレーズの並びが一致することを述べた lz78PhraseStrings_getElem_eq_of_parentData_eq と,切れ端の番号が一致すれば切れ端が一致することを述べた lz78PhraseStrings_tail_eq_of_tailIdx_eq (InformationTheory/Shannon/LZ78/AsymptoticOptimality/ParentBridgeConverse.lean),そして 命題 12.5.4 に紐付けた lz78PhraseStrings_flatten_prefix (InformationTheory/Shannon/LZ78/GreedyLongestPrefix.lean) の三つである.

定理 12.5.10. を空でない有限アルファベット,𝑛 0とすると

LZ𝑛(𝑥)𝑛(log2(𝑛+1)+log2|X|+2)

である(定義 12.5.9 の符号長).

証明. と置くと 系 12.5.5 よりである.は狭義単調増加で,床関数はならばを満たすからであり,括弧の中はに取り替えても減らない.括弧の中は正だから,と合わせて,二つの因子をそれぞれ大きくして主張を得る.

形式化: lz78_encoding_length_le_n_log_n_plus_const (ソース)

系 12.5.11. を空でない有限アルファベット,𝑛 1とすると

LZ𝑛(𝑥)𝑛log2(𝑛+1)+log2|X|+2

である(定義 12.5.9 の符号長).

証明. 定理 12.5.10 の両辺をで割ればよい.

形式化: lz78_encoding_length_per_symbol_le (ソース)

系 12.5.11 の右辺はとともに増えるので,これだけでは文字あたりの符号長が定数で抑えられたことにならない.で済ませたのが,定数で抑えるという目的には粗すぎたのである(もっとも,短い系列では 系 12.5.11 の右辺のほうが小さい.なら,次の 系 12.5.12 の右辺を下回るのはの範囲で,例 12.5.13ではである).定理 12.5.10系 12.5.11 をここに置いたのは,フレーズ数の抑えを使わずに 系 12.5.5 だけでどこまで言えるかを先に出しておくためで,次はその一段だけを取り替える.定理 12.5.7 のフレーズ数の抑えを 定義 12.5.9 に入れ直せば,増える項が消える.

系 12.5.12. を空でない有限アルファベット,𝑛 1とすると

LZ𝑛(𝑥)𝑛3log2(|X|+1)+log2|X|+3

である(定義 12.5.9 の符号長).右辺はだけで決まり,にもにも依らない.

証明. と置くと,だから 系 12.5.5 よりであり,からである.床関数の性質と合わせると

LZ𝑛(𝑥)𝑘log2𝑘+𝑘(log2|X|+3)

である.定理 12.5.7 より第項は以下,系 12.5.5 より第項の以下だから,両辺をで割れば主張を得る.

形式化上の注記. 系 12.5.12 に対応する宣言として lz78_rate_le_const (InformationTheory/Shannon/LZ78/AsymptoticOptimality/EncodingLength.lean) がある.仮定は本文より弱く,の場合も含めて述べている.

例 12.5.13(文字の二値系列の符号長). 例 12.5.2X ={0,1}𝑛 =13)に対しビットである(定義 12.5.9 の符号長).

証明. 例 12.5.2 よりである.であり,だからである.よってフレーズ本あたりのビット数はで,である.

形式化上の注記. 例 12.5.13 は形式化されていない.例 12.5.13 に付した計算が,この主張の保証のすべてである.

文字を文字ビットで書き写せばビットで済むから,この系列では Lempel–Ziv 符号のほうが倍以上長い.フレーズ本にビットを払って,覆えているのは平均文字だからである.短い系列で膨らむのはこのためで,縮むとすれば,辞書が育ってフレーズ本の覆う文字数が増えてからである.その育ち方を,同じ文字が続くだけの系列で見ておく.

例 12.5.14(だけを並べた二値系列). X ={0,1}とし,個並べた列とする.を満たす最大の整数をとすると,S(𝑥)定義 12.5.1)は個,個,個並べた列をこの順に並べたもので,であり

LZ𝑛(𝑥)=𝑘(log2(𝑘+1)+3)

である(定義 12.5.9 の符号長).とくにではビット,ではビット,ではビットである.

証明. 分解から見る.定義 12.5.1 の手続きを追うと,辞書が個から個まで並べた列からなる状態では,区切り候補は個読むまで伸び,個目ので辞書から外れて出力される.よって出力は個,個,と並べた列がこの順に現れ,個の列まで出し終えた時点で読んだ文字数はである.のとり方よりだから個並べた列までは出力される.残る文字が個以上あればとなっての最大性に反するから,残りは個以下で,候補に残って出力されない.よってフレーズは本である.

ビット数を勘定する.だからであり,定義 12.5.9 の括弧の中はである.ではかつだからで,よりフレーズ本あたりビット,合わせてビットである.ではかつだからで,よりフレーズ本あたりビット,合わせてビットである.ではかつだからで,同じくよりフレーズ本あたりビット,合わせてビットである.

形式化上の注記. 例 12.5.14 は形式化されていない.例 12.5.14 に付した計算が,この主張の保証のすべてである.

辞書が育つ様子がそのまま数に出ている.では本のフレーズが文字を覆い,本あたり平均文字で,例 12.5.13文字より長い.それでもビットかかって,書き写すビットには負けている.でようやく書き写すのと並び,ではビットで書き写すより短くなる.これだけかかるのは,フレーズ本あたりのビット数が本数の対数で増えるいっぽう,この系列で本のフレーズが覆える文字数はと,本数の乗の水準でしか伸びないからである.縮むところまで持っていくには,同じ文字が続くだけの系列でもこれだけの長さが要る.

系 12.5.12 が抑えたのはそこまでである.文字あたりの符号長が定数を超えないことは分かったが,行き着く値が情報源のエントロピーレートかどうかは,ここまでの数え上げでは決まらない.数え上げが見ているのはフレーズが相異なることだけで,どのフレーズがどれだけ起こりやすいかを見ていないからである.次節は,そこに情報源の確率を入れる.

InformationTheory — 形式化検証つき情報理論教科書(レビュー版).数式は MathJax + AMS Euler で事前レンダリング.