第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分で分かるグレブナー基底』なんて本が売ってたら、俺が欲しいくらいだ。はは。」
「そんなに難しいんだね。」
「だから、環奈が聞いてきたときには、ヒヤってしたんだけど…………今日は、どうだったかな?」
この一時間の感想を妹に求める。
環奈は、俺の目を見た後、うーんと少し考えを巡らせる。
しばらくして、その小さな口は開いた。
「思ったよりは、楽しかったかな。最初は、数字がたくさん出てきて、戸惑ったとこもあったけど……。ひとつ、ひとつ、ていねいに考えていけば、わかるんだなって、実感した気がする。さすがに、グレブナー基底は、まだよくわからないけど笑……。あ、でも、すごいものなんだなってことはわかったよ!……それに……お兄ちゃんが勉強していることが、少し知れてよかったな…………留年してからすごく心配だったし……」
妹は、恥ずかしそうに視線を下に落として、そうつぶやく。
……確かに俺は、留年してから、家にいることが多くなった。
これは自分の責任だし、親には迷惑をかけていることは申し訳ないと思っていた。
しかし、妹の気持ちに気づいていなかった。
いつの間にか、こんなにも心配されていたなんて。
妹との、この一時間は、すごく楽しかった。
久しぶりに笑顔になれた、と言ってもいい。
数学を話すとき、グレブナー基底を語るとき、妹の答えを聞くとき、妹の成長を見たとき、そのどれもに心をワクワクさせた。
妹には、感謝をせねばならない。
「……べ、別に、お兄ちゃんのこと気にしてた、ってわけじゃないんだから…………で、でも……数学のこと……話すお兄ちゃんは…………ちょっとかっこよかったかも……」
そう言って環奈はごにょごにょと口ごもる。
気づけば、もう夕方で、部屋は薄暗くなっている。
環奈の顔がかろうじて見えるくらいだ。
カラスの鳴き声が遠くから聞こえる。
ゆっくりと、二人だけの時間が流れる。
そのときだ。
「あ、あのね!お兄ちゃん!」
妹が、そう言って勢いで椅子から立ち上がる。
その顔は興奮からか、やや紅潮している。
何か言おうとする。
「実は、グレブナー基底のこと、聞いたわけはね!」
そう言って、座っている俺の前に一歩出る。
その瞬間だった。
妹が突然ぐらつく。
しまった。
床に散乱している数学書を踏んだようだ。
この暗さのせいもあって、足元がよく見えなかったらしい。
とっさに俺は、妹を支えようと前に飛び込む。
――間に合え。
むにゅ。
手に、感じたことのない感触がする。
この物体は、なんだ。なんなんだ。
俺は、倒れそうな妹を、その肩を、とっさに抱いた。
後ろから包む込むように。
左手で、左肩を。
右手で、右か……
俺は、自分の右手を見る。
妹の。
妹の、まだ、発達段階の膨らみに俺の右手が当たっている。
いや当たっているより、むしろ揉んでいる。
まずいまずいまずいまずいまずいまずいまずいまずい。
この状況はまずい。
ラブコメじゃあるまいし、俺の人生にこんなラッキースケベはいらない。
落ち着け。ここは冷静になって考えるべきだ。
ここで俺が顔を赤らめ、す、すまん!なんて言ったら、それこそ問題だ。
妹を性的な目で見ていることになってしまう。
それは断じてならん。
ここは、兄らしく、冷静に、ウィットに富んだ言葉で場を和ませよう。
冷静に妹の目を見て、こうつぶやく。
「はは。よく、胸の柔らかさは、二の腕の柔らかさと同じっていうけど、本当なんだなあ。」
――完璧だ。
グッジョブ俺。よくやった。
さて、妹を立ち上がらせようと、様子を伺うも、期待に反して妹の顔はどんどん赤くなり、しまいには沸騰するやかんのようになった。
「おにいちゃんのばかっ!!!!!」
ここで回想は終わるのである。
その後の妹からの、罵詈雑言はひどいもので、サイテー!!だの、だいっきらい!!だの、妹を愛する兄としては、聞くに堪えないものばかりだった。
まったく、事故であることは自明じゃないか。
なぜそこまで怒る必要がある。
いやはや、年頃の妹というものは難しい。
数学なんて二度と教えてやるもんか。
だいっきらい!と叫ぶ、この大嫌いな妹より、
グレブナー基底の方が、俺は大好きだ――。
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます