第5話

『グレブナー基底と連立方程式』


「で、どうやって、グレブナー基底で解くの?……というか、そもそもグレブナー基底ってなに?」


妹が矢継ぎ早に質問をしてくる。

最初に「グレブナー基底って知ってる?」と聞いてきたのは妹の方だが、もともとこんなに数学に興味があるやつだったか?

もしかしたら、この小一時間の簡単な講義で、妹は数学を好きになってしまったのかもしれない。


早く、早く、と妹が急かすので、俺は分かりやすい言葉を選ぶ。


「グレブナー基底は、言ってしまえば、iPhoneだ。」

「iPhone?」

「iPhoneってすごく便利だろ?」

「あ、うん。」

「iPhoneに限らず、スマートフォンは、今や生活の中に無くてはならない便利なツールだ。」

「そうだね。スマホなんてみんな毎日使ってるもんね。」

「グレブナー基底もすごく便利な道具なんだ。」


そう言って俺は、妹の目をノートに向けさせる。


「今まで、『どうやって、コンピュータで数学を再現するか』ということを考えてきた。自然数、整数、有理数……と、数の世界を広げて。グレブナー基底は、それよりも少し広い世界、『多項式の世界』で活躍する強力なツールなんだ。」

「多項式の世界?」

「 x - 1 とか、 y - 2 とかいう世界だ。」

「ああ、さっき出てきたやつね。」


グレブナー基底、という言葉を口に出すのは、なんだかドキドキする。

それだけ、グレブナー基底は、魅惑的なワードだ。


「グレブナー基底という概念が初めて登場したのは、1965年ごろ。ブッフベルガーというオーストリアの数学者の、学位論文の中だ。」

「あれ?グレブナーさんじゃないの?」

「グレブナーは、彼の指導教官、つまり先生だったんだよ。ブッフベルガーは、自分の名前ではなく、敬意を表して自分の師匠の名前を付けたんだ。」

「へー、かっこいいいね。」

「スティーブ・ジョブズ。」

「え?」

「……ブッフベルガーは、コンピュータと数学の分野での、スティーブ・ジョブズだと、俺は思う。彼は、人間と数学の世界に革命を起こした。そして、彼の発見したグレブナー基底は、後に Computer Algebra(計算機代数、数式処理)という一つの数学の分野を作ったんだ。」

「す、すごい人だったんだね……」

「しかもそのとき、ブッフベルガーは、わずか23歳。」

「…………お兄ちゃんと同い年じゃん。」


妹が残念そうに留年した俺を見る。

なぜだ。


「俺とブッフベルガーを比べること自体おこがましいよ。それに、俺は数学はできない方だしね。」

「え、そうなの!?」


これは謙遜ではなく、紛れもない事実である。

数学を勉強しようと、大学に入ったが、正直あまり肌に合わなかった(逆に言うと、分からないぶん、わかりやすく教えるのは得意なのだが)。

そこで、出会ったのが、コンピュータと数学を融合した分野、計算機代数学であったのだ。

と、話が少し脱線してしまったので、元に戻す。


「グレブナー基底の応用範囲は広くて、代数学や統計学を始め様々な分野の計算ができる。また、それらは多くの数学のソフトウェアで計算することが可能だ。」

「ほー。」

「そして、今や数学者にコンピュータは欠かせない存在。だから、グレブナー基底は数学者の計算を支えていると言ってもいい。特に、代数幾何学などでは、コンピュータの計算から重要な定理が見つかったりしている。」

「ほえー。なんかスゴすぎて、逆によく分かんないね。」


少し、興奮しすぎてしまった。

いや、グレブナー基底に興奮するのは仕方がないのだが。

他にも、広中平祐の話も混ぜようかと思ったが、冗長になりそうなので、また今度にすることにした。


「それでは今から、グレブナー基底の『スゴさ』を実感していこうか。」

「うん!」


いよいよだね、と妹が元気に返事をする。

これからやるのは、連立方程式を機械的に解くこと。

連立方程式が解けるんだ。そう、グレブナー基底ならね。


俺は足元から、林檎マークの付いたパソコンを拾い上げる。

物を床に置いておく癖があるので、机の下は、数学書やコードなんかで散らかっている。

パソコンをスリープ状態から起動し、アプリケーションにある数式処理ソフトのアイコンにマウスを移動させる。


「これは、Mathematicaっていう数学の計算ができる数式ソフトウェアだ。」

「マセマティカ?」

「理系の大学生には一般的かな?大学のパソコンとかには、基本入っていると思うよ。個人のパソコンにダウンロードするとしたら、少し高いかも。でも、簡単な入力で色々な計算ができたり、きれいなグラフを表示できたりするから、勉強の教材としてもとてもいいと思う。ちなみに、WolframAlpha(https://www.wolframalpha.com/)というサイトでは、無料で Mathematica の計算ができる。」

「ほへー。」

「それじゃあ、実際にグレブナー基底を計算してみよう。」


Mathematicaを起動させる。

赤いドリアンのようなシンボルマークが画面に浮き上がる。

そして、「新しいドキュメント」をクリックする。

(パスを通してターミナルやコマンドプロンプトで起動させてもいいが、こっちの方が妹には分かりやすいだろう。)


「まず、GroebnerBasis と入力する。」


GroebnerBasis


「グロエブネー、バシス?」


バシス。天空の城が1つ滅びそうな響きだ。


「あー、グレブナーベイシス。日本語でグレブナー基底だよ。ほんとは、Gröbner Basis てな感じに、o の上にウムラウトがつくけど、英語だとこの表記になる。」

「ふーん。」

「次に、[ ]の中に多項式を入れる。この場合、計算したい連立方程式を入れてみよう。試しに連立方程式」


x - 1 = 0

y - 2 = 0

z - x - y = 0


「を解こうか。」

「うん。」

「これらの多項式 x -1, y - 2, z - x - y を入れて、」


GroebnerBasis[{x -1, y - 2, z - x - y}]


「とする。」

「この{ }ってなに?」

「ああ、単に、多項式をまとめているだけだよ。」

「なんだー。これで計算できるの?」

「まだだ。グレブナー基底で連立方程式を解きたいときは、『どの変数を消したいか』を決める必要がある。」

「へんすうをけしたいか?」


妹は、聞きなれない言葉に首を傾げる。


「そうだ。『連立方程式を解く』ってことは、『変数を消す』ってことなんだ。」

「よくわかんないな。」

「例えば、前にこの連立方程式」


x - 1 = 0

y - 2 = 0

z - x - y = 0


「を z について解いたときって、 z = 3 が答えとして出ただろう?これって、最後の式、」


z - x - y = 0


「から、x と y を消去したってことなんだ。」

「あ、なるほど!」

「そこで、今は、x と y という変数を消したいから、」


{x, y, z}


「という順番で入力に加える。これは、x と y を消していって、最後に z を残しますよって意味でもある。」

「おお〜」

「まとめると、」


GroebnerBasis[{x -1, y - 2, z - x - y}, {x, y, z}]


「という入力になる。」

「なんか、複雑だね。」

「でも、1個1個は分かるだろう?」

「あ、うん!」

「そして、これを Shift+Enter などで実行すると、」


{-3 + z, -2 + y, -1 + x}


「というのが表示された。」

「なんか、多項式の集まり?」

「そう。実は、これが、連立方程式の多項式から出てくる、『グレブナー基底』なんだ。言うならば、グレブナー基底とは、『性質のいい多項式の集まり』だ。」

「うーん。なんだかよく分からないなあ。」

「上の例を見てみよう。よく見ると、{ }の中に多項式が3つあるのが分かるな?」

「そだね。」

「そのうち、一番左のものは何かな?」

「えーと、-3 + z?」

「そうそう。見やすいように順序を変えると、」


z - 3


「となる。」

「でも、これがなんなの?」

「これが、さっきの連立方程式の z についての解なんだ。」

「えっ!?」


妹が驚いた顔をする。少しヒントを出す。


「z - 3 = 0 は?」

「z - 3 = 0 は…… そうか z = 3 か!」


分かってそうだが、一応確認してみる。


「では、{-3 + z, -2 + y, -1 + x} の他の式についてはどうかな?」

「え、えーと。」


x - 1

y - 2

z - 3


妹がノートに {-3 + z, -2 + y, -1 + x} の多項式を並べ替えたものを書く。


「これに = 0 を付ければ、」


x - 1 = 0

y - 2 = 0

z - 3 = 0


「ってなって、」


x = 1

y = 2

z = 3


「が出てきて、これって、たしかに、」


x - 1 = 0

y - 2 = 0

z - x - y = 0


「の解になってるかも!」

「そう。この場合、グレブナー基底ってのは、『連立方程式の解』になる多項式の集まりなんだ。」

「へー!」


妹は関心ありげに返事する。


「じゃあ、他の例を見てみよう。」


2x + 3y = 5

x + 2y = 4


「を解こう。まず、手計算で解くと、どうなるかな?」

「えーっと、2つ目の式に、2を掛けて、」


2x + 4y = 8


「んと、上の式からこれを引いて、」


(2x - 2x) + (3y - 4y) = 5 - 8


「そして、整理すると、」


-y = -3


「だから……」


y = 3


「えと、これを2つめの式に代入すると、」


x + 2×3 = 4

→ x + 6 = 4

→ x = -2


「つまり、連立方程式の答えは……これだ!」


x = -2

y = 3


「よくできました。」

「えへへ。」

「それじゃあ、これを愛しのグレブナー基底で確認してみよう。連立方程式」


2x + 3y = 5

x + 2y = 4


「つまり、」


2x + 3y - 5 = 0

x + 2y - 4 = 0


「を解くには、さっきと同じように入力して、」


GroebnerBasis[{2x + 3y - 5, x + 2y - 4}, {x, y}]


「こうなる。今回は、z がないから、{x, y}となる。」

「ふむふむ。」

「ここで、Shift+Enter で実行すると、」


{-3 + y, 2 + x}


「おお?」

「これに = 0 を付けてみれば?」

「あーと、-3 + y = 0 と 2 + x = 0 だから……」


x = -2

y = 3


「あ、解けてる!」

「な、すごいだろ?」

「うん!中学のとき、これがあれば、宿題が楽だったのになあ。」


妹は、キツツキのように顔を尖らせて、ぼやく。

グレブナー基底のすごさが分かってきたようで、俺はとても嬉しい。

それじゃあ、もっともっとグレブナー基底さんの魅力に気づいてもらおう。


「では、本題に入ろう。」

「本題?」

「忘れたのか?俺たちは、無理数を計算するために、連立方程式を解くために、グレブナー基底編に突入した。」

「あ、そうだったね。」

「おいおい……。俺たちが抱えていた連立方程式は、」


x^2 - 2 = 0

y^2 - 3 = 0

z - x - y = 0


「だったはずだ。」

「うーえーと…… x = √2と、y = √3だったっけ?」

「それと、z = √2 + √3だな。」

「あ、そっか……んー?あれ?もう解けてる?」

「ルートが使えれば、解けてるね。でも、俺たちが欲しかったのは、z の定義多項式、つまり、√2 + √3を多項式で表現する方法だった。」

「な、なるほど。」

「とにかく、入力をしてみよう。」


GroebnerBasis[{x^2 - 2, y^2 - 3, z - x - y},{x, y, z}]


よろしくおねがいしまああああああああああああああああああす!

と、なんとかウォーズみたいに心の中で叫んでから、Shift+Enterを押した。


{1 - 10 z^2 + z^4, 2 y - 11 z + z^3, 2 x + 9 z - z^3}


ああ。

グレブナー基底がスクリーンの上でキラキラ輝いている。

整数に、変数に、+- の記号が多項式の森を作る。

そう、グレブナー基底は、きらめく森だ。

その森の中には、妖精がいる。

変数の肩には、^ が付いていて、これが羽だ。

美しいことに、一番左の林には、z の妖精さんしか住んでいない。


「出てきたな。」

「なんか、さっきと比べて難しいね。」


妹が、ディスプレイを見ながら言う。

どうやら、グレブナー基底の森で迷子になっているようだ。

妹を、妖精さんの林に誘導する。


「一番左側を見てごらん?」

「左側?えーと、これ?」


z^4 - 10 z^2 + 1 = 0


「そうそう。これが、√2 + √3の定義多項式だ。」

「え、ほんとに?」

「疑い深かったら、実際に代入してみると分かるよ。ここではやらないけど、実際、z = √2 + √3を代入したら、」


(√2 + √3)^4 - 10 (√2 + √3)^2 + 1 = 0


「となる。まあ、これは『読者への演習問題』としよう。」

「読者って……誰?」

「はは。よく数学書では、こういって、書くのが面倒な部分を省略するんだよ。たまに、筆者が解けていないケースもあるけど……」

「そんな人いるの?」

「ま、とりあえずだ。」


話を妖精さんに戻す。


「ここで、大事なのは、一番左には、z の妖精さんしか出てこないってことだ。」

「妖精さん?」

「あ、いやなんでもない……ああ、つまりだ、一番左には、z だけの多項式 z^4 - 10 z^2 + 1 が出てきたってことだ。」

「うん、そうだね。」

「だから、z だけからなる √2 + √3の定義多項式を見つけることができたんだ。つまり、」


z = √2 + √3 ⇆ z^4 - 10 z^2 + 1 = 0


「という右側の多項式を見つけることができた。」

「おお〜!」

「これは、x と y 含む元の式、z - x - y = 0 からは分からないものだった。」

「なるほどー。」

「こんな感じに、複雑な連立方程式でも、グレブナー基底を使えば、解くことができる。」


厳密に言うと、複素数の範囲で解けるのだが、それは今は黙っておくことにした。


「それでは、今までやってきたことを復習しようか。」


俺は、今までの要約をノートに書き出す。


自然数←正確に計算できる

整数 ←正確に計算できる

有理数←正確に計算できる

実数 ←小数表示なら、近似値で計算できる


しかし、近似値は、数学的には「正確」ではない。

実数のうち無理数を2つに分ける。


無理数

|- ピタゴラ数(代数的数)√2、√3など

|- アルキメデ数(超越数)πなど


ピタゴラ数は、多項式で表せる数。

例えば、


x = √2 ⇆ x^2 - 2 =0

y = √3 ⇆ y^2 - 3 =0


など。

多項式で表すことで、正確に数字を「保存」できる。

さらに、グレブナー基底を使えば、

√2 + √3 という新しい無理数も、


z = √2 + √3 ⇆ z^4 - 10 z^2 + 1 = 0


というように多項式で表示できる。


「と、こんな感じかな?」

「なんか、一気に書いたねー。なんだかお腹いっぱい。」


妹が、お腹を触るジェスチャーをする。


「なにか、気になるところはあった?」

「うーん、あ、この『保存』ってなに?」

「これか。√2は、小数だと、正確に表せてないだろ?小数は生のお肉って感じかな?」

「お肉?」

「そう。お肉は、初めはいいけど、時間が経つうちに腐ってきちゃう。計算も同じで、√2を 1.41421356 で計算していくと、どんどん誤差が出る。本当は、√2はそれよりも少し大きいからね。そこで、√2を冷凍庫に入れる。」

「冷凍庫!?」

「そう。それが、多項式での保存だ。言ったように、多項式が正確に計算できるから、腐る心配はない。それにもし、小数の形で欲しいってなったら、解凍して、好きなだけ、1.414213562373095048801688724209 というように計算できるんだ。もちろん、冷凍庫を使う分、電気代、つまりコンピュータがする仕事が多くなるというデメリットもある。」

「なんかわかりやすいね。」

「この正確に計算するってのが、計算機代数の基本的な考え方かな。」

「鮮度を落とさず、お肉を調理するってことだね!」


まあ、厳密には、x^2 - 2 = 0 で保存すると、√2と−√2の区別がつかないので、『x^2 - 2 = 0 と x > 0』で保存しなければならないのだが。

特に、気にならないようなので、そこは割愛をする。


「グレブナー基底で、えーと、定義多項式以外は何ができるの?」

「そうだなあ。この場合だと、他にも、1 / (√2 + √3) の分母の有理化とか、二重根号を√(5+2√6) を外すとか、『式の簡単化』ができるかな。」

「うーん。なんだか難しいかなあ。」


環奈が戸惑っていたので、別の質問に切り替えることにした。


「じゃあ、他に何か聞きたいことある?」

「うーん……ちょっと考えさせて。」


妹は、先ほどのノートのまとめをじっと見つめている。

その横顔は真剣だ。

思えば、小一時間、二人で数学を考えてきたが、とても充実していたような気がする。


「アルキメデ数は、計算できないの?」


妹がいいとこを突いた。

そういえば、「実数は、まだ人類には早すぎる」の伏線を回収していなかったな。


「√2とか√3は多項式で計算できたんでしょ?πはどうなの?」

「多項式ではできないね。コンピュータで正確に計算する方法は、まだないと思うよ。」

「ふーん。それで、『実数は、まだ人類には早すぎる』なんて言ったんだ??」


妹が下から覗くようにしてこちらを見る。

そのセリフをやっぱり、覚えていやがったようだ。

今となると、若干恥ずかしい。

この話は切り上げて、もうまとめるとしよう。


「グレブナー基底は、すごく便利だけど、計算に時間がかかる場合があって、効率の良い計算の仕方も研究されてきた。」

「へー……ねえ、グレブナー基底って大学で習うの?」

「え……ああそうだな。習う人は、習うって感じかな。数学科でも知っている人は少ない概念かもね。」

「お兄ちゃんはいつ習ったの?」

「えーと、俺は、大学三年生くらいかな?」

「ふーん。」

「なんでそんなこと聞くんだ?」

「え、あ、いやなんでもない!」


環奈がわざとらしく目をそらす。

気になったが、まあいいかと、話を進める。


「グレブナー基底ってのは、すごく便利なツールだけど、勉強するには、少し難しい。大学一年生でも、グレブナー基底の定義をちゃんと理解するには、2、3時間はかかるだろう。ましてや、『5分で分かるグレブナー基底』なんて本が売ってたら、俺が欲しいくらいだ。はは。」

「そんなに難しいんだね。」

「だから、環奈が聞いてきたときには、ヒヤってしたんだけど…………今日は、どうだったかな?」


この一時間の感想を妹に求める。

環奈は、俺の目を見た後、うーんと少し考えを巡らせる。

しばらくして、その小さな口は開いた。


「思ったよりは、楽しかったかな。最初は、数字がたくさん出てきて、戸惑ったとこもあったけど……。ひとつ、ひとつ、ていねいに考えていけば、わかるんだなって、実感した気がする。さすがに、グレブナー基底は、まだよくわからないけど笑……。あ、でも、すごいものなんだなってことはわかったよ!……それに……お兄ちゃんが勉強していることが、少し知れてよかったな…………留年してからすごく心配だったし……」


妹は、恥ずかしそうに視線を下に落として、そうつぶやく。


……確かに俺は、留年してから、家にいることが多くなった。

これは自分の責任だし、親には迷惑をかけていることは申し訳ないと思っていた。

しかし、妹の気持ちに気づいていなかった。

いつの間にか、こんなにも心配されていたなんて。


妹との、この一時間は、すごく楽しかった。

久しぶりに笑顔になれた、と言ってもいい。

数学を話すとき、グレブナー基底を語るとき、妹の答えを聞くとき、妹の成長を見たとき、そのどれもに心をワクワクさせた。

妹には、感謝をせねばならない。


「……べ、別に、お兄ちゃんのこと気にしてた、ってわけじゃないんだから…………で、でも……数学のこと……話すお兄ちゃんは…………ちょっとかっこよかったかも……」


そう言って環奈はごにょごにょと口ごもる。

気づけば、もう夕方で、部屋は薄暗くなっている。

環奈の顔がかろうじて見えるくらいだ。

カラスの鳴き声が遠くから聞こえる。

ゆっくりと、二人だけの時間が流れる。

そのときだ。


「あ、あのね!お兄ちゃん!」


妹が、そう言って勢いで椅子から立ち上がる。

その顔は興奮からか、やや紅潮している。

何か言おうとする。


「実は、グレブナー基底のこと、聞いたわけはね!」


そう言って、座っている俺の前に一歩出る。

その瞬間だった。

妹が突然ぐらつく。

しまった。

床に散乱している数学書を踏んだようだ。

この暗さのせいもあって、足元がよく見えなかったらしい。

とっさに俺は、妹を支えようと前に飛び込む。

――間に合え。




むにゅ。




手に、感じたことのない感触がする。

この物体は、なんだ。なんなんだ。

俺は、倒れそうな妹を、その肩を、とっさに抱いた。

後ろから包む込むように。

左手で、左肩を。

右手で、右か……


俺は、自分の右手を見る。

妹の。

妹の、まだ、発達段階の膨らみに俺の右手が当たっている。

いや当たっているより、むしろ揉んでいる。


まずいまずいまずいまずいまずいまずいまずいまずい。

この状況はまずい。

ラブコメじゃあるまいし、俺の人生にこんなラッキースケベはいらない。

落ち着け。ここは冷静になって考えるべきだ。

ここで俺が顔を赤らめ、す、すまん!なんて言ったら、それこそ問題だ。

妹を性的な目で見ていることになってしまう。

それは断じてならん。

ここは、兄らしく、冷静に、ウィットに富んだ言葉で場を和ませよう。

冷静に妹の目を見て、こうつぶやく。


「はは。よく、胸の柔らかさは、二の腕の柔らかさと同じっていうけど、本当なんだなあ。」


――完璧だ。

グッジョブ俺。よくやった。

さて、妹を立ち上がらせようと、様子を伺うも、期待に反して妹の顔はどんどん赤くなり、しまいには沸騰するやかんのようになった。


「おにいちゃんのばかっ!!!!!」




ここで回想は終わるのである。

その後の妹からの、罵詈雑言はひどいもので、サイテー!!だの、だいっきらい!!だの、妹を愛する兄としては、聞くに堪えないものばかりだった。

まったく、事故であることは自明じゃないか。

なぜそこまで怒る必要がある。

いやはや、年頃の妹というものは難しい。

数学なんて二度と教えてやるもんか。



だいっきらい!と叫ぶ、この大嫌いな妹より、

グレブナー基底の方が、俺は大好きだ――。

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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