このドキュメントは http://edu.net.c.dendai.ac.jp/ 上で公開されています。
計算可能性理論はコンピュータの計算限界を議論する理論です。 人間の判定能力とコンピュータの判定能力を同一だと見なすチャーチの提唱に より、人間の思考の限界を議論するという哲学的な側面もあります。 ほぼ重要なことは大体判明しています。 「連立整数多項式の整数解存在の判定」というヒルベルトの第十問題は、こ の計算可能整理論により判定不能であることがわかりました。
本章では問題の複雑さを調べます。 但し、この理論で取り扱う「問題」とは問題例(instance)を無限個作れるよう なものです。
問題の複雑さを調べるにはそれを解くのに必要な資源量で議論します。 計算量の調べ方として、 lower bound(必要な資源量)と upper bound(十分な 資源量)と reducibility があります。
資源量として次のようなものが議論されます。
回路は入力の長さごとに構成します。そして、長さをパラメータとした回路の無 限集合を考えます。 この無限集合に対して入力の長さの関数として回路のサイズや段数を考えます。
Lower Bound はある問題を解くために必要な資源量を求めることです。 これは、その資源量が欠けると解くことができないという不可能性を示す必要 があります。 計算量理論において計算ができないことを示すのは困難なことで、まだ知られ ている結果は少ないです。 但し、暗号理論では安全性として条件を満たす盗聴者には解読できないことを 保証しなければならないため、分野としては重要です。 以下、知られている有名な結果を示します。
Sorting(並び替え)を二値の大小比較を使ってプログラムすると、少な くとも c n log n 回の比較をしないといけない。
if 文によりプログラムは 2 通りの計算に分岐します。 そのため、プログラムの流れにおいて、この分岐を木構造に書くことができま す(計算木)。 すると、 if 文はこの計算木の頂点になります。 このうち最も深い path の長さ(頂点数)が、求める必要な分岐数となります。
さて、入力として、 1 から n までを入れる時、並べ方は n! 個あります。 これらを最終的に 1 から n まで順番に並べるためには、全ての入力パターン に対して異なる計算(順序替え)になる必要があります。 k 段の二分木では最大 2k 個に分岐できるます。 そのため、最終的に n! 個の計算パターンになるためには n!= 2k つまり、log n! 段が必要です。 ここで以下のスターリングの公式を利用します。
すると、 となります。
パリティ(ビット数の偶奇判定)をする定数段の論理回路を作ろうと思う と、入力の長さに対して指数個のゲートが必要となります。
略
Upper Bound は 具体的なプログラムを与えて、計算量を議論することにより、問題を解くのに 必要な資源の上限を求める研究です。 この議論において計算量を示す方法が重要です。 「手元のパソコンで 4 秒」などという方法では比較の対象になりません。 実際、 OS やハードウェアの評価のためにベンチマークテストと いう特定のプログラムを動作させて実行速度を計測することがよく行われてま す。 これは雑誌によく掲載され、性能を求める利用者にとってよい広告になります。 そこで、良い成績を出そうという企業が、特定のベンチマークテスト を検知し、そのベンチマークテストに対しては処理を行わずに素早く処理を停 止させる 不正な製品を作ることがあります。
一方、特定の入力に対しては if 文であらかじめ計算しておいた値を出力すれ ば、高速に答えを得ることができるので、「ある特定状況下で使用する資源量」 では問題の難しさの本質を議論できません。
そのため、基本的にはプログラムの利用資源量は、入力の長さに関する関数と して与え、関数を比較する必要があります。
但し、さらにプログラムには次のような性質があります。
ある問題を T(n) 時間で計算できるプログラムがある時、同じ問題を cT(n)+2n 時間で計算できるプログラムを作ることができる(c>0)。
一度に処理するビット数を増やすことにより、一度に何ステップ を動作可能になることを示すことです。 但し、詳細な証明はプログラムを実行する枠組に依存するため、省略します。
この定理を使うと、例えば 秒で計算できる問題は 秒で計算できます。 そのため、プログラムの利用資源量を表すには通常オーダという 表現が用いられます。 直感的にはオーダーは関数の項のうち、最も増加の速い項から定数倍を取り除 いたものです。 例えば、次のように表現します。
f(n), g(n) に対して、 f(n)=O(g(n)) とは、ある c が存在して、 十分大きい全ての n に対して、 f(n)≤ c g(n) が成り立つこと。
次にある意味計算量理論の意義を示す定理を紹介します。 これは、時間やメモリがあればあるだけ解決できる問題が増えると言うもので す。
を満たす時、どのような T2(n)時間で計算するプログラムでも計 算できない、T1(n)時間計算可能な問題が存在する。
n 時間で計算できない n2計算可能な問題が存在します。
今のところ、T2(n)時間で計算可能なプログラムに対して、インタ プリタで処理する場合、少なくとも T2(n)log(T2(n)) 時間かかります(これより速いものができたら大発見)。 なぜ、 log 分だけ増えるかというと、プログラムが同時にアクセスを要求す るメモリを制限しないため、用意したメモリに適合させるように複数の要求を ひとつの記憶領域にまとめるのに時間がかかります。
証明方法は前回の K と同様です。 求める関数は次のようなものです。
この関数は O(T2(n)log(T2(n))) 時間で実行できます ので、条件より T1(n)時間で実行できます。
一方、T2(n) 時間実行可能な関数のうち、どのような関数を持っ てきてもこの関数を求めることはできません。 なぜなら、対角線論法により、その関数を計算するプログラムの Gödel 数が y の時、 その関数に y を入れた値は上記の定義により必ず食い違うか らです。
reducibility は推移律が成り立つ必要があります。 つまり多項式時間 Turing reducibility は以下の関係が成り立つ必要があります。 (many one に書き換えないと linear time が出てこない)
ここで に 時間、 に 時間かかるとします。 この時、 にどのくらいの時間がかかるでしょうか? 入力 x が A に含まれることを調べるのに、y1, y2, ..., yk を B に質問しなければならないとします。 この時、|x| は x の長さを表すとすると k≤p1(|x|) となりま す。 また、各 yi の長さは、計算時間が高々 p1(|x|) し かないので、同様に |yi|≤p1(|x|) となります。 ここで、 を適用すると、各 yi が B に入るかどうかは C に質問するプロ グラムにより p2(|yi|) 時間で計算できます。 従って、 を計算するのに、次の時間かかります。
階層定理があるので、例えば O(n2) 計算時間の問題や、 O(n3) 計算時間の問題など、実行時間の関数のオーダの違い毎に 区分する考え方は意味があります。
一方、 に n2 時間かかり、 に n3 時間かかるとすると、 に最悪 n2+n6 時間かかることになります。 これは単純なオーダによる計算時間で区切ったクラスで reducibility を議論 したためです。 これでは、推移律を満たすために合成した関数なりプログラムの計算量が計算時 間を越えてしまいます。 結局これは推移律を満たすために合成した関数の計算量が上記のように関数の和や 合成により得られるためです。
したがって、reducibility を考慮する問題のクラスを定義するには、計算量 を示す関数のオーダーが合成と和について閉じてなければなりません。 そのように閉じている例として次の関数族があります。
このうち、対数時間は通常の計算モデルでは入力を全て見ることができません。 また、線形時間では行列の計算すらできないので、実用的なプログラムの効率 を考える問題のクラスとしては範囲が狭いです。 そこで、計算量理論で最も重要で基本的なプログラムの効率のクラスは多項式 時間になります。これを Pで表します。
また、多項式領域計算をPSPACE で表します。 多項式時間内には高々多項式領域しか使えないので、 P⊆PSPACE が成り 立ちます。
また、reducibility を多項式時間に限定するとき、 2cnk 時間もこの reducibility において閉じていま す。 この時間の計算量のクラスを EXPTIME で表します。 階層定理より P⊂EXPTIME が成り立ちます。
一方自明ではありませんが、PSPACE⊆EXPTIME が成り立ちます。 つまり P⊆PSPACE⊆EXPTIME となります。
なお、合成などの議論は全て多項式時間 Turing reducibility で議論しまし たが、多項式時間 many-one reducibility でも同様の議論が成り立ちます。
reducibility に対して安定した問題のクラスを得たところで、完全問題を考 えます。 問題 A が EXPTIME-完全とは、全ての EXPTIME に含まれる問題 B に対して、 が成り立つことです。 例えば、 n×n の囲碁が先手必勝かどうかを判定するような問題が EXPTIME 完全に含まれます(つまり絶対に多項式時間のような効率の良い計算では解け ないことが言えます)。 なお、19×19 の通常の囲碁の場合、後手は先手に対し、 5.5 目のハンディを もらうのが通常なので、経験的には先手必勝です。