計算理論・ラムダ計算の問題
とし、 を空列 を含む 上の有限列全体、 を列 の長さとする。 を長さ 以下の列全体(空列を含む)とする。列の集合 が接頭語なしであるとは、 の相異なる 2 つの元の一方が他方の接頭語(先頭部分)になることがないことをいう。
部分計算可能関数 で、その定義域が接頭語なしであるものを考える。このような と に対して と定める(そのような がなければ とする)。
定義域が接頭語なしである部分計算可能関数 で、すべての に対して となるものすべてにわたる の最小値を求めよ。
この問題で使うもの
- 記述複雑性とカウンティング論法(説明と入口の問題)
この問題を解けるようになるまで(11 技能)
読み込み中…
右端(太枠)がこの問題で使う技能です。左へドラッグすると、さらに前の前提をさかのぼれます。技能を押すと、そこまでの道筋が光ります。
ヒント
行き詰まったら、上から順に 1 つずつ開いてください。
ヒント 1
各 の最短プログラム を集めると、 個の相異なる列からなる接頭語なし集合になります。問題は、そのような集合の長さの総和の最小化に帰着します。
ヒント 2
接頭語なし集合の長さ はクラフトの不等式 を満たします。 の凸性を使って、 を の 1 次式で下から押さえましょう。
ヒント 3
と を通る直線 を使うと、すべての整数 で です。これをクラフトの不等式に代入して総和を下から評価し、等号が成り立つ長さの配分を探します。
答えと解説
答えを見る
どこでつまずきましたか?(選ぶと、戻る場所を案内します)
解説を読む
の元の個数は である。
接頭語なし符号への言い換え. を条件を満たす関数とし、各 について , となる を 1 つ選ぶ。 は関数なので なら であり、 は定義域の部分集合だから接頭語なしである。よって は「 個の相異なる列からなる接頭語なし集合の長さの総和」である。逆に、 個の列からなる接頭語なし集合 があれば、(それ以外は未定義)とおくと、これは有限個の値の表なので計算可能で、定義域は接頭語なしであり、 となる。したがって求める最小値は、 個の列からなる接頭語なし集合の長さの総和の最小値に等しい。
クラフトの不等式. 接頭語なし集合 の長さを とする。 とすると、 を接頭語にもつ長さ の列は 個あり、接頭語なしなのでこれらの集合は互いに交わらない。長さ の列は 個なので 、すなわち
下界. 関数 は凸であり、 での値 を結ぶ直線は である。凸関数はこの 2 点を結ぶ弦の外側( または )で弦より上にあるので、すべての整数 について が成り立つ(等号は のときのみ)。よって となり、
達成. 等号が成り立つのは、すべての が か で、 のときである。長さ のものを 個とすると より 。実際、(長さ )と、 で始まらない長さ の列 個を合わせた 個の列は接頭語なし集合であり、長さの総和は である。これを の 個の元に 1 対 1 に割り当てた で となる。
以上より、最小値は である。
別解
の元は 個。各 に対し を達成する最短の入力 をとる。 は関数なので なら 、さらに定義域は接頭語なしなので は 511 個の相異なる語からなる接頭語なし集合(符号)である。したがって Kraft の不等式 が成り立つ。
逆に、Kraft の不等式を満たす長さの列があれば、それらの長さをもつ接頭語なし集合が構成でき、 の元に割り当てる有限表で を定めれば、 は計算可能で定義域は接頭語なしである。よって、問題は「511 個の語の接頭語なし符号の総語長の最小化」と一致する。
最適な符号は完全 2 分木の葉に対応し、等重みなので葉の深さは 2 種類(連続する値)になる。深さ 8 の葉が 個、深さ 9 の葉が 個とすると、、Kraft 等号 (すなわち )より 。総語長は 。
最小性の確認: 深さ 8 以下のみでは葉は高々 個しか作れないので、少なくとも一部は深さ 9 以上が必要。一般に総語長を最小化する符号は、Kraft の和が 1 の完全木で、かつ葉の深さの差が 1 以下(差が 2 以上なら、深い葉を浅い葉の位置で分岐させ直すことで総和が減る)となる。上の はこれを満たす。
検算: 。したがって最小値は 。