補題:ブール関数について
初期seedから日時を求める無謀な挑戦 - Plus Le Toolのための補題。
使う記号の定義は[id:plusletool:20130427:p2]参照。
【追記】
計算ミスを直したら、重要になるはずだったリード・マラー標準形がいらない子になった。
その結果、積和標準形とリード・マラー標準形との関係に記事の大部分を割いていたこの記事はほぼ無価値になったため、この記事は書き途中ですがお蔵入りになりました。
ブール関数をコンピュータで扱う際にめんどうになるのが、等価な最小積和形が複数存在しうるということだ。
例えば、次のブール関数(*1)は(*2)のように2通りの最小積和形で表される。
(*1)
x\yz 00 01 11 10 0 1 1 1 1 1 1
(*2)最小積和形
コンピュータで扱うなら等価な式は一意に表せる方が都合がいいので、最小積和形はコンピュータで扱うのに向かない。
ではどうするか。
ブール関数を一意に表す方法はいくつかあるが、そのうちの2つを挙げる。例として3変数の場合を見てみる。
1つ目の方法は、次のようにカルノー図の各マスに8個のbool型係数 を割り当て、それをそのまま式にする方法である。
(*3)
x\yz 00 01 11 10 0 1
これが(3変数の)任意のブール関数を一意に表しているのは明らかだろう。
なお、係数の添字の順番は後に重要になるので、この順でなければならない。
の項と の項の順序が逆なのではと思うかもしれないが、これで正しい。
(*4)のように添字を二進表記にすれば分かりやすいだろうか。 か のどちらがその項に含まれるかを、添字の最上位bitに対応させているのだ( も同様)。
(*4)
x\yz 00 01 11 10 0 1
この形の式を「積和標準形」という。
2つ目の方法は、次のように論理積(AND)と排他的論理和(XOR)のみを使った最簡易形で表す方法である。
(*5)
これも係数の添字の順番が後に重要になる。
こちらは添字を二進表記にすると、その項に が含まれるか否かを、添字の最上位bitに対応させている( も同様)。
(簡単にいえば、 の係数が ということ。)
(*6)
この形の式を「リード・マラー標準形」という。
リード・マラー標準形も積和標準形と同じく、任意のブール関数を一意に表すことができる。
以下、積和標準形を式変形することでそれを確認してみる。
(積和標準形は任意のブール関数を一意に表せるので、リード・マラー標準形が積和標準形と一対一対応していれば、リード・マラー標準形も任意のブール関数を一意に表せることになる。)
その前に、公式を3つほど導いておく。
リード・マラー標準形ではAND(論理積),XOR(排他的論理和)のみを使用し、OR(論理和),NOT(論理否定)は使用しない。
そのため一般のブール関数をリード・マラー標準形に変形するには、OR,NOTをAND,XORだけで表す必要がある。
具体的には次の2式を使う。
(*A)論理和のリード・マラー標準形
(*B)論理否定のリード・マラー標準形
また、積和標準形ではAND,OR,NOTのみを使用し、XORは使用しない。
そのため一般のブール関数を積和標準形に変形するには、XORをAND,OR,NOTだけで表す必要がある。
具体的には次の式を使う。
(*C)排他的論理和の積和標準形
【簡易証明】
(*A)
0 | 0 | 0 | 0 | 0 | |
0 | 1 | 0 | 1 | 1 | |
1 | 0 | 0 | 1 | 1 | |
1 | 1 | 1 | 1 | 1 |
(*B)
0 | 1 | 1 | |
1 | 0 | 0 |
(*C)
0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | |
0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | |
1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | |
1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
では実際に、積和標準形(*3)を変形してみる。
計算過程はめんどうなだけで難しくないので省略するが、式(*A)(*B)を使って変形していくと最終的に(*7)のようになる。
(*3)再掲
(*7)
よって を次のように定義することで、リード・マラー標準形(*5)を得る。
(*8)
逆に、リード・マラー標準系(*5)も同様に変形してみる。
こちらもめんどうなだけで難しくないので計算過程を省略するが、式(*C)を使って変形すると最終的に(*9)のようになる。
(*5)再掲
(*9)
よって を次のように定義することで、積和標準形(*3)を得る。
(*10)
なお、(*10)は(*8)を について解いた式と同じである(当然だが)。
以上より、(3変数の)積和標準形にはそれと一対一に対応するリード・マラー標準形が存在するので、リード・マラー標準形は任意の(3変数の)ブール関数を一意に表すことができるといえる。
例として3変数で計算したが、このことは3変数に限らず任意個の変数の場合にも成り立つ(証明はできないので省略する)。
さて、ブール関数を一意に表す2通りの方法を見てみたが、これらには論理演算に対してそれぞれ得意・不得意がある。
積和標準形はAND(論理積)とOR(論理和)が得意だが、XOR(排他的論理和)とNOT(論理否定)が苦手。AND(論理積),OR(論理和),XOR(排他的論理和),NOT(論理否定)はどれも得意。
一方、リード・マラー標準形はXORとNOTが得意だが、ANDとORは苦手。
どういうことか見てみよう。
2つのbool型変数 があり、積和標準形とリード・マラー標準形で次のように表されるとする。
がある。
(*11)
この について、AND,OR,XOR,NOTを積和標準形とリード・マラー標準形のそれぞれで表すと以下のようになる(計算過程は省略)。
(*12)論理積(AND)
(積和標準形)
(リード・マラー標準形)
><
(*13)論理和(OR)
(積和標準形)
(リード・マラー標準形)
(*14)排他的論理和(XOR)
(積和標準形)
(リード・マラー標準形)
(*15)論理否定(NOT)
(積和標準形)
(リード・マラー標準形)
式(*12)〜(*15)を見れば明らかなように、リード・マラー標準形のAND,ORはめんどくさく、それ以外は簡単に計算できるが分かる。
リード・マラー標準形で書かれた式のANDやORを計算する必要がある場合は、積和標準形に書きなおしてから計算するほうが簡単。
そこで、積和標準形とリード・マラー標準形の式の変換についてもう少し詳しく見てみようと思う。
積和標準形(*3)からリード・マラー標準形(*5)への変形は(*8)を使い、逆にリード・マラー標準形(*5)から積和標準形(*3)への変形は(*10)を使うのだった。
(*3)再掲
(*5)再掲
(*8)再掲
(*10)再掲
ところで、式(*8)の変数の順番を少し並べ替えて行列で表すと、次のようになる。
(*16)
(※算術和の(mod 2)は排他的論理和に等しい。)
式(*10)も同様に行列で表すと、次のようになる。
(*17)
(*16)(*17)を見比べると、係数行列が同一のものであることが分かる。
これはいったいなんなのか? そこから調べてよう。
以下、この係数行列を と書くことにする。また、2つの列ベクトル を次のように定義する。
(*18)
まず、(*10)の下に書いたように、(*8)を について解くと(*10)に一致する。
なので式(*16)を について解けば式(*17)に一致するはず。
そのためには(*17)の係数行列 が(*16)の係数行列 の逆行列 でなければならない。
実際に計算してみると は確かに単位行列になり、上記のことが成り立っていると分かる。
次に、
TODO:書き途中。たまたま閃いたこの式をどう導いたものか。 TODO:nCrはどこから出てきた? TODO:3変数の場合に限らず一般の場合にまで拡張できるが、それの証明は?(*19)
ここで、次のように の定義域を整数全体に拡張する。
(*20)
これを使うと、係数行列 は次のように書き表せる。
(*21)
よって、式(*16)(*17)はそれぞれ次のように書き直せる。
(*22)
(*23)
この例では3変数の場合を見てきたが、式(*22)(*23)の関係は任意個の変数の場合にも成り立つ[要出典]。
よって、これらを用いて積和標準形とリード・マラー標準形を変換すればいい。
(行列の積と(*12)〜(*15)とどっちが簡単かなんて知らない。というかnやrが大きくなった時の組み合わせ計算のアルゴリズムってあまり速くなかった気がするけどそんなこと知らない。)
(日記はここで途切れている……どうやら途中保存のようだ。)
(反応がない。ただのお蔵入りのようだ。)
TODO:シャノン展開について書く
ところでオクラ入りのカレーっておいしいよね。