第5話
『グレブナー基底で嘘を見抜く』
嘘発見器とは、名の通り、嘘を発見する機械だ。
スパイ映画とかで、腕に変なコードを付けて、脈の動きとかで、嘘をついているかどうか見抜く。
そんなものが現実にあれば、ぜひとも欲しいが。
「さて、お前が解いたように、嘘つき問題は多項式の言葉に変換された。」
A. 「Bは嘘をついている」 ⇄ x - y + 1 = 0
B. 「Cは嘘をついてない」 ⇄ y - z = 0
C. 「AとBのどちらかは嘘をついてない」 ⇄ z - xy = 0
群城が、俺の書いた紙を取り上げ、淡々と語りだす。
「この多項式の等式の列を見れば、いくら鈍感なお前でも、これが何か分かるだろう。」
「ああ……連立方程式だ。」
「つまり?」
「グレブナー基底が使える……ってわけか。」
俺の回答に、群城が微かに微笑む。
「ああ、ただし、注意すべきは、 0と1の世界のグレブナー基底ということだ。」
俺たちが、普段の生活で数の計算をするとき、それをどこでやってるかは、あまり意識しない。
スーパーでお釣りの計算をしているときに、「俺は今、有理数の中で計算しているぞ!」なんて考えてる奴は、いたとしても変態だ。
「知っての通り、グレブナー基底は、どんな体で計算するかによって、その姿を変える。」
今、群城の言った「
決して、からだで計算する、とかいやらしい意味ではない。
0と1だけの世界でも、有理数や実数と同じように、足し算、引き算、掛け算、割り算ができる。
「今回のグレブナー基底計算は、0と1で構成される体、F_2で行う。」
0と1からなる「体」は、よくF_2と呼ばれる。
つまり、今から、多項式の係数としては、0と1だけを使えるものとして、グレブナー基底を計算していくわけだ。
計算するには、えーと、
「えーと、Mathematica では、デフォルトでは、有理数体での計算だったよな。それに、オプションを付け加えればいいのか……」
「圭介よ。残念ながら、アタシは、Asir 派でな。」
そう言って群城は、足元のカバンから、キーボードの中央に赤いボタンが付いたパソコンを取り出す。
カバン持っていたのか。
「
「はは、また、今度にしておくよ。」
「そうか?」
「そ、それより、早く計算しようぜ。」
「ま、そうだな。」
なんとか話題を逸らした。
それにしても、どうやらここから先は、群城先生が丁寧に教えてくれるようだ。
「計算する多項式は、」
x - y + 1
y - z
z - xy
「だ。これらのグレブナー基底を Asir で計算するには、例えば、」
nd_gr
「を使えばいい。」
「ほう。」
「nd_gr の中に、さっきの多項式を入れると、」
nd_gr([x-y+1,y-z,z-x*y])
「という感じになる。」
「でも、これだけだとダメだろ?」
「焦るな、童貞。次に、使う変数の順番を入れる。」
nd_gr([x-y+1,y-z,z-x*y],[x,y,z])
「そして、次が重要だ。今回は、0と1の体 F_2 で計算するから、標数2を入力する。」
nd_gr([x-y+1,y-z,z-x*y],[x,y,z],2)
ここで、標数とは、1を足すと0になる回数のことだ。
体 F_2 では、1+1=0で、1を2回足したら、0になるから、標数が2だ。
「最後に、単項式順序を指定する。Asirでは、よく使われる単項式順序は、番号で指定できて、今回は、2 : 辞書式順序 を指定する。つまり、右端に2を入れて、」
nd_gr([x-y+1,y-z,z-x*y],[x,y,z],2,2)
「とする。これで、完成だ。それじゃあ、計算してみるぞ。」
[0] nd_gr([x-y+1,y-z,z-x*y],[x,y,z],2,2);
[z^2,y+z,x+z+1]
群城が、タンタカタンとキーボードを叩いて、Asir で実行した。
「よし、答えが出たな。分かるか、圭介?」
「ああ。嘘つき問題の連立方程式を解いた式が、」
z^2,y+z,x+z+1
「つまり、」
z^2 = 0
y+z = 0
x+z+1 = 0
「が解を求めるのに、最適な形ってことだろ?」
「その通り。実際、」
x = 1
y = 0
z = 0
「が方程式の答えとして簡単に出てくる。」
「そして、0が真実、1が嘘に対応していたから、これは」
A=嘘つき
B=正直
C=正直
「を意味するってことか。」
「お前が、最初に出した答えと一緒だろ?」
「……確かに。」
「これで、グレブナー基底で、嘘つき問題を解くことができた。」
Mathematica で計算してみても、
GroebnerBasis[{x - y + 1, y - z, z - x*y}, {x, y, z}, Modulus -> 2]
の入力で、{z^2, y + z, 1 + x + z} が同じように出てきた。
(ちなみに、Modulus -> 2 が標数2を意味している。)
「ふーむ。なかなか面白いな。これ、群城お前が考えたのか?」
「ふ、まあな。元のアイデアは、アメリカで受けた授業で『論理演算を連立方程式に帰着させる』話ってのから、着想を得たんだがな。」
「面白そうな授業だな。」
「実際には、計算効率とかも考えなければいけないが、頭の体操としては、面白い問題だったろ?」
「ああ。楽しかったよ。」
「それでだ。」
群城が急に足を組み替える。
なんだろう。また、何か怒られるのか。
「今度、飯でも行かないか?」
「え?」
「ほら、日本に帰ったばかりで、日本食が恋しくてな。オススメの店とか知ってたら、教えてくれよ。」
意外だった。群城が、俺を飯に誘うなんて珍しい。
まあ、幼馴染みの中だし、断る義理もない。
「ああ。そうだな。じゃあ今度の日曜とかでいいか?」
「お、いいぞ。」
「じゃあ、連絡するよ。」
「……というか、お前、ケイタイ変えただろ。」
「え、あ、そういえば。」
「ったく。変えたら連絡くらいしろよ……」
去年変えた時に、うっかり、留学している群城に、変更を伝えるのを忘れていた。
それから、群城とは連絡を取っていなかったのか。
……そういえば、なんで群城は俺が留年したことを知ってたんだ?
「この際だ、メールじゃなくて、LINEでいいんじゃないか?」
「LINEか。」
「持ってないのか?」
「え、いや。一応入れてるけど、あんまり使ったことなくて。」
友達の少ない俺は、LINEには家族と数人の知り合いしか入っていない。
クラスLINEとか、もしかしたらあったかもしれないが、いや、なかったことを願う。
「ほら。じゃあ、交換するぞ。」
「えーと、どれを押せばいいんだ……これか?」
「違うぞ、ここじゃくて、そっち。」
「どっちだよ。」
「だから、それ……」
「それは、ブーリアングレブナー基底だね。」
突然だった。
背後からの謎の声に、俺たちの会話は遮られる。
そして、俺は殺された。
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます