第23話 錦蛇と大蛇

 慈道の数学的な能力は多摩中央大学の数学科全体でみると上の下である。慈道は努力の人間であり、天才肌を持ち合わせてはいなかった。慈道は準備を念入りにするタイプでできる限りの想定とその対策はしておくが、不測の事態には滅法弱いのである。慈道と同級生の代では、田中と松本という二人の男がツートップとして君臨している。独創性のある数学的資質は勿論のこと、予測不可能な事態においても日本刀のような切れ味を発揮する。また、コンピューターやプログラミングの操作に関しても、慈道とは比べものにならないほどの素養がある。

 柴山が酔い潰れた日の翌日、夕方五時のことである。柴山は理工棟の七階エレベーターホール前にいた。そこには、ホワイトボードとテーブル、簡素な椅子が設置されており、たまに大学院生がくつろいで談話している風景を目にする。また、テーブルに対してホワイトボードの反対側には、数学科の学生向けの掲示物が貼られている。

 柴山はその場に独り、席に座って井上昭一の残したメッセージのプリントアウトと睨めっこしながら、田中のセミナーが終わるのを待っているのであった。田中が所属している研究室はすぐそこにあり、ドアが開けばすぐに気づける間合いである。

 しばらくしていると、ガチャンという音とともに話し声がこぼれてきた。柴山はすぐに反応して立ち上がる。

「それじゃあ、失礼します。また来週」

 リュックを背負った田中はそう言って研究室を後にし、エレベーターの方に近づいてくる。柴山はすかさず田中の方に詰め寄った。

「田中さん」

「君は、柴山さん」

 田中はぽっちゃりとした体型で髪をワックスで整えており、高そうな臙脂えんじ色の眼鏡が特徴的である。ちなみに、柴田と田中は過去に一、二度面識はあった。

「こんにちは。あの、今お時間とれますか?」

「え? あ、うーん、そうだな。少しだったら構わないけど」

 田中は柴山と目線を合わせず早口で答える。少し緊張しているようだった。田中は数学一筋で、異性と会話をしたことがあまりないのだ。慈道も柴山と出逢うまでは似たようなものだったが、現在ではかなりの経験値が積まれている。唯一、慈道が田中に優っている点といえよう。

「あの、プログラミングについての質問なんですよ」

「プログラミング。そうか。慈道君はてんでダメだもんな」

「ご存知でしたか」

「彼の修士論文は君が打ったっていう話は有名だからね。後輩に打たせるなんて前代未聞だよ」

「本当ですよね。いい加減にしてほしいですよねー」

 柴山が愛想良く笑顔を振舞っていると、田中の緊張は徐々に解れてくる。

「で、具体的にどういう案件かな?」

「あの、結論だけを言うと、文字列を文字コードに変換してそれを10進数に直すっていう変換と、その逆の変換がしたいんです。そういったサービスをしてくれるホームページはあるにはあるんですが、入力するのが億劫だなあと思いまして、できれば私のパソコンで手軽にできないかなーって思っているんですよ」

「なるほど。しかし、君も珍しいことをしたがるね」

「そうですか?」

「まあまあ。その程度だったら僕でもなんとかなりそうだ」

「ありがとうございます。私、プログラミングには疎くて、C言語をほんの少しだけ、一年生のときの基礎情報って講義でやった程度の知識しかないんですけど、初心者向きの言語を教えてくれないかなーというお願いなんです。できれば、その環境を私のパソコンに入れてくださると凄く嬉しいんですよねー」

君、MacBook Air使っていたよね?」

「はい」

「僕は普段、Surfaceを使っているけど、実はMacもたまに使うんだよ」

「あ! よかった」

 柴山は両手を合わせた。

「今一番の人気はPythonっていう言語だ」

「それ、聞いたことあります!」

Jupyterジュピター Notebookっていうのを使うとSafari上で簡単にプログラミングができるから、これがお勧めだね」

「インストールは簡単ですか?」

「簡単だとも。今持っている?」

「はい!」

 柴山は手提げから13インチのノートパソコンを取り出すと、「あそこでどうですか?」と言って、エレベーターホール前のテーブル席へ目線をやった。

「そうだね」

 柴山と田中は並んで座り、柴山はノートパソコンを立ち上げる。

「Wi-Fiは繋がっている?」

「はい。大学のを利用しています」

「そういえば、この前、不審なWi-Fiスポットが大学内で出回っていたらしいから注意して」

「あ、知ってます、それ」

「さすが柴山さん。意識が高い。それじゃあ、Anacondaでググってみて」

「はい。Anaconda……蛇だ! Pythonの親戚ですか?」

「なんて言えばいいか……ディストリビューションっていうんだけど……手軽に最新のPythonの機能を使えるパックっていうかなあ。これには、Pythonの最新版は勿論のこと、数学的な処理をする上で役にたつモジュールとかも一緒に同梱されるんだ」

「モジュール? 加群ですか?」

「お、いい突っ込みだね。数学でモジュールといったら加群だけど、プログラミング用語としては言語の追加機能って感じかなあ。まあ僕も数学が専門だから、割とそっちの用語はいい加減に使ってるけどね」

「このサイトですか?」

「そう。そこのボタン押してみて」

 しばし田中の指導のもと、柴山のノートパソコンには、ウェブブラウザ上でプログラミング言語Pythonで書かれたプログラムをインタラクティブ実行することができるJupyter Notebookがインストールされた。

「よしターミナルを開いて、全部小文字で jupyter notebook と打ってごらん。ちなみにジュピターのスペルはこうだ」

 田中は立ち上がって、ホワイトボードに「jupyter」と書いた。

「木星の意味じゃないんですね。あ、ファインダーみたいなのがSafari上に表示されました」

「右上のNewっていうボタンがあるだろう。そこで、Python 3を選択すると、ノートブックが開かれるはず」

「はい。横長の入力フォームが表示されてます」

「例えば 1 + 1 と入力して shiftを押しながらenterを押してみて」

「あ、 2 って表示されました」

柴山のノートパソコンには次のような画面が表示された。


   In [1]: 1 + 1

   Out[1]: 2


「電卓よりはるかに使いやすい計算ができるよ。掛け算は *、べき乗は ** だ。例えば、 2 × 3^5 を計算してごらん」

「こうですか?」


   In [2]: 2*3**5

   Out[2]: 486


「合ってるよ。 ** は * より結合が強いから、 2 × 3 の 5 乗の計算をする場合は括弧を用いて (2*3)**6 とする必要がある」

「なるほど」

「次は割り算。基本は / だ。 6 ÷ 3 を計算してごらん」

「はい」


   In [3]: 6/3

   Out[3]: 2.0


「あ、小数点付きで表示されました」

「そう。整数としての商を扱いのであれば、 // を使う。


   In [4]: 6//3

   Out[4]: 2


「うまくいきました」

「余りの計算は


   In [5]: 5

   Out[5]: 2


「余りを表す演算子は便利ですねー。数学ではいちいち日本語でかくか、 mod で表さないと、ですよね」

「確かに余りを表す記号が未だに浸透していないのは違和感しかないよね。初等教育でも積極的に使うべきだと思うけど」

「そうですよね。大学受験のときに a を b で割ったときの余りを r とする、みたいな書き方を何回もしてうんざりしましたもの」

「僕もそう思うよ」

 田中も大分、コミュニケーションが取れるようになってきたようだ。

「さて、商と余りを同時に欲しいときもあるよね。この場合は、\verb divmod|という2変数関数が便利だよ」

「えっと、この入力で合ってますか?」

「うん」


   In [6]: divmod(5, 3)

   Out[6]: (1, 2)


「ちなみに q, r = divmod(5, 3) とすれば、変数 q、 r に商と余りを代入できるよ」

 田中は適宜ホワイトボードを使って補足説明をする。


   In [7]: q, r = divmod(5, 3)


「あ、結果は表示されないんですね」

「うん。だけど、 q, r と打てば値が表示される」


   In [8]: q, r

   Out[8]: (1, 2)


「おおー」

「今度は文字列の操作をしてみよう。文字列はシングルクォート ' か、ダブルクォート ” で囲む。適当な文字列を作ってみよう」


   In [9]: 'Euler'

   Out[9]: 'Euler'


「いいね。じゃあ、今度はそれを変数 name に代入してみよう」

「はい」


   In [10]: name = 'Euler'


「この`Euler'という文字列を文字コードに変換するには、 encode というメソッドを使うんだけど……」

「メソッド?」

「オブジェクト指向って聞いたことがないかな。Pythonで扱う整数や文字列などはみなオブジェクトっていうくくりになっていて、オブジェクト一つ一つが潜在的に持っている関数のことをメソッドっていうんだ」

「む、難しいですね」

「まあ試しに、 name. と打ったあとにtabを押してごらん」

「あ、色々な項目が出てきました」

「それらがメソッドだ。この`Euler'という文字列にそれだけの機能が用意されているということなんだ。例えば、 name.lower() と打ってみて」

「括弧が必要なんですね」

「これはあくまで関数だからね」


   In [11]: name.lower()

   Out[11]: 'euler'


「小文字になりました」

「lower はアルファベットを小文字に直すメソッドなんだ」

「あ、 upper で大文字になりました」


   In [12]: name.upper()

   Out[12]: 'EULER'


「さすが要領がいいねえ。このように文字列オブジェクトには、文字列のためだけに用意された関数が同梱されている。こういうのをメソッドというんだ」

「なるほど」

「それじゃあ、いよいよ文字コードにいってみようか。しかし、文字コードといっても色々あるけど……」

「確かですねえ、平仮名の 'あ' が“e38182”のものなんですが……といっても、これだけじゃ分かりませんよね」

「あ、いや……3バイトだからそれはきっとUTF-8だね。最も普及している文字コードだ」

「す、凄い……」

 慈道が持ち得ない知識を次々と披露していく田中に、柴山は素直に感心していた。

「name に encode というメソッドがあるはずだから、それを実行してみて」

 田中は照れ臭そうに口元を緩ませながら言う。

「コード化っていう意味ですね」


   In [13]: name.encode()

   Out[13]: b'EULER'


「別に普通な感じがしますが」

「しまった。ASCII文字だとそのまんま表示されるんだな。文字列 `あ` を encode してみて」

「name に代入しなくてもできますか?」

「うん。直接できるよ」


   In [14]: 'あ'.encode()

   Out[14]: b'\xe3\x81\x82'


「なんか暗号めいたものが」

「\x は16進法であることを表している。確か、これをさらに hex メソッドにかけると16進法表記の文字列がでてくるはずだ」


   In [15]: 'あ'.encode().hex()

   Out[15]: 'e38182'


「あ! これですこれです! 間違いありません」

 柴山はにっこりとすると、田中も不気味な笑いをする。

「よかった」

「この16進法の表記を10進法に簡単に直せないんですか?」

「勿論できるよ。例えば、 int('abc', 16) とすれば16進法で abc と表記される数を普通の整数に直してくれる。この 16 が、16進法をセットしますよ、という合図になってる」

「ということは……」


   In [16]: int('あ'.encode().hex(), 16)

   Out[16]: 14909826


「こういうことか……」

「さすが、柴山さん。飲み込みが早いね」

「いえ、それほどでもー」

「ここで関数の話をしよう。文字列を 10 進数に直すのに毎回このタイプをするのは大変だから、自前で関数を作ると便利だ。多分、C言語を習ったときにもやったよね?」

「はい」

「Pythonはシンプルさが売りだ。例えば、これで a と b の平均値を表す関数になる」

 田中はホワイトボードに


   def average(a, b):

     return (a + b)/2


と書いた。

「def が関数を定義しますよという意味で、その直後に関数名を書く。 average(a, b) の a, b は関数のインプット。僕たちは独立変数なんて言い方をするが、プログラミング用語では引数ひきすうというよね」

「あ、覚えてますよ。 return 以下は、戻り値っていうんですよね」

「そうそう。それじゃあ、文字列を文字コードにして、 10 進数に直す関数、そうだな…… str2int(s) を書いてみよう」

「はい」

 柴山はいとも容易く以下のコードを書いてみせた。


   In [17]: def str2int(s):

         return int(s.encode().hex(), 16)


「これでいいんですよね?」

「そうだね。適当にその関数を実行してみよう」

「はい」


   In [18]: str2int('柴山明美')

   Out[18]: 71374625727303670019601710734


「お! できました」

「おめでとう」

 こんな調子で、柴山は田中からPythonのいろはを修得した。また、整数を文字コードに変換してその文字列を返す


   def int2str(n):

     return n.to_bytes((n.bit_length() + 7) // 8, 'big').decode()


という関数も得た。 str2str、 int2str によって、自在に文字列と整数の相互変換が可能になったのである。

「こんな所でいいかな?」

「十分です! ありがとうございました」

「基本は大体教えたから、細かいことに関してはGoogleに聞けば大抵のことは解決できるよ。あと、数学的な処理をしたいのであれば、SymPyという便利な数学ライブラリを利用するといい」

 田中は「SymPy」とホワイトボードにさらさらと記入した。柴山はすぐにメモを取る。

「方程式を解いたり、積分計算をしてくれたり、マニアックな所では三角形の九点円の中心なんかも出してくれたりする」

「へえ、凄いですね。調べてみます」

「Anacondaに同梱されているから特に設定なしで使えるから」

「分かりました」

「それじゃあ」

 田中は荷物をまとめて立ち去ろうとする。すると柴山は慌てて立ち上がり、「本当にありがとうございました」と言って白い歯を輝かせた。

「分からないことがあったらいつでも聞いてよ」

「はい。その時は是非」

 田中は満足そうな笑顔を見せたと思ったらすぐに背を向けて、すたすたと歩いてすぐそこのエレベーターのボタンを押す。一分ほど待って、ようやくエレベーターに乗り込み、回れ右をすると律儀に立ち尽くしたままの柴山と目が合った。柴山はニコッとして会釈をする。

 田中は急いで帰って『柴山日記』の更新を行った。

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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