1 不変条件による正当性
繰り返しを含む手続きの正当性は、繰り返しのたびに保たれる性質を一つ取り出すことで示す。ここでは while ループ
while B do S
を対象とする。Bはループ継続条件(述語)、Sはループ本体である。プログラムの実行途中の状態(変数の値の組)をσで表し、ループ入口に到達した時点の状態を順にσ0,σ1,σ2,…とする。すなわちσ0はループに初めて到達した状態、σk+1はσkでBが真であって本体Sを一度実行した直後の状態である。
定義 1.1 (ループ不変条件). 状態に関する述語Pが上のループのループ不変条件であるとは、次の二条件をみたすことをいう。
- (初期化)ループ入口に初めて到達した時点でP(σ0)が成り立つ。
- (維持)任意のkについて、P(σk)が成り立ちかつB(σk)が真(ゆえに本体がもう一度実行される)ならば、実行後の状態でP(σk+1)が成り立つ。
さらにループが停止したとき、継続条件の否定¬BとPをあわせて所期の事後条件を導くことを確認する段階を(終了)とよぶ。不変条件による正当性証明は、この初期化・維持・終了の三段からなる。
事後条件Qとは、手続きが「正しい出力を返した」ことを表す状態の述語である。不変条件が満たすべきは「毎回成り立つほど弱く、しかし停止時にはQが導かれるほど強い」という緊張関係であり、適切なPを見つけることが証明の核心になる。
定理 1.2.Pを定義 1.1の意味でのループ不変条件とする。ループが(有限回の反復で)停止し、停止時の状態をσNとすると、P(σN)∧¬B(σN)が成り立つ。したがって含意
P(σ)∧¬B(σ)⟹Q(σ)がすべての状態σについて成り立つならば、ループは停止したとき必ず事後条件Qを満たす(部分正当性)。
証明. まず、ループ入口に到達したすべてのkについてP(σk)が成り立つことをkに関する数学的帰納法(§A3.10 定理 1.1)で示す。
- 基底(k=0)。初期化条件よりP(σ0)。
- 帰納段階。P(σk)を仮定する。ループが入口σk+1に到達したということは、σkで継続条件B(σk)が真であり本体Sが実行されたということである。維持条件より、その実行後の状態でP(σk+1)が成り立つ。
よってループ入口に現れる各状態でPが成り立つ。いま仮定によりループは有限回Nで停止する。停止するとは、状態σNに到達したとき継続条件が偽、すなわち¬B(σN)になることである。σNもループ入口の状態だから上で示したことよりP(σN)が成り立ち、あわせてP(σN)∧¬B(σN)を得る。仮定した含意にこれを適用してQ(σN)が従う。▨
停止性は不変条件とは独立の議論を要する。鍵は、各反復で確実に「減る」量を、それ以上は減れない下限をもつ整礎な集合の中に見つけることである。
命題 1.4. ループの状態に対して非負整数値の関数V(σ)∈N={0,1,2,…}(変量、または測度)が定まり、本体が一度実行されるたびに狭義に減少する、すなわちB(σk)が真ならばV(σk+1)<V(σk)が成り立つとする。このときループは有限回で停止する。
証明. 背理法による。ループが停止しないと仮定すると、ループ入口の状態の無限列σ0,σ1,σ2,…が生じ、各段で継続条件が真だから、仮定により
V(σ0)>V(σ1)>V(σ2)>⋯という非負整数の無限狭義減少列が得られる。ところが集合{V(σk):k≥0}⊆Nは空でないから、Nの整列性(§A3.10 定理 2.1)により最小元をもつ。その最小元をV(σm)とすると、次の項V(σm+1)<V(σm)が同じ集合に属するのに最小元より小さく、最小性に反する。よって仮定は誤りで、ループは停止する。▨
変量の値域はNでなくとも、無限狭義減少列をもたない整礎順序(たとえば辞書式に並べた非負整数の組)であればよい。以下ではユークリッドの互除法を例に、不変条件と変量の両方を具体的に構成する。
例 1.5. 整数a0≥b0≥0(a0>0)に対し、次の手続きはgcd(a0,b0)を返す。
(a,b)←(a0,b0);while b=0 do (a,b)←(b, amodb);return a.ここでamodbはaをbで割った余り(0≤amodb<b)である。
証明. 不変条件としてP: gcd(a,b)=gcd(a0,b0)をとる。まず補題として、b>0のときgcd(a,b)=gcd(b, amodb)を示す。r=amodbとおくと、ある整数qでa=qb+rと書ける。整数dがaとbの公約数ならばd∣(a−qb)=rだからdはbとrの公約数であり、逆にdがbとrの公約数ならばd∣(qb+r)=aだからdはaとbの公約数である。ゆえに{a,b}の公約数の集合と{b,r}の公約数の集合は一致し、その最大値も等しい。
この補題により不変条件を検証する。初期化ではgcd(a,b)=gcd(a0,b0)が定義そのものから成り立つ。維持では、本体が実行されるのはb=0(すなわちb>0)のときで、更新後の対は(b, amodb)だから補題よりgcd(b, amodb)=gcd(a,b)となり、不変条件が保たれる。
停止性は変量V=b(第二成分、非負整数)で示す。b>0で本体を実行すると新しい第二成分はamodb<bだからVは狭義に減少する。命題 1.4よりループは停止する。
終了では、停止時に継続条件の否定b=0が成り立つ。不変条件とあわせてgcd(a,0)=gcd(a0,b0)を得るが、a>0の任意の約数が0を割るのでgcd(a,0)=a、ゆえに返り値aはgcd(a0,b0)に等しい。定理 1.2により手続きは正しい。▨
検算(gcd(1071,462)). 手続きを実行すると、(a,b)は
(1071,462)→(462,147)→(147,21)→(21,0)
と遷移する。各段は1071=2⋅462+147、462=3⋅147+21、147=7⋅21+0に対応し、変量bは462>147>21>0と単調に減少して停止する。返り値は21であり、実際1071=21⋅51、462=21⋅22でgcd(51,22)=1だからgcd(1071,462)=21、返り値と一致する。
2 計算量の漸近記法
比較の対象になるのは、個々の入力に対する実行回数ではなく、入力の大きさに対する最悪の実行回数である。まずこの量を定める。
定義 2.1 (入力サイズと時間計算量). アルゴリズムAが受け取ることのできる入力の全体をIとする。入力I∈Iを定められた符号化で表すのに要する記号の個数をIの入力サイズといい∣I∣で表す。Aが入力Iに対して停止するまでに実行する基本操作の回数をtA(I)と書く。非負整数nに対してIn:={I∈I:∣I∣=n}とおき、Inが空でなく有限であるとき
TA(n):=I∈InmaxtA(I)をAの最悪時間計算量という。本記事で単に時間計算量というときは、最悪時間計算量を指す。
何を基本操作として1回と数えるかは計算モデルによって定まる。本記事では、定数個の値に対する比較、代入、および四則演算をそれぞれ1回の基本操作として数える。
TAの値そのものは計算モデルの決め方に左右されるので、定数倍や低次の項を無視して増加の位数だけを見ると比較に都合がよい。以下、f,g:N→R≥0を(十分大きいnで正の値をとる)関数とする。
定義 2.2 (漸近記法O, Ω, Θ). 定数c>0と非負整数n0に関する条件で、次の三つの関数の集合を定める。
- f∈O(g)とは、あるc>0, n0が存在してすべてのn≥n0で0≤f(n)≤cg(n)が成り立つこと(fはgで上から抑えられる)。
- f∈Ω(g)とは、あるc>0, n0が存在してすべてのn≥n0でf(n)≥cg(n)≥0が成り立つこと(下から抑えられる)。
- f∈Θ(g)とはf∈O(g)かつf∈Ω(g)であること。すなわちあるc1,c2>0, n0でn≥n0のときc1g(n)≤f(n)≤c2g(n)。
慣習に従いf∈O(g)をf(n)=O(g(n))とも書く。この等号は集合への所属を表す非対称な記法であって、通常の等式ではない。
命題 2.3. 次が成り立つ。
- (推移律)f=O(g)かつg=O(h)ならばf=O(h)。
- (和の上界)f1=O(g)かつf2=O(h)ならばf1+f2=O(max{g,h})。したがって有限個の項の和は、それらの上界の最大値で抑えられる。
- (多項式は指数より真に小さい)任意の定数k>0と底b>1に対してnk=O(bn)であるが、bn=O(nk)である。
証明. 1. 仮定よりc1>0, n1でn≥n1のときf(n)≤c1g(n)、またc2>0, n2でn≥n2のときg(n)≤c2h(n)。n0=max{n1,n2}、c=c1c2とおけば、n≥n0でf(n)≤c1g(n)≤c1c2h(n)=ch(n)。ゆえにf=O(h)。
2. 仮定よりn≥n1でf1(n)≤c1g(n)、n≥n2でf2(n)≤c2h(n)。n0=max{n1,n2}とすると、n≥n0で
f1(n)+f2(n)≤c1g(n)+c2h(n)≤(c1+c2)max{g(n),h(n)}.定数c1+c2をとればf1+f2=O(max{g,h})。
3. 比an=nk/bn≥0の挙動を調べる。n≥1で
anan+1=bn+1(n+1)k⋅nkbn=b1(1+n1)k.n→∞で(1+1/n)k→1だから、右辺は1/bに収束する。1/b<1なので、1/b<r<1をみたす定数rを一つ選ぶと、収束の定義よりあるNが存在して、すべてのn≥Nでan+1/an≤rとなる。したがってm≥0についてaN+m≤rmaNが帰納的に従い、0≤r<1よりaN+m→0。ゆえに数列(an)は収束(→0)ゆえ有界で、あるMでan≤Mがn≥Nで成り立つ。これはnk≤Mbn(n≥N)を意味しnk=O(bn)。
逆にbn=O(nk)と仮定すると、あるc,n0でn≥n0のときbn≤cnk、すなわちan=nk/bn≥1/c>0となり、an→0に矛盾する。ゆえにbn=O(nk)。▨
推移律と和の規則により、たとえば実行回数が3n2+5nlog2n+100の手続きはO(n2)、さらにΘ(n2)である。低次の項と定数係数は位数に寄与しない。
3 分割統治とマスター定理
分割統治法は問題をサイズn/bのa個の部分問題に分け、それらの解をf(n)の手間で統合する。計算量はしばしば漸化式
T(n)=aT(n/b)+f(n)(a≥1, b>1)
の形をとる。次の定理ではその解を三つの場合に分けて与える。以下、記述を簡明にするためnはbの冪n=bk(k∈N)を動くものとし、基底をT(1)=Θ(1)、fを非負とする。臨界指数をp=logbaで定める。
定理 3.1 (マスター定理). 上の漸化式について、p=logbaとおくと次が成り立つ。
- あるε>0でf(n)=O(np−ε)ならばT(n)=Θ(np)。
- f(n)=Θ(np)ならばT(n)=Θ(nplogn)。
- あるε>0でf(n)=Ω(np+ε)であり、かつ正則条件af(n/b)≤cf(n)をみたす定数c<1が十分大きいすべてのnで存在するならば、T(n)=Θ(f(n))。
証明.n=bkとするとk=logbn。漸化式をk回展開すると、T(1)の係数はak、第j段(j=0,1,…,k−1)で統合コストf(n/bj)がaj個生じるので
T(n)=akT(1)+j=0∑k−1ajf(bjn).ここでak=alogbn=nlogba=npに注意する。右辺第一項はΘ(np)である。第二項をg(n)=∑j=0k−1ajf(n/bj)とおき、場合ごとに評価する。f≥0なのでT(n)≥akT(1)=Ω(np)が常に成り立つことも用いる。
以下の各場合で、そこで用いる漸近評価がすべてのbq≥bq0で成り立つようにq0≥1を固定する。k≥q0とJ=k−q0に対し、g(n)を0≤j≤Jの段の和gup(n)とJ<j<kの段の和glow(n)に分ける。後者ではr=k−jと変数変換すると
glow(n)=r=1∑q0−1ak−rf(br)=npr=1∑q0−1a−rf(br)=O(np)となる。最後の和はnに依らない有限和であり、q0=1の場合は空和とする。これが、漸近評価を直接適用できない再帰木下端の有限段の寄与である。
場合 1.f(n)≤Cnp−ε(n≥bq0)とすると、bp=aよりa/bp−ε=bεであって、0≤j≤Jでは
ajf(bjn)≤Caj(bjn)p−ε=Cnp−ε(bp−εa)j=Cnp−ε(bε)j.bε>1の等比和で抑えると
gup(n)≤Cnp−εj=0∑k−1(bε)j≤bε−1Cnp−εbεk.bεk=(bk)ε=nεだからgup(n)=O(np)である。さらにglow(n)=O(np)なのでg(n)=O(np)となり、第一項とあわせT(n)=Θ(np)を得る。
場合 2.f(n)=Θ(np)のとき、a/bp=1より0≤j≤Jの各段は、一様な定数で
ajf(bjn)=Θ(aj(bjn)p)=Θ(np(bpa)j)=Θ(np)となる。この範囲の段数はJ+1=k−q0+1=Θ(k)だからgup(n)=Θ(knp)である。glow(n)=O(np)かつk=Θ(logn)なので、g(n)=Θ(nplogn)となる。第一項Θ(np)はこれに吸収されT(n)=Θ(nplogn)を得る。
場合 3.f(n)=Ω(np+ε)の評価と正則条件がともにn≥bq0で成り立つようにq0を選ぶ。0≤j≤Jでは、正則条件をj回反復適用してajf(n/bj)≤cjf(n)を得る。したがって
gup(n)≤f(n)j=0∑∞cj=1−cf(n)=O(f(n)).またglow(n)=O(np)=O(f(n))であるからg(n)=O(f(n))であり、j=0の項からg(n)≥f(n)なのでg(n)=Θ(f(n))となる。さらにnp=O(f(n))だから第一項も吸収され、T(n)=Θ(f(n))を得る。▨
一般のn(bの冪でない場合)に対する床・天井を含む漸化式でも、fが緩やかな正則性をもてば同じ結論が成り立つが、その還元は標準的なので本記事では省く。
適用例. 併合による整列はT(n)=2T(n/2)+Θ(n)、a=b=2、p=log22=1、f(n)=Θ(n)=Θ(np)ゆえ場合 2 でT(n)=Θ(nlogn)。二分探索はT(n)=T(n/2)+Θ(1)、p=log21=0、f(n)=Θ(1)=Θ(n0)ゆえ場合 2 でT(n)=Θ(logn)。カラツバ法の乗算はT(n)=3T(n/2)+Θ(n)、p=log23≈1.585、f(n)=n=O(np−ε)ゆえ場合 1 でT(n)=Θ(nlog23)となり、素朴なΘ(n2)より速い。
4 多項式時間と計算の限界
計算量は個々のアルゴリズムだけでなく、問題そのものの難しさを測る尺度にもなる。まず「効率的に解ける」の標準的な線引きを与える。
定義 4.1 (多項式時間と扱いやすさ). アルゴリズムが多項式時間で動くとは、入力サイズn(入力を表すのに要するビット数)に対する最悪時間計算量が、ある定数kについてO(nk)であることをいう。多項式時間アルゴリズムをもつ問題を扱いやすい(tractable)とよび、多項式時間で解ける判定問題全体の(非形式的な)クラスをPと書く。
対比として、最悪時間が2Ω(n)となるアルゴリズムは指数時間であり、命題 2.3の第 3 項が示すとおり任意の多項式より真に速く増大するため、nが中程度でも実行不能になりやすい。
計算モデル(Turing 機械)に基づくPの形式的定義は§E15 計算理論に委ねる。ここでは「多項式か指数か」という粗い二分が、扱いやすさの実務的な境界として機能することを押さえておけばよい。
次に、ある問題については、いかなるアルゴリズムを設計しても超えられない計算量の下限が示せる。代表例が比較に基づく整列である。
命題 4.2. 要素間の比較のみで並べ替えを行うアルゴリズム(比較に基づく整列)は、相異なるn個の要素を整列するのに最悪の場合Ω(nlogn)回の比較を要する。
証明.§D2.9 定義 4.1では、比較だけで入力の順序を識別する計算モデルを定めています。そのモデルに対して§D2.9 系 4.6では、相異なるn個の要素を正しく整列する決定木の高さがlog2(n!)=Ω(nlogn)以上であることを証明しています。決定木の高さは最悪の場合の比較回数に等しいので、本命題が従います。▨
この下界により、Θ(nlogn)で動く併合による整列は比較の回数の位数において最適である。下界は特定のアルゴリズムではなく比較モデル全体に対する主張である点が重要で、計算量理論の核心をなす。