計算理論・ラムダ計算の問題
変数のブール関数とは写像 のこととする。入力 をもつブール回路を次のように定める。
- 回路は有向非巡回グラフで、 つの入力ノード と、いくつかのゲートからなる。
- 各ゲートは 入力で、 個ある 変数ブール関数 のどれを割り当ててもよい(定数関数や片方の入力だけによる関数も含む)。ゲートの つの入力は、入力ノードまたはそれより前のゲートであり、同じノードを つの入力に使ってもよい。
- ノードのうち つ(入力ノードでもゲートでもよい)を出力として指定し、その値を回路が計算する関数とする。
- 回路の大きさとは、ゲートの個数のことである。
大きさ 以下の回路で計算できる 変数のブール関数の個数を求めよ。
この問題で使うもの
- 小さな回路で計算できる関数(説明と入口の問題)
この問題を解けるようになるまで(31 技能)
読み込み中…
右端(太枠)がこの問題で使う技能です。左へドラッグすると、さらに前の前提をさかのぼれます。技能を押すと、そこまでの道筋が光ります。
一覧で見る(前提が先)
- 樹形図で数え上げる
- 積の法則と和の法則
- 和の法則・積の法則と樹形図
- 順列・円順列・重複順列
- 組合せ
- 確率の定義と和事象・余事象
- 包除原理
- 同じものを含む順列・重複組合せ
- 一般の包除原理
- 約数の見つけ方
- 最大公約数と最小公倍数
- 素因数分解と約数の個数
- 最大公約数と最小公倍数
- 分数のたし算・ひき算
- 小数の四則計算
- 正負の数の加法・減法
- 分数のかけ算・わり算
- 四則の混じった計算の順序
- 正負の数の乗除・累乗と四則混合
- 分配法則を使った計算のくふう
- 文字式の計算(同類項・分配法則)
- 乗法公式による展開
- 因数分解
- 文字式で表した整数の性質
- 余りによる整数の分類
- 合同式
- 群の位数と元の位数
- 置換の巡回置換分解と位数
- バーンサイドの補題
- 条件つきブール関数の数え上げ
- 小さな回路で計算できる関数
ヒント
行き詰まったら、上から順に 1 つずつ開いてください。
ヒント 1
技能「小さな回路で計算できる関数」を使う。大きさ と の回路で計算できる関数を、本質的に依存する変数の個数( 個)で分けて数えよう。
ヒント 2
個の 変数関数のうち、定数が 個、 変数だけに依存するものが 個、本質的に 変数に依存するものが 個ある。
ヒント 3
定数は 個、 変数に依存するものは で 個。 変数に依存するものは、変数の組の選び方と 個の関数の積で数える。
答えと解説
答えを見る
どこでつまずきましたか?(選ぶと、戻る場所を案内します)
解説を読む
大きさ と大きさ の回路で計算できる関数を、本質的に依存する変数の個数で分類して数え、重複を除く。
大きさ . ゲートがないので出力は入力ノードであり、計算できるのは の 個。
大きさ . ゲート が つで、その入力は入力ノードから選ぶ。出力がゲートなら関数は の形である(出力が入力ノードなら大きさ の場合と同じ)。
変数関数 個を分類すると、
- 定数 の 個
- 変数だけに依存するもの の 個
- 本質的に 変数に依存するもの 個
となる。これを使って、大きさ 以下で計算できる関数を重複なく分類する。
- 定数関数: の 個( を定数にすればよい)。
- 変数に依存する関数: と ()。 は大きさ 、 は に をつなげば得られる。合わせて 個。
- ちょうど 変数に依存する関数: 変数の組 ()の選び方が 通り、それぞれについて本質的に 変数に依存する が 個。異なる組に依存する関数は異なり、同じ組でも異なる は異なる関数を与える( と の違いは、 個の中で入れ替わるだけ)ので、 個。
- 変数以上に依存する関数は、ゲート つ(入力 つ)では計算できない。
また、同じノードを つの入力に使う は のどれかであり、新しい関数は出ない。
よって求める個数は
別解
大きさ 0 の回路は出力が入力ノードそのものなので、計算できる関数は の 4 個。大きさ 1 の回路は、1 個のゲート に入力ノード (同じでもよい)をつないだもので、出力はそのゲートとしてよい(出力を入力ノードにしても大きさ 0 の場合と同じ)。計算される関数を、実際に依存する変数の個数で分類して数える。
- 依存する変数が 0 個(定数): の 2 個(ゲートに定数関数を割り当てれば得られる)。
- 依存する変数がちょうど 1 個: 変数 を選び、 または 。 個( は大きさ 0 の回路でも得られ、上の 4 個を含む)。
- 依存する変数がちょうど 2 個: 変数の組 通り。2 変数ブール関数 16 個のうち、定数 2 個と、一方の変数だけに依存するもの 4 個()を除いた 個が両方に依存する。 個。
- 依存する変数が 3 個以上の関数は、ゲートの入力が高々 2 つのノードなので得られない。
以上は互いに異なる関数なので、合計は 個。検算: 大きさ 0 で得られる 4 個は上の 8 個に含まれるので重複して数えていない。