コルモゴロフ複雑性

コルモゴロフ複雑性（コルモゴロフふくざつせい、英語: Kolmogorov complexity）とは、計算機科学において有限長のデータ列の複雑さを表す指標のひとつで、出力結果がそのデータに一致するプログラムの長さの最小値として定義される。コルモゴロフ複雑度、コルモゴロフ＝チャイティン複雑性 (Kolmogorov-Chaitin complexity) とも呼ばれる。
コルモゴロフ複雑性の概念は一見すると単純なものであるが、チューリングの停止問題やゲーデルの不完全性定理と関連する深遠な内容をもつ。コルモゴロフ複雑性やその他の文字列やデータ構造の複雑性の計量を研究する計算機科学の分野はアルゴリズム情報理論と呼ばれており、1960 年代末にアンドレイ・コルモゴロフ、レイ・ソロモノフ、グレゴリー・チャイティンによって創始された。

直観的な例

ある文字列が別の文字列よりも複雑であると言うためにはどうすればよいかという問題を考えよう。 例えば、同じ 60 文字の長さの 0, 1 からなる以下の 2 種類の文字列が与えられたとする。 
010101010101010101010101010101010101010101010101010101010101
110010000110000111011110111011001111101001000010010101111001
これらを見比べると、直観的に前者の文字列はより簡単であって、後者の方はより複雑であると感じる。 この直観を明確にするひとつの方法として、文字列を言語で説明することを考えよう。 このとき前者は「01 の 30 回の繰り返し」と 11 文字で説明できる。 それに対して、後者はそのような簡単な説明が与えられそうもなく、説明するには文字列そのものを含めて 60 文字以上で記す他はないように思える。 
この例のように言語による記述によって短くできる文字列がある一方で、圧縮できないような文字列も存在しており、文字列の説明の長さは文字列そのものの複雑さと関係していると考えられる。 このことをより形式的に取り扱うためにアルゴリズムという概念を用いて定式化されたものがコルモゴロフ複雑性である。 
コルモゴロフ複雑性を定めるためには、文字列に対する形式的な記述言語をまず指定しなければならない。 このような記述言語としては何かの具体的なプログラミング言語を選べばよい。 あるプログラム言語 L を固定したとき、 L のプログラム p が有限長の文字列 x を出力するなら、p は x の「記述」であるということにする。 
このとき特に p として x 自身を明示的に含むような自明な記述がある。 例えば、上記の前者の文字列を標準出力に出力する Perl プログラムは、
print "010101010101010101010101010101010101010101010101010101010101"
のようになるだろう。 このようなプログラムの長さは明らかに x の長さよりもある定数分だけ長くなる。 しかし文字列に何かの構造が発見できれば、適切なアルゴリズムを用いることによってより短いプログラムを作れるかもしれない。 例えば次のPerlプログラムは上と同じ文字列を出力する。
print "01" x 30
このように記述言語 L における文字列 x のあらゆる記述のうちで最小の長さをもつ記述が見出せたとするなら、その長さが L における x のコルモゴロフ複雑性となる。

圧縮不能な文字列

文字列 x が Kᵤ(x) ≧ |x|  となるなら x は「圧縮不能」であるという。 このような圧縮不能な文字列が存在するならどの程度存在するかを考えたい。 まず、簡単な基数 (濃度) についての考察から、ある長さの文字列 x すべての中には「圧縮不能」な文字列が少なくとも 1 つは存在していることがわかる。 なぜなら、長さ n のバイナリ列 (2 種類のアルファベットからなる文字列) は 2ⁿ 個存在するが、 それより短いバイナリ列は長さ 0 も含めて 2ⁿ - 1 しか存在しないからである。さらに同じ理由で、長さ n 以下の 2ⁿ⁺¹ - 1 個のバイナリ列のうち、その半数より多い 2ⁿ が長さ n をもつのであるから、ある長さ以下のバイナリ列のうち圧縮不能な文字列は半数より多い。
一般に、圧縮不能の定義に自然数 c だけの余裕を入れ、Kᵤ(x) ≧ |x| - c を満たすとした x を「c 圧縮不能」 という。 長さ n - c より短いバイナリ列の個数は、長さ n のバイナリ列と比べ、 (2ⁿ⁻ᶜ - 1) / 2ⁿ しかないので、 c 圧縮不能な文字列は全体の 1 - 1/2ᶜ より多い。 例えば、 c = 100 ビットだけ圧縮できるような文字列は、たかだか全体の 2⁻¹⁰⁰ ∼ 10⁻³⁰ しかない。
よって、ほとんどの文字列は文字列の長さと大きく違わないコルモゴロフ複雑性しかもたないだろうと結論できる。

データ圧縮の限界

(可逆な) 圧縮プログラムは与えられた文字列 x に関して、文字列 y を返す関数とみることができる。 ただし y は対応する展開プログラムで x に復元できなければならない。 よって、コルモゴロフ複雑性の定義から、展開プログラムの長さと y の長さの和は x のコルモゴロフ複雑性以上でなければならない。 この意味でコルモゴロフ複雑性はその文字列データに対する究極的な圧縮を限界づけている。
通常、圧縮プログラムでは y の長さは x よりも小さくなることが期待されるが、上述の圧縮不能な文字列の議論は圧縮プログラムに関しても成立するので、実際には圧縮できない x が少なくとも半数存在し、ほとんどは大きな圧縮ができない。 圧縮プログラムが我々が扱う多くの文字列を圧縮できるようにみえるのは、我々が実際に扱う文字列が、可能なすべての文字列と比べて極めて偏ったものにすぎないからである。
また、コルモゴロフ複雑性が計算不能であるという事実は、すべての文字列 x に対してコルモゴロフ複雑性がしめす究極の圧縮を実現するプログラムを作ることが原理的に不可能であるということを意味している。もしすべての文字列をコルモゴロフ複雑性まで圧縮するプログラムが存在すれば、その出力結果の長さを数えることでコルモゴロフ複雑性が計算できてしまい、上述の事実と矛盾するからである。

ランダム性

十分長い文字列において「圧縮不能」な文字列は、アルゴリズム化できるような何の規則性ももたないと考えられるので「ランダム」な文字列だとみなせるだろう。 コルモゴロフ複雑性を無限長の文字列に拡張したとき、圧縮できないような文字列は「アルゴリズム的にランダムな列」 (algorithmically random sequence) と呼ばれている。 正確には、与えられた無限列 x のすべての接頭部分列が c 圧縮不能であるような c が存在するとき、x はアルゴリズム的にランダムである。 
有限列の場合と同様に濃度の議論から、プログラムは可算個しかないのに対して、無限長のバイナリ列は非可算個であるので、この意味で「ほとんどすべて」の無限列はアルゴリズム的にランダムである。 しかしこのようなランダム列をプログラムによって生成することは決してできない。 統計的にランダム性をもつように見える列、例えば疑似乱数列や、円周率のような計算可能な超越数、あるいは有限長で記述される初期状態をもつ記号力学系が示すカオスなどは、すべてそれらを生成するプログラムが存在するので、この意味でのランダムではない。 ランダムな文字列はその特定の文字列の説明の複雑さという直観を元にしたコルモゴロフの意味ではもっとも複雑となるが、ランダムな列のアンサンブルは逆に統計的に特徴づけることがもっとも簡単な文字列でもある。