1 不変条件による正当性
繰り返しを含む手続きの正当性は、繰り返しのたびに保たれる性質を一つ取り出すことで示す。ここでは while ループ
while B do S \textbf{while } B \textbf{ do } S while B do S
を対象とする。B B B はループ継続条件(述語)、S S S はループ本体である。プログラムの実行途中の状態(変数の値の組)をσ \sigma σ で表し、ループ入口に到達した時点の状態を順にσ 0 , σ 1 , σ 2 , … \sigma_0, \sigma_1, \sigma_2, \dots σ 0 , σ 1 , σ 2 , … とする。すなわちσ 0 \sigma_0 σ 0 はループに初めて到達した状態、σ k + 1 \sigma_{k+1} σ k + 1 はσ k \sigma_k σ k でB B B が真であって本体S S S を一度実行した直後の状態である。
定義 1.1 (ループ不変条件). 状態に関する述語P P P が上のループのループ不変条件 であるとは、次の二条件をみたすことをいう。
(初期化 )ループ入口に初めて到達した時点でP ( σ 0 ) P(\sigma_0) P ( σ 0 ) が成り立つ。
(維持 )任意のk k k について、P ( σ k ) P(\sigma_k) P ( σ k ) が成り立ちかつB ( σ k ) B(\sigma_k) B ( σ k ) が真(ゆえに本体がもう一度実行される)ならば、実行後の状態でP ( σ k + 1 ) P(\sigma_{k+1}) P ( σ k + 1 ) が成り立つ。
さらにループが停止したとき、継続条件の否定¬ B \lnot B ¬ B とP P P をあわせて所期の事後条件 を導くことを確認する段階を(終了 )とよぶ。不変条件による正当性証明は、この初期化・維持・終了の三段からなる。
事後条件Q Q Q とは、手続きが「正しい出力を返した」ことを表す状態の述語である。不変条件が満たすべきは「毎回成り立つほど弱く、しかし停止時にはQ Q Q を導くほど強い」という緊張関係であり、適切なP P P を見つけることが証明の核心になる。
定理 1.2 (不変条件による部分正当性). P P P を定義 1.1 の意味でのループ不変条件とする。ループが(有限回の反復で)停止し、停止時の状態をσ N \sigma_N σ N とすると、P ( σ N ) ∧ ¬ B ( σ N ) P(\sigma_N) \land \lnot B(\sigma_N) P ( σ N ) ∧ ¬ B ( σ N ) が成り立つ。したがって含意
P ( σ ) ∧ ¬ B ( σ ) ⟹ Q ( σ ) P(\sigma) \land \lnot B(\sigma) \;\Longrightarrow\; Q(\sigma) P ( σ ) ∧ ¬ B ( σ ) ⟹ Q ( σ ) がすべての状態σ \sigma σ について成り立つならば、ループは停止したとき必ず事後条件Q Q Q を満たす(部分正当性 )。
証明. まず、ループ入口に到達したすべてのk k k についてP ( σ k ) P(\sigma_k) P ( σ k ) が成り立つことをk k k に関する数学的帰納法(§A3.10 定理 1.1 )で示す。
基底(k = 0 k=0 k = 0 )。初期化条件よりP ( σ 0 ) P(\sigma_0) P ( σ 0 ) 。
帰納段階。P ( σ k ) P(\sigma_k) P ( σ k ) を仮定する。ループが入口σ k + 1 \sigma_{k+1} σ k + 1 に到達したということは、σ k \sigma_k σ k で継続条件B ( σ k ) B(\sigma_k) B ( σ k ) が真であり本体S S S が実行されたということである。維持条件より、その実行後の状態でP ( σ k + 1 ) P(\sigma_{k+1}) P ( σ k + 1 ) が成り立つ。
よってループ入口に現れる各状態でP P P が成り立つ。いま仮定によりループは有限回N N N で停止する。停止するとは、状態σ N \sigma_N σ N に到達したとき継続条件が偽、すなわち¬ B ( σ N ) \lnot B(\sigma_N) ¬ B ( σ N ) になることである。σ N \sigma_N σ N もループ入口の状態だから上で示したことよりP ( σ N ) P(\sigma_N) P ( σ N ) が成り立ち、あわせてP ( σ N ) ∧ ¬ B ( σ N ) P(\sigma_N) \land \lnot B(\sigma_N) P ( σ N ) ∧ ¬ B ( σ N ) を得る。仮定した含意にこれを適用してQ ( σ N ) Q(\sigma_N) Q ( σ N ) が従う。▨
停止性は不変条件とは独立の議論を要する。鍵は、各反復で確実に「減る」量を、それ以上は減れない下限をもつ整礎な集合の中に見つけることである。
命題 1.4 (整礎な変量による停止性). ループの状態に対して非負整数値の関数V ( σ ) ∈ N = { 0 , 1 , 2 , … } V(\sigma) \in \mathbb{N} = \{0, 1, 2, \dots\} V ( σ ) ∈ N = { 0 , 1 , 2 , … } (変量 、または測度)が定まり、本体が一度実行されるたびに狭義に減少する、すなわちB ( σ k ) B(\sigma_k) B ( σ k ) が真ならばV ( σ k + 1 ) < V ( σ k ) V(\sigma_{k+1}) < V(\sigma_k) V ( σ k + 1 ) < V ( σ k ) が成り立つとする。このときループは有限回で停止する。
証明. 背理法による。ループが停止しないと仮定すると、ループ入口の状態の無限列σ 0 , σ 1 , σ 2 , … \sigma_0, \sigma_1, \sigma_2, \dots σ 0 , σ 1 , σ 2 , … が生じ、各段で継続条件が真だから、仮定により
V ( σ 0 ) > V ( σ 1 ) > V ( σ 2 ) > ⋯ V(\sigma_0) > V(\sigma_1) > V(\sigma_2) > \cdots V ( σ 0 ) > V ( σ 1 ) > V ( σ 2 ) > ⋯ という非負整数の無限狭義減少列が得られる。ところが集合{ V ( σ k ) : k ≥ 0 } ⊆ N \{\, V(\sigma_k) : k \ge 0 \,\} \subseteq \mathbb{N} { V ( σ k ) : k ≥ 0 } ⊆ N は空でないから、N \mathbb{N} N の整列性(§A3.10 定理 2.1 )により最小元をもつ。その最小元をV ( σ m ) V(\sigma_m) V ( σ m ) とすると、次の項V ( σ m + 1 ) < V ( σ m ) V(\sigma_{m+1}) < V(\sigma_m) V ( σ m + 1 ) < V ( σ m ) が同じ集合に属するのに最小元より小さく、最小性に反する。よって仮定は誤りで、ループは停止する。▨
変量の値域はN \mathbb{N} N でなくとも、無限狭義減少列をもたない整礎順序(たとえば辞書式に並べた非負整数の組)であればよい。以下ではユークリッドの互除法を例に、不変条件と変量の両方を具体的に構成する。
例 1.5 (ユークリッドの互除法の正当性と停止性). 整数a 0 ≥ b 0 ≥ 0 a_0 \ge b_0 \ge 0 a 0 ≥ b 0 ≥ 0 (a 0 > 0 a_0 > 0 a 0 > 0 )に対し、次の手続きはgcd ( a 0 , b 0 ) \gcd(a_0, b_0) g cd( a 0 , b 0 ) を返す。
( a , b ) ← ( a 0 , b 0 ) ; while b ≠ 0 do ( a , b ) ← ( b , a m o d b ) ; return a . (a, b) \leftarrow (a_0, b_0); \quad \textbf{while } b \ne 0 \textbf{ do } (a, b) \leftarrow (b,\ a \bmod b); \quad \textbf{return } a. ( a , b ) ← ( a 0 , b 0 ) ; while b = 0 do ( a , b ) ← ( b , a mod b ) ; return a . ここでa m o d b a \bmod b a mod b はa a a をb b b で割った余り(0 ≤ a m o d b < b 0 \le a \bmod b < b 0 ≤ a mod b < b )である。
証明. 不変条件 としてP : gcd ( a , b ) = gcd ( a 0 , b 0 ) P:\ \gcd(a, b) = \gcd(a_0, b_0) P : g cd( a , b ) = g cd( a 0 , b 0 ) をとる。まず補題として、b > 0 b > 0 b > 0 のときgcd ( a , b ) = gcd ( b , a m o d b ) \gcd(a, b) = \gcd(b,\ a \bmod b) g cd( a , b ) = g cd( b , a mod b ) を示す。r = a m o d b r = a \bmod b r = a mod b とおくと、ある整数q q q でa = q b + r a = qb + r a = q b + r と書ける。整数d d d がa a a とb b b の公約数ならばd ∣ ( a − q b ) = r d \mid (a - qb) = r d ∣ ( a − q b ) = r だからd d d はb b b とr r r の公約数であり、逆にd d d がb b b とr r r の公約数ならばd ∣ ( q b + r ) = a d \mid (qb + r) = a d ∣ ( q b + r ) = a だからd d d はa a a とb b b の公約数である。ゆえに{ a , b } \{a, b\} { a , b } の公約数の集合と{ b , r } \{b, r\} { b , r } の公約数の集合は一致し、その最大値も等しい。
この補題により不変条件を検証する。初期化ではgcd ( a , b ) = gcd ( a 0 , b 0 ) \gcd(a, b) = \gcd(a_0, b_0) g cd( a , b ) = g cd( a 0 , b 0 ) が定義そのものから成り立つ。維持では、本体が実行されるのはb ≠ 0 b \ne 0 b = 0 (すなわちb > 0 b > 0 b > 0 )のときで、更新後の対は( b , a m o d b ) (b,\ a \bmod b) ( b , a mod b ) だから補題よりgcd ( b , a m o d b ) = gcd ( a , b ) \gcd(b,\ a \bmod b) = \gcd(a, b) g cd( b , a mod b ) = g cd( a , b ) となり、不変条件が保たれる。
停止性 は変量V = b V = b V = b (第二成分、非負整数)で示す。b > 0 b > 0 b > 0 で本体を実行すると新しい第二成分はa m o d b < b a \bmod b < b a mod b < b だからV V V は狭義に減少する。命題 1.4 よりループは停止する。
終了 では、停止時に継続条件の否定b = 0 b = 0 b = 0 が成り立つ。不変条件とあわせてgcd ( a , 0 ) = gcd ( a 0 , b 0 ) \gcd(a, 0) = \gcd(a_0, b_0) g cd( a , 0 ) = g cd( a 0 , b 0 ) を得るが、a > 0 a > 0 a > 0 の任意の約数が0 0 0 を割るのでgcd ( a , 0 ) = a \gcd(a, 0) = a g cd( a , 0 ) = a 、ゆえに返り値a a a はgcd ( a 0 , b 0 ) \gcd(a_0, b_0) g cd( a 0 , b 0 ) に等しい。定理 1.2 により手続きは正しい。▨
検算(gcd ( 1071 , 462 ) \gcd(1071, 462) g cd( 1071 , 462 ) ). 手続きを実行すると、( a , b ) (a, b) ( a , b ) は
( 1071 , 462 ) → ( 462 , 147 ) → ( 147 , 21 ) → ( 21 , 0 ) (1071, 462) \to (462, 147) \to (147, 21) \to (21, 0) ( 1071 , 462 ) → ( 462 , 147 ) → ( 147 , 21 ) → ( 21 , 0 )
と遷移する。各段は1071 = 2 ⋅ 462 + 147 1071 = 2 \cdot 462 + 147 1071 = 2 ⋅ 462 + 147 、462 = 3 ⋅ 147 + 21 462 = 3 \cdot 147 + 21 462 = 3 ⋅ 147 + 21 、147 = 7 ⋅ 21 + 0 147 = 7 \cdot 21 + 0 147 = 7 ⋅ 21 + 0 に対応し、変量b b b は462 > 147 > 21 > 0 462 > 147 > 21 > 0 462 > 147 > 21 > 0 と単調に減少して停止する。返り値は21 21 21 であり、実際1071 = 21 ⋅ 51 1071 = 21 \cdot 51 1071 = 21 ⋅ 51 、462 = 21 ⋅ 22 462 = 21 \cdot 22 462 = 21 ⋅ 22 でgcd ( 51 , 22 ) = 1 \gcd(51, 22) = 1 g cd( 51 , 22 ) = 1 だからgcd ( 1071 , 462 ) = 21 \gcd(1071, 462) = 21 g cd( 1071 , 462 ) = 21 、返り値と一致する。
2 計算量の漸近記法
比較の対象になるのは、個々の入力に対する実行回数ではなく、入力の大きさに対する最悪の実行回数である。まずこの量を定める。
定義 2.1 (入力サイズと時間計算量). アルゴリズムA \mathcal{A} A が受け取ることのできる入力の全体をI \mathcal{I} I とする。入力I ∈ I I \in \mathcal{I} I ∈ I を定められた符号化で表すのに要する記号の個数をI I I の入力サイズ といい∣ I ∣ |I| ∣ I ∣ で表す。A \mathcal{A} A が入力I I I に対して停止するまでに実行する基本操作の回数をt A ( I ) t_{\mathcal{A}}(I) t A ( I ) と書く。非負整数n n n に対してI n : = { I ∈ I : ∣ I ∣ = n } \mathcal{I}_n := \{I \in \mathcal{I} : |I| = n\} I n := { I ∈ I : ∣ I ∣ = n } とおき、I n \mathcal{I}_n I n が空でなく有限であるとき
T A ( n ) : = max I ∈ I n t A ( I ) T_{\mathcal{A}}(n) := \max_{I \in \mathcal{I}_n} t_{\mathcal{A}}(I) T A ( n ) := I ∈ I n max t A ( I ) をA \mathcal{A} A の最悪時間計算量 という。本記事で単に時間計算量 というときは、最悪時間計算量を指す。
何を基本操作として1 1 1 回と数えるかは計算モデルによって定まる。本記事では、定数個の値に対する比較、代入、および四則演算をそれぞれ1 1 1 回の基本操作として数える。
T A T_{\mathcal{A}} T A の値そのものは計算モデルの決め方に左右されるので、定数倍や低次の項を無視して増加の位数だけを見ると比較に都合がよい。以下、f , g : N → R ≥ 0 f, g : \mathbb{N} \to \mathbb{R}_{\ge 0} f , g : N → R ≥ 0 を(十分大きいn n n で正の値をとる)関数とする。
定義 2.2 (漸近記法O , Ω , Θ O,\ \Omega,\ \Theta O , Ω , Θ ). 定数c > 0 c > 0 c > 0 と非負整数n 0 n_0 n 0 に関する条件で、次の三つの関数の集合を定める。
f ∈ O ( g ) f \in O(g) f ∈ O ( g ) とは、あるc > 0 , n 0 c > 0,\ n_0 c > 0 , n 0 が存在してすべてのn ≥ n 0 n \ge n_0 n ≥ n 0 で0 ≤ f ( n ) ≤ c g ( n ) 0 \le f(n) \le c\,g(n) 0 ≤ f ( n ) ≤ c g ( n ) が成り立つこと(f f f はg g g で上から抑えられる)。
f ∈ Ω ( g ) f \in \Omega(g) f ∈ Ω ( g ) とは、あるc > 0 , n 0 c > 0,\ n_0 c > 0 , n 0 が存在してすべてのn ≥ n 0 n \ge n_0 n ≥ n 0 でf ( n ) ≥ c g ( n ) ≥ 0 f(n) \ge c\,g(n) \ge 0 f ( n ) ≥ c g ( n ) ≥ 0 が成り立つこと(下から抑えられる)。
f ∈ Θ ( g ) f \in \Theta(g) f ∈ Θ ( g ) とはf ∈ O ( g ) f \in O(g) f ∈ O ( g ) かつf ∈ Ω ( g ) f \in \Omega(g) f ∈ Ω ( g ) であること。すなわちあるc 1 , c 2 > 0 , n 0 c_1, c_2 > 0,\ n_0 c 1 , c 2 > 0 , n 0 でn ≥ n 0 n \ge n_0 n ≥ n 0 のときc 1 g ( n ) ≤ f ( n ) ≤ c 2 g ( n ) c_1\,g(n) \le f(n) \le c_2\,g(n) c 1 g ( n ) ≤ f ( n ) ≤ c 2 g ( n ) 。
慣習に従いf ∈ O ( g ) f \in O(g) f ∈ O ( g ) をf ( n ) = O ( g ( n ) ) f(n) = O(g(n)) f ( n ) = O ( g ( n )) とも書く。この等号は集合への所属を表す非対称な記法であって、通常の等式ではない。
命題 2.3 (漸近記法の演算則). 次が成り立つ。
(推移律 )f = O ( g ) f = O(g) f = O ( g ) かつg = O ( h ) g = O(h) g = O ( h ) ならばf = O ( h ) f = O(h) f = O ( h ) 。
(和の上界 )f 1 = O ( g ) f_1 = O(g) f 1 = O ( g ) かつf 2 = O ( h ) f_2 = O(h) f 2 = O ( h ) ならばf 1 + f 2 = O ( max { g , h } ) f_1 + f_2 = O(\max\{g, h\}) f 1 + f 2 = O ( max { g , h }) 。したがって有限個の項の和は、それらの上界の最大値で抑えられる。
(多項式は指数より真に小さい )任意の定数k > 0 k > 0 k > 0 と底b > 1 b > 1 b > 1 に対してn k = O ( b n ) n^k = O(b^n) n k = O ( b n ) であるが、b n ≠ O ( n k ) b^n \ne O(n^k) b n = O ( n k ) である。
証明. 1. 仮定よりc 1 > 0 , n 1 c_1 > 0,\ n_1 c 1 > 0 , n 1 でn ≥ n 1 n \ge n_1 n ≥ n 1 のときf ( n ) ≤ c 1 g ( n ) f(n) \le c_1 g(n) f ( n ) ≤ c 1 g ( n ) 、またc 2 > 0 , n 2 c_2 > 0,\ n_2 c 2 > 0 , n 2 でn ≥ n 2 n \ge n_2 n ≥ n 2 のときg ( n ) ≤ c 2 h ( n ) g(n) \le c_2 h(n) g ( n ) ≤ c 2 h ( n ) 。n 0 = max { n 1 , n 2 } n_0 = \max\{n_1, n_2\} n 0 = max { n 1 , n 2 } 、c = c 1 c 2 c = c_1 c_2 c = c 1 c 2 とおけば、n ≥ n 0 n \ge n_0 n ≥ n 0 でf ( n ) ≤ c 1 g ( n ) ≤ c 1 c 2 h ( n ) = c h ( n ) f(n) \le c_1 g(n) \le c_1 c_2 h(n) = c\,h(n) f ( n ) ≤ c 1 g ( n ) ≤ c 1 c 2 h ( n ) = c h ( n ) 。ゆえにf = O ( h ) f = O(h) f = O ( h ) 。
2. 仮定よりn ≥ n 1 n \ge n_1 n ≥ n 1 でf 1 ( n ) ≤ c 1 g ( n ) f_1(n) \le c_1 g(n) f 1 ( n ) ≤ c 1 g ( n ) 、n ≥ n 2 n \ge n_2 n ≥ n 2 でf 2 ( n ) ≤ c 2 h ( n ) f_2(n) \le c_2 h(n) f 2 ( n ) ≤ c 2 h ( n ) 。n 0 = max { n 1 , n 2 } n_0 = \max\{n_1, n_2\} n 0 = max { n 1 , n 2 } とすると、n ≥ n 0 n \ge n_0 n ≥ n 0 で
f 1 ( n ) + f 2 ( n ) ≤ c 1 g ( n ) + c 2 h ( n ) ≤ ( c 1 + c 2 ) max { g ( n ) , h ( n ) } . f_1(n) + f_2(n) \le c_1 g(n) + c_2 h(n) \le (c_1 + c_2)\max\{g(n), h(n)\}. f 1 ( n ) + f 2 ( n ) ≤ c 1 g ( n ) + c 2 h ( n ) ≤ ( c 1 + c 2 ) max { g ( n ) , h ( n )} . 定数c 1 + c 2 c_1 + c_2 c 1 + c 2 をとればf 1 + f 2 = O ( max { g , h } ) f_1 + f_2 = O(\max\{g, h\}) f 1 + f 2 = O ( max { g , h }) 。
3. 比a n = n k / b n ≥ 0 a_n = n^k / b^n \ge 0 a n = n k / b n ≥ 0 の挙動を調べる。n ≥ 1 n \ge 1 n ≥ 1 で
a n + 1 a n = ( n + 1 ) k b n + 1 ⋅ b n n k = 1 b ( 1 + 1 n ) k . \frac{a_{n+1}}{a_n} = \frac{(n+1)^k}{b^{\,n+1}} \cdot \frac{b^n}{n^k} = \frac{1}{b}\left(1 + \frac{1}{n}\right)^{k}. a n a n + 1 = b n + 1 ( n + 1 ) k ⋅ n k b n = b 1 ( 1 + n 1 ) k . n → ∞ n \to \infty n → ∞ で( 1 + 1 / n ) k → 1 (1 + 1/n)^k \to 1 ( 1 + 1/ n ) k → 1 だから、右辺は1 / b 1/b 1/ b に収束する。1 / b < 1 1/b < 1 1/ b < 1 なので、1 / b < r < 1 1/b < r < 1 1/ b < r < 1 をみたす定数r r r を一つ選ぶと、収束の定義よりあるN N N が存在して、すべてのn ≥ N n \ge N n ≥ N でa n + 1 / a n ≤ r a_{n+1}/a_n \le r a n + 1 / a n ≤ r となる。したがってm ≥ 0 m \ge 0 m ≥ 0 についてa N + m ≤ r m a N a_{N+m} \le r^m a_N a N + m ≤ r m a N が帰納的に従い、0 ≤ r < 1 0 \le r < 1 0 ≤ r < 1 よりa N + m → 0 a_{N+m} \to 0 a N + m → 0 。ゆえに数列( a n ) (a_n) ( a n ) は収束(→ 0 \to 0 → 0 )ゆえ有界で、あるM M M でa n ≤ M a_n \le M a n ≤ M がn ≥ N n \ge N n ≥ N で成り立つ。これはn k ≤ M b n n^k \le M b^n n k ≤ M b n (n ≥ N n \ge N n ≥ N )を意味しn k = O ( b n ) n^k = O(b^n) n k = O ( b n ) 。
逆にb n = O ( n k ) b^n = O(n^k) b n = O ( n k ) と仮定すると、あるc , n 0 c, n_0 c , n 0 でn ≥ n 0 n \ge n_0 n ≥ n 0 のときb n ≤ c n k b^n \le c\,n^k b n ≤ c n k 、すなわちa n = n k / b n ≥ 1 / c > 0 a_n = n^k/b^n \ge 1/c > 0 a n = n k / b n ≥ 1/ c > 0 となり、a n → 0 a_n \to 0 a n → 0 に矛盾する。ゆえにb n ≠ O ( n k ) b^n \ne O(n^k) b n = O ( n k ) 。▨
推移律と和の規則により、たとえば実行回数が3 n 2 + 5 n log 2 n + 100 3n^2 + 5n\log_2 n + 100 3 n 2 + 5 n log 2 n + 100 の手続きはO ( n 2 ) O(n^2) O ( n 2 ) 、さらにΘ ( n 2 ) \Theta(n^2) Θ ( n 2 ) である。低次の項と定数係数は位数に寄与しない。
3 分割統治とマスター定理
分割統治法は問題をサイズn / b n/b n / b のa a a 個の部分問題に分け、それらの解をf ( n ) f(n) f ( n ) の手間で統合する。計算量はしばしば漸化式
T ( n ) = a T ( n / b ) + f ( n ) ( a ≥ 1 , b > 1 ) T(n) = a\,T(n/b) + f(n) \qquad (a \ge 1,\ b > 1) T ( n ) = a T ( n / b ) + f ( n ) ( a ≥ 1 , b > 1 )
の形をとる。次の定理はその解を三つの場合に分けて与える。以下、記述を簡明にするためn n n はb b b の冪n = b k n = b^k n = b k (k ∈ N k \in \mathbb{N} k ∈ N )を動くものとし、基底をT ( 1 ) = Θ ( 1 ) T(1) = \Theta(1) T ( 1 ) = Θ ( 1 ) 、f f f を非負とする。臨界指数 をp = log b a p = \log_b a p = log b a で定める。
定理 3.1 (マスター定理). 上の漸化式について、p = log b a p = \log_b a p = log b a とおくと次が成り立つ。
あるε > 0 \varepsilon > 0 ε > 0 でf ( n ) = O ( n p − ε ) f(n) = O(n^{\,p - \varepsilon}) f ( n ) = O ( n p − ε ) ならばT ( n ) = Θ ( n p ) T(n) = \Theta(n^p) T ( n ) = Θ ( n p ) 。
f ( n ) = Θ ( n p ) f(n) = \Theta(n^p) f ( n ) = Θ ( n p ) ならばT ( n ) = Θ ( n p log n ) T(n) = \Theta(n^p \log n) T ( n ) = Θ ( n p log n ) 。
あるε > 0 \varepsilon > 0 ε > 0 でf ( n ) = Ω ( n p + ε ) f(n) = \Omega(n^{\,p + \varepsilon}) f ( n ) = Ω ( n p + ε ) であり、かつ正則条件 a f ( n / b ) ≤ c f ( n ) a\,f(n/b) \le c\,f(n) a f ( n / b ) ≤ c f ( n ) をみたす定数c < 1 c < 1 c < 1 が十分大きいすべてのn n n で存在するならば、T ( n ) = Θ ( f ( n ) ) T(n) = \Theta(f(n)) T ( n ) = Θ ( f ( n )) 。
証明. n = b k n = b^k n = b k とするとk = log b n k = \log_b n k = log b n 。漸化式をk k k 回展開すると、T ( 1 ) T(1) T ( 1 ) の係数はa k a^k a k 、第j j j 段(j = 0 , 1 , … , k − 1 j = 0, 1, \dots, k-1 j = 0 , 1 , … , k − 1 )で統合コストf ( n / b j ) f(n/b^j) f ( n / b j ) がa j a^j a j 個生じるので
T ( n ) = a k T ( 1 ) + ∑ j = 0 k − 1 a j f ( n b j ) . T(n) = a^k\,T(1) + \sum_{j=0}^{k-1} a^j\, f\!\left(\frac{n}{b^j}\right). T ( n ) = a k T ( 1 ) + j = 0 ∑ k − 1 a j f ( b j n ) . ここでa k = a log b n = n log b a = n p a^k = a^{\log_b n} = n^{\log_b a} = n^p a k = a l o g b n = n l o g b a = n p に注意する。右辺第一項はΘ ( n p ) \Theta(n^p) Θ ( n p ) である。第二項をg ( n ) = ∑ j = 0 k − 1 a j f ( n / b j ) g(n) = \sum_{j=0}^{k-1} a^j f(n/b^j) g ( n ) = ∑ j = 0 k − 1 a j f ( n / b j ) とおき、場合ごとに評価する。f ≥ 0 f \ge 0 f ≥ 0 なのでT ( n ) ≥ a k T ( 1 ) = Ω ( n p ) T(n) \ge a^k T(1) = \Omega(n^p) T ( n ) ≥ a k T ( 1 ) = Ω ( n p ) が常に成り立つことも用いる。
以下の各場合で、そこで用いる漸近評価がすべてのb q ≥ b q 0 b^q\ge b^{q_0} b q ≥ b q 0 で成り立つようにq 0 ≥ 1 q_0\ge 1 q 0 ≥ 1 を固定する。k ≥ q 0 k\ge q_0 k ≥ q 0 とJ = k − q 0 J=k-q_0 J = k − q 0 に対し、g ( n ) g(n) g ( n ) を0 ≤ j ≤ J 0\le j\le J 0 ≤ j ≤ J の段の和g u p ( n ) g_{\mathrm{up}}(n) g up ( n ) とJ < j < k J<j<k J < j < k の段の和g l o w ( n ) g_{\mathrm{low}}(n) g low ( n ) に分ける。後者ではr = k − j r=k-j r = k − j と変数変換すると
g l o w ( n ) = ∑ r = 1 q 0 − 1 a k − r f ( b r ) = n p ∑ r = 1 q 0 − 1 a − r f ( b r ) = O ( n p ) g_{\mathrm{low}}(n)
=\sum_{r=1}^{q_0-1}a^{k-r}f(b^r)
=n^p\sum_{r=1}^{q_0-1}a^{-r}f(b^r)
=O(n^p) g low ( n ) = r = 1 ∑ q 0 − 1 a k − r f ( b r ) = n p r = 1 ∑ q 0 − 1 a − r f ( b r ) = O ( n p ) となる。最後の和はn n n に依らない有限和であり、q 0 = 1 q_0=1 q 0 = 1 の場合は空和とする。これが、漸近評価を直接適用できない再帰木下端の有限段の寄与である。
場合 1. f ( n ) ≤ C n p − ε f(n) \le C\,n^{\,p-\varepsilon} f ( n ) ≤ C n p − ε (n ≥ b q 0 n\ge b^{q_0} n ≥ b q 0 )とすると、b p = a b^{\,p} = a b p = a よりa / b p − ε = b ε a / b^{\,p-\varepsilon} = b^{\varepsilon} a / b p − ε = b ε であって、0 ≤ j ≤ J 0\le j\le J 0 ≤ j ≤ J では
a j f ( n b j ) ≤ C a j ( n b j ) p − ε = C n p − ε ( a b p − ε ) j = C n p − ε ( b ε ) j . a^j f\!\left(\frac{n}{b^j}\right) \le C\, a^j \left(\frac{n}{b^j}\right)^{p-\varepsilon} = C\, n^{\,p-\varepsilon}\left(\frac{a}{b^{\,p-\varepsilon}}\right)^{\!j} = C\, n^{\,p-\varepsilon} (b^{\varepsilon})^{j}. a j f ( b j n ) ≤ C a j ( b j n ) p − ε = C n p − ε ( b p − ε a ) j = C n p − ε ( b ε ) j . b ε > 1 b^\varepsilon > 1 b ε > 1 の等比和で抑えると
g u p ( n ) ≤ C n p − ε ∑ j = 0 k − 1 ( b ε ) j ≤ C b ε − 1 n p − ε b ε k . g_{\mathrm{up}}(n) \le C\, n^{\,p-\varepsilon} \sum_{j=0}^{k-1} (b^{\varepsilon})^{j} \le \frac{C}{b^{\varepsilon} - 1}\, n^{\,p-\varepsilon}\, b^{\varepsilon k}. g up ( n ) ≤ C n p − ε j = 0 ∑ k − 1 ( b ε ) j ≤ b ε − 1 C n p − ε b ε k . b ε k = ( b k ) ε = n ε b^{\varepsilon k} = (b^k)^{\varepsilon} = n^{\varepsilon} b ε k = ( b k ) ε = n ε だからg u p ( n ) = O ( n p ) g_{\mathrm{up}}(n)=O(n^p) g up ( n ) = O ( n p ) である。さらにg l o w ( n ) = O ( n p ) g_{\mathrm{low}}(n)=O(n^p) g low ( n ) = O ( n p ) なのでg ( n ) = O ( n p ) g(n)=O(n^p) g ( n ) = O ( n p ) となり、第一項とあわせT ( n ) = Θ ( n p ) T(n) = \Theta(n^p) T ( n ) = Θ ( n p ) を得る。
場合 2. f ( n ) = Θ ( n p ) f(n) = \Theta(n^p) f ( n ) = Θ ( n p ) のとき、a / b p = 1 a / b^{\,p} = 1 a / b p = 1 より0 ≤ j ≤ J 0\le j\le J 0 ≤ j ≤ J の各段は、一様な定数で
a j f ( n b j ) = Θ ( a j ( n b j ) p ) = Θ ( n p ( a b p ) j ) = Θ ( n p ) a^j f\!\left(\frac{n}{b^j}\right) = \Theta\!\left(a^j \left(\frac{n}{b^j}\right)^{p}\right) = \Theta\!\left(n^p \left(\frac{a}{b^{\,p}}\right)^{\!j}\right) = \Theta(n^p) a j f ( b j n ) = Θ ( a j ( b j n ) p ) = Θ ( n p ( b p a ) j ) = Θ ( n p ) となる。この範囲の段数はJ + 1 = k − q 0 + 1 = Θ ( k ) J+1=k-q_0+1=\Theta(k) J + 1 = k − q 0 + 1 = Θ ( k ) だからg u p ( n ) = Θ ( k n p ) g_{\mathrm{up}}(n)=\Theta(kn^p) g up ( n ) = Θ ( k n p ) である。g l o w ( n ) = O ( n p ) g_{\mathrm{low}}(n)=O(n^p) g low ( n ) = O ( n p ) かつk = Θ ( log n ) k=\Theta(\log n) k = Θ ( log n ) なので、g ( n ) = Θ ( n p log n ) g(n)=\Theta(n^p\log n) g ( n ) = Θ ( n p log n ) となる。第一項Θ ( n p ) \Theta(n^p) Θ ( n p ) はこれに吸収されT ( n ) = Θ ( n p log n ) T(n)=\Theta(n^p\log n) T ( n ) = Θ ( n p log n ) を得る。
場合 3. f ( n ) = Ω ( n p + ε ) f(n)=\Omega(n^{p+\varepsilon}) f ( n ) = Ω ( n p + ε ) の評価と正則条件がともにn ≥ b q 0 n\ge b^{q_0} n ≥ b q 0 で成り立つようにq 0 q_0 q 0 を選ぶ。0 ≤ j ≤ J 0\le j\le J 0 ≤ j ≤ J では、正則条件をj j j 回反復適用してa j f ( n / b j ) ≤ c j f ( n ) a^j f(n/b^j) \le c^j f(n) a j f ( n / b j ) ≤ c j f ( n ) を得る。したがって
g u p ( n ) ≤ f ( n ) ∑ j = 0 ∞ c j = f ( n ) 1 − c = O ( f ( n ) ) . g_{\mathrm{up}}(n) \le f(n) \sum_{j=0}^{\infty} c^j = \frac{f(n)}{1 - c} = O(f(n)). g up ( n ) ≤ f ( n ) j = 0 ∑ ∞ c j = 1 − c f ( n ) = O ( f ( n )) . またg l o w ( n ) = O ( n p ) = O ( f ( n ) ) g_{\mathrm{low}}(n)=O(n^p)=O(f(n)) g low ( n ) = O ( n p ) = O ( f ( n )) であるからg ( n ) = O ( f ( n ) ) g(n)=O(f(n)) g ( n ) = O ( f ( n )) であり、j = 0 j=0 j = 0 の項からg ( n ) ≥ f ( n ) g(n)\ge f(n) g ( n ) ≥ f ( n ) なのでg ( n ) = Θ ( f ( n ) ) g(n)=\Theta(f(n)) g ( n ) = Θ ( f ( n )) となる。さらにn p = O ( f ( n ) ) n^p=O(f(n)) n p = O ( f ( n )) だから第一項も吸収され、T ( n ) = Θ ( f ( n ) ) T(n)=\Theta(f(n)) T ( n ) = Θ ( f ( n )) を得る。▨
一般のn n n (b b b の冪でない場合)に対する床・天井を含む漸化式でも、f f f が緩やかな正則性をもてば同じ結論が成り立つが、その還元は標準的なので本記事では省く。
適用例. 併合による整列はT ( n ) = 2 T ( n / 2 ) + Θ ( n ) T(n) = 2T(n/2) + \Theta(n) T ( n ) = 2 T ( n /2 ) + Θ ( n ) 、a = b = 2 a = b = 2 a = b = 2 、p = log 2 2 = 1 p = \log_2 2 = 1 p = log 2 2 = 1 、f ( n ) = Θ ( n ) = Θ ( n p ) f(n) = \Theta(n) = \Theta(n^p) f ( n ) = Θ ( n ) = Θ ( n p ) ゆえ場合 2 でT ( n ) = Θ ( n log n ) T(n) = \Theta(n \log n) T ( n ) = Θ ( n log n ) 。二分探索はT ( n ) = T ( n / 2 ) + Θ ( 1 ) T(n) = T(n/2) + \Theta(1) T ( n ) = T ( n /2 ) + Θ ( 1 ) 、p = log 2 1 = 0 p = \log_2 1 = 0 p = log 2 1 = 0 、f ( n ) = Θ ( 1 ) = Θ ( n 0 ) f(n) = \Theta(1) = \Theta(n^0) f ( n ) = Θ ( 1 ) = Θ ( n 0 ) ゆえ場合 2 でT ( n ) = Θ ( log n ) T(n) = \Theta(\log n) T ( n ) = Θ ( log n ) 。カラツバ法の乗算はT ( n ) = 3 T ( n / 2 ) + Θ ( n ) T(n) = 3T(n/2) + \Theta(n) T ( n ) = 3 T ( n /2 ) + Θ ( n ) 、p = log 2 3 ≈ 1.585 p = \log_2 3 \approx 1.585 p = log 2 3 ≈ 1.585 、f ( n ) = n = O ( n p − ε ) f(n) = n = O(n^{\,p-\varepsilon}) f ( n ) = n = O ( n p − ε ) ゆえ場合 1 でT ( n ) = Θ ( n log 2 3 ) T(n) = \Theta(n^{\log_2 3}) T ( n ) = Θ ( n l o g 2 3 ) となり、素朴なΘ ( n 2 ) \Theta(n^2) Θ ( n 2 ) より速い。
4 多項式時間と計算の限界
計算量は個々のアルゴリズムだけでなく、問題そのものの難しさを測る尺度にもなる。まず「効率的に解ける」の標準的な線引きを与える。
定義 4.1 (多項式時間と扱いやすさ). アルゴリズムが多項式時間 で動くとは、入力サイズn n n (入力を表すのに要するビット数)に対する最悪時間計算量が、ある定数k k k についてO ( n k ) O(n^k) O ( n k ) であることをいう。多項式時間アルゴリズムをもつ問題を扱いやすい (tractable)とよび、多項式時間で解ける判定問題全体の(非形式的な)クラスをP \mathrm{P} P と書く。
対比として、最悪時間が2 Ω ( n ) 2^{\Omega(n)} 2 Ω ( n ) となるアルゴリズムは指数時間 であり、命題 2.3 の第 3 項が示すとおり任意の多項式より真に速く増大するため、n n n が中程度でも実行不能になりやすい。
計算モデル(Turing 機械)に基づくP \mathrm{P} P の形式的定義は「計算理論」に委ねる。ここでは「多項式か指数か」という粗い二分が、扱いやすさの実務的な境界として機能することを押さえておけばよい。
次に、ある問題については、いかなるアルゴリズムを設計しても超えられない計算量の下限が示せる。代表例が比較に基づく整列である。
命題 4.2 (比較に基づく整列の漸近的な下界). 要素間の比較のみで並べ替えを行うアルゴリズム(比較に基づく整列)は、相異なるn n n 個の要素を整列するのに最悪の場合Ω ( n log n ) \Omega(n \log n) Ω ( n log n ) 回の比較を要する。
証明. §D2.9 定義 4.1 は、比較だけで入力の順序を識別する計算モデルを定めています。そのモデルに対して§D2.9 系 4.6 は、相異なるn n n 個の要素を正しく整列する決定木の高さがlog 2 ( n ! ) = Ω ( n log n ) \log_2(n!)=\Omega(n\log n) log 2 ( n !) = Ω ( n log n ) 以上であることを証明しています。決定木の高さは最悪の場合の比較回数に等しいので、本命題が従います。▨
この下界により、Θ ( n log n ) \Theta(n\log n) Θ ( n log n ) で動く併合による整列は比較の回数の位数において最適である。下界は特定のアルゴリズムではなく比較モデル全体に対する主張である点が重要で、計算量理論の核心をなす。
5 つまずいたら
部分正当性と停止性を混同しない。 定理 1.2 が保証するのは「停止すれば正しい」ことだけである。停止することは命題 1.4 のように、狭義に減少し下に有界な変量を別に構成して示す。両方を示して初めて「正しく、必ず答えを返す」といえる。
不変条件は強すぎても弱すぎてもいけない。 毎回の反復で保てるほど弱く、しかし停止時に¬ B \lnot B ¬ B とあわせて事後条件を導けるほど強い述語を選ぶ。「保てるが結論が出ない」不変条件や「結論は出るが維持できない」述語は、証明のどこかで必ず破綻する。
漸近記法の等号は方向がある。 f ( n ) = O ( g ( n ) ) f(n) = O(g(n)) f ( n ) = O ( g ( n )) は集合への所属であって対称な等式ではない。O ( g ) = f O(g) = f O ( g ) = f とは書かず、O ( n ) + O ( n 2 ) = O ( n 2 ) O(n) + O(n^2) = O(n^2) O ( n ) + O ( n 2 ) = O ( n 2 ) のように「左辺の任意の関数が右辺のいずれかである」と読む(命題 2.3 )。定数倍と低次の項は位数を変えない。
マスター定理の場合分けは境界に注意する。 定理 3.1 の場合 1・3 はf f f とn p n^p n p の間に多項式ぶんの 隔たり(n ± ε n^{\pm\varepsilon} n ± ε )を要求する。f ( n ) = n p log n f(n) = n^p \log n f ( n ) = n p log n のように隔たりが対数ぶんしかないときはどの場合にも当てはまらず、定理を直接は適用できない。また場合 3 では正則条件の確認を省かない。
下界はモデルに紐づく。 命題 4.2 のΩ ( n log n ) \Omega(n \log n) Ω ( n log n ) は比較に基づく 整列に対する主張である。計数による整列や基数による整列のように要素の値の構造を使うアルゴリズムはこのモデル外で、O ( n ) O(n) O ( n ) 時間もありうる。下界を引用するときは、それがどの計算モデルに対する主張かを常に確かめる。