数学の学生にとって、実装は重要か

更新日時:

答えの出ない、人によって意見が異なる内容について日記に書くのは不毛な気もするが、 最近あったことを書き止めておきたいので、この記事を書く。

「数学なんて計算機と関係ないだろ?」と思う人は、 この記事を読む時間のほうが勿体無いので、ご自分の信じる道をお進みください。

背景

数学科の学生も、計算機で計算をする必要に迫られる事がある。 代表的な内容は、微分方程式を差分方程式にして数値解析、 リー群や表現論の行列計算である。 これらには強力なライブラリがある。

数学科の基礎教育でも、近年はそのようなライブラリをもっと使いましょうという方針に舵を切っているようである。 私の頃は、計算数理演習(理学部数学科専門科目)では C 言語で実装し数値解析をするよう指導されたが、最近では実装はなく Scilab を使っていると聞いた。 かくいう私も Java で実装し数値解析をした。しかしある課題ではどうしても Mathematica を使いたくて、 Java から Mathematica にパイプするプログラムを書いたこともある。 そんな私が、数学用のソフトウェアを利用することには何ら問題提起をするつもりはない。

しかし、実装はいらなくなったのだろうか? 実装をしないことが当たり前なのだろうか? 数学の学生が実装をするメリットは未だ有るだろうか?

最近、私がネットワークフローの最大流問題のプログラムを C++ で自前で実装して ある数値結果を得たときには、数学の方から「どういうライブラリを使っているのですか」と聞かれた。「自分で書いた」と答えたら感心された。 もちろんこの発言には何の悪気もなかったことは想像がつくし、私は怒っていない。 しかし、偽りのない気持ちとして、「最大流くらい自分で実装するもの。他人のプログラムを理解して使うほうが時間がかかる」と私は思う。 私は、プログラミングコンテストの場では、実装が相当遅い方に入るのは確実である。 その私でもこう思うから、ある程度の人は私と同じ意見ではないかと推測する。

数学が専門の方のポテンシャル

この前あったことを、ちょっと内容をぼかして書く。 ぼかして書くのは、研究の詳細は言わないほうがいいからである。

出来事

ある問題を考えていた。ある関数の最大値を計算する問題であった。 その問題は手計算ではとても無理であり、 exponential order で計算機に解かせることができるまではわかっていた。 しかし、なんとなく多項式時間で解けそうな気もしていた。 私たちがあと一歩わからず困っていると、教授がきて、これは 多項式時間で解けるのではないかと言ってきた。そして 黒板で問題を解いた。紛れもなく数学の言葉であったが、 その内容は計算機の上に実装できる内容であった。 大きな意味でアルゴリズムを述べたといえる。 これには、心底驚き、恐れ入り、感動した。

恐れ多くも、計算機科学を専門となさっている方ではない。 学生時代から微分幾何学のご専門でいらっしゃるそうだ。 つまり、この先生に計算機科学の知識があるがゆえに解法にたどり着いたわけではない。

世の中には、大学教授は偉くない、頭良くない、殆どは要らない、 と豪語する方もいらっしゃるようだが、数理科学研究科の教員は、頭がとてもよい方も多い。 数学を極めし者たちの集まりである。数学を極めていれば計算機科学のある種の問題は 自然と解けてしまってもおかしくないと、わかっている人ならわかるはずである。 その一例を、私はつい最近、目の当たりにしたのである。

実装の重要性

しかし、重要なことを指摘しておきたい。 この先生は、計算機が好きな先生でいらっしゃる。 ソフトウェアをばりばり作っているとか、 プログラミングコンテストで戦っているとかいうことではない。 しかし、最近はソリトンの内容もお考えで、 検証のため Python でプログラムを書くのを勉強中とお聞きした。 学生時代でも Fortran で数値計算をしたとお聞きした。 私の言葉で言い直すならば、おおよそ、計算数学(理学部数学科専門科目)の 受講生に提供している内容であろうと思った。

普段または過去に、計算機でプログラミング言語で実装をしている経験があることは、 多分重要なファクターだと思う。というのも、数学の教員の中には 全く計算機が好きでなく、舐めてバカにしている方もいる。 数学の学生は数学の勉強をする時間が重要だから計算機で遊んでいる暇などないという理屈である。 そういう方に、この先生と同じ芸当を期待することはできないであろう。

もう少し言うと、 数学と計算機科学は、いわば同じ大陸で陸続きであると、少なくとも私はそう理解しているが、 解釈・納得の仕方は異なる部分もある。 実装をするなどして、その違いを理解することが、 上記のような「芸当」には重要であろうと思われる。 例えば有限を区別するということである。数学科では $10^{5}$ と $10^{20}$ は多くの分野では同じようなものであろう。 しかし現在標準で使われている計算機において、 $10^{5}$ 件のソートは一瞬、 $10^{20}$ 件のソートは終わらない(メモリにも乗らない)。 つまり計算機科学では異なるものである。 また、数学では、最大値や最小値の取り扱いは、存在そのものも重要であると考える。 計算機科学では、少々嘘や例外があったとしても、最大値をだいたい出せることにも価値がある。

まとめ

もちろん私たち院生や、多くの数学科の学生に、この先生並の数学的知識やセンスはないだろう。 しかし、先生がお持ちの計算機の知識としては、計算数学で提供している内容とほぼ遜色ない。 つまり、数学の学生は、数学の勉強や研究を続けていくと、計算機科学の問題を解く力も自然と(?)備わっていくといえよう。数学と計算機科学の関係に思いを馳せれば、納得されるところである。 ただし、そのためには、計算機での実装も重要な側面であるように思う。 全く計算機に親しみがないのにいきなり結果が出せるような軽い世界でもない。

ライブラリを使う力を身に着け、数学の研究に役立てようという道はなんら否定されるべきではない。 しかし、たとえ簡単でも、実装をすることにより、仕組みを理解するのが重要だと思う。 数学科の学生はものの仕組みを自分で構成するところに強みが有るように思う。 ある教員は「みなさんが趣味で数学をやるなら、こんな(特異単体)ホモロジー群の構成や (マイヤー・ビエトリスや対のホモロジー群の)完全列の証明など理解する必要はない。 でも数学科、しかも東大にいるような人は、同じ道具を別の使い方をする必要がある。 そのためにはものの仕組みを知る必要がある。 だからこんな何回も授業時間かけて証明をするんだ」 とおっしゃって、プリズム分解や蛇の補題等を地道に講義なさった。 きっと同じようなことが、分野を問わず、数学科に普遍の強みであろうと思う。

コメントする