第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 派でな。」


そう言って群城は、足元のカバンから、キーボードの中央に赤いボタンが付いたパソコンを取り出す。

カバン持っていたのか。


Asirアジール は日本で開発された数式処理ソフトだが、グレブナー基底の計算や他の代数的な計算ができる。それに、なんたって無料タダだ。この際、お前も 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とか、もしかしたらあったかもしれないが、いや、なかったことを願う。


「ほら。じゃあ、交換するぞ。」

「えーと、どれを押せばいいんだ……これか?」

「違うぞ、ここじゃくて、そっち。」

「どっちだよ。」

「だから、それ……」


「それは、ブーリアングレブナー基底だね。」


突然だった。

背後からの謎の声に、俺たちの会話は遮られる。


そして、俺は殺された。

  • Xで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る