Pythonで可視化しながら数学を学び直す～その１：四則演算

# はじめに
私はどちらかと聞かれれば数学が苦手でした。数学には生まれつきのセンスも重要だと言われますが、私にそれがあるとは思えません。さらに高校生の頃、高等数学の入り口ともいえる微分・積分の授業に**出ていなかった** ので、そこの部分がすっぽり抜け落ちてしまっていました。

ですが大学院でコンピュータサイエンスを専攻したこともあり、離散数学の学び直しは出来たと思います。そして微分・積分についてもここ数年、学び直しをしています。ですが、本などを読んで少しずつ勉強していますが思うように理解は進みません。

ところで以前、Pythonで数学の学び直しをする話を聞いていたので得意のプログラミングと合わせて勉強してみようと思い立ちました。ちなみにPythonは、仕事でもめったに使わないのであまり詳しはありません。しかしPythonが特にAI関連でよくつかわれるので使えるようになりたいと常々考えていました。

今は生成AIを活用することで、Python学習と数学の学び直しを同時により効率的に出来るようになりました。具体的には数学の概念の整理とグラフ化についてのPythonのコードはChatGPTにやらせています。

私はビジュアル人間なので、絵や図にするとスムーズに理解できるという特徴を知っているので「Pythonで様々な数学の概念や仕組みを可視化して理解してみよう」と思ったのがきっかけです。

# 記事の構成について

本Qiitaの記事とは別に GithubにJupyterノートブックを利用しています。メインのコンテンツのGithub側にあります。このQiita記事は「補足とまとめ」といった位置づけになります。

今回の四則演算の可視化については以下のノートブックをご覧ください。

https://github.com/yoshiwatanabe/python-test/blob/main/math/addition_subtraction.ipynb

https://github.com/yoshiwatanabe/python-test/blob/main/math/multiplication_division.ipynb

### Pythonの実行環境に関して

Pythonを実行するにあたってはGithubのCodespaceを利用しています。CodespaceはローカルでPython環境を立ち上げるよりずっと簡単です。

### Pythonのライブラリについて

Pythonで数値計算をするのにnumpyが有名ですが、数学を勉強するとなると数式をシンボリックに、抽象的に操作する必要があります。例えば複雑な関数を簡略化するなどは実際に演算を行うのではなく抽象的な状態のまま操作する必要があります。それに最適なライブラリとしてsympyが使いやすいと知りました。サンプルコードは出来るだけsympyを使って数式をシンボリックに扱い、グラフのデータを得るためにnumpyを使う、というパターンになっています。

では本題に。

# 四則演算を可視化する

学び直しのメインは微分・積分でしたが、もう少し視野を広げて、数学の他の分野（代数、三角関数、行列、統計など）もグラフ等の視覚化を軸足にして学び直してみようと考えました。ということでまずは基礎の基礎である「足し算・引き算、掛け算・割り算」をグラフとして理解するところから始めることにしました。

## 足し算・引き算を可視化する

まずは足し算の話をします。「足し算とは何か？」と考えている時にふと、「足し算は一次関数の定数項と考えることができるのでは？」と思いつきました。つまり一次関数は　$f(x) = kx + b$ の $+b$ の部分、つまり「定数項」と解釈するのです。別の言い方をすると「何か + b」のように「何かの値にｂを足す」と考えるわけです。

ここでChatGPT(o1)を利用して自分の理解が正しいかを検証してみました。すると実際には「足し算」は以下のふたつの形式を取るとのこと。

$f(x,y)=x+y$　// ２変数の一次関数
$f(x)=kx+b$ // １変数の一次関数（アファイン関数）

ということは私が考えていた「足し算」は「高校でならう$f(x)=kx+b$という形（変数をひとつとり、定数を足す）のことで、特にこの形を「アファイン関数（アファイン写像）」と呼ぶことを知りました。（ちなみにアファイン関数は**線形関数をシフトする役割**を表すそうです）。

では実際にグラフとして「足し算」の効果を「一次関数（アファイン関数）」として、定数項の値をいくつか指定して可視化してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/6394dd29-28be-bc24-1b7c-cc659847fcd0.png)

$kx$の項の係数は$1$に揃えているので傾きはどれも同じです。確認できるように、定数項０の場合、直線はそのままで、３や５の時は上にシフトしています。つまり全ての$x$に一定の値を足しているので、例えば「$10+5$」は$y=1x+5$で$x=10$の時の演算をしているに過ぎないと考えることが出来ます。

ここでの気づきは「算数」とは「数学の、あるひとつの演算」のこと、という認識が得られます。別の言い方をすると「算数」は「数学の具体的な演算の仕方」を学ぶこと、だと言えそうです。

## 引き算は？

引き算に関してはもうお分かりのように「シフトする方向が下（結果の値が減る）」という点が異なるだけで、やはり$f(x)=kx+b$で$b$が$-3$のように負の値であるケースに過ぎない、ということが分かります。

# 掛け算・割り算を可視化する

掛け算も同様に実際にはおおきくふたつの関数として表すことができますが、足し算と同様に「ひとつの変数と定数の掛け算」として解釈して、グラフ化してみます。

$f(a,b)=ab$ // 変数同士の掛け算
$f(x)=kx+b$ // 一次関数（多項式の１次項）

つまり「（何かの値）ｘ ５」という掛け算があったとしたら、それは$k$が５の時の$kx$の項の演算、「$x$ ｘ ５」と考えるわけです（$x$と$k$の順番を逆に書いているので分かりにくいですが・・・）

ということで一次関数として掛け算を可視化してます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/d7714582-799b-1975-32ee-22acab20267a.png)

青い直線は傾きが$０$、つまり「何かに$０$を掛けた状態」を表していて、$ｘ$の値が何であっても$０$になっています。これは私たちの普段の「$０$を掛けたらなんでも$０$になる」と合致しています。

オレンジ色の直線は「$１$を掛けた場合」です。これも「どんな数字に$１$を掛けてもその数字になる」という認識と合致しています。$x$が$１$の時は$ｙ$も$１$、$ｘ$が$２$の時も$ｙ$は$２$、になっています。このオレンジ色の直線は、アスペクトレシオを$1:1$にすることで45度になるようにしています。そのことを考えながら緑色の直線を見てください。

緑色の直線は$k$が$3$の時、つまり「何かに３を掛ける」を表しています。どんな$x$の値も３倍になっているわけです。つまり「（何か）ｘ３」という掛け算は「傾きが急な直線なのです」。何をもって「急」と言えるかとういと、オレンジ色の45度の直線に対してです。

このグラフを手掛かりに３の代りにいろんな数字を掛けてみてください。グラフがどのように動くか想像できると思います。同時に負の値もかけてみてくださいこの場合は直線が右下がりになります。

### 割り算は？

引き算が、負の値の足し算であったように、割り算も「掛け算」として表すことが出来るのは有名です。割り算は「逆数の掛け算」です。

2で割るとは0.5を掛けることに他なりません。例えば「$x$を$2$で割る」は

$
\frac{x}{2} = x \times \frac{1}{2} = x \times 0.5.
$

となります。

特に「割る数」が１より大きい（厳密には「割る数の絶対値が１より大きい）」場合は、0.5のようにー1から１の間に収まります。この場合は足し算で登場した$1*x$の45度の直線を基準にしたとき「縮小する」という直感的な表現ができます。グラフで見ると「より寝ている状態」と表現することも出来るでしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/8069b717-23bf-4bce-c932-8406c47c23b5.png)

上のグラフでは緑色とオレンジ色の直線が「割り算」を表しています（厳密には「割る数の絶対値が１より大きい場合の割り算」のグラフの特徴）

直線の傾きが「掛け算の場合はこうで、割り算の場合はこう」といった整理の仕方はできません。なぜなら「0.5で割る」ことはつまり、「割り算は逆数の掛け算」に従うと、「2で掛ける」と同じになるので直線の傾きは急になります。

$
x \div 0.5=
x \times \frac{1}{0.5}=
x \times 2.
$

要するに「掛け算」も「割り算」も「掛け算の枠組みで一元化」できるということで、すなわち可視化した場合「一次関数の直線の傾きに作用する」と言ってもよいということです。

# 足し算・引き算と掛け算・割り算を合わせて可視化する

ここまでで

足し算・引き算はグラフの直線全体を上下にシフトする
掛け算・割り算はグラフの直線の傾きを決定する

ということが分かったので、それらを合わせて一次関数のグラフとして可視化すると以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/81a6593d-2d42-5b7d-154b-4865f9d5fc0a.png)

つまり「掛け算（割り算）」は「一次関数の１次項」であり、「足し算（引き算）」は「一次関数の定数項」である、考えることも出来るということなのです。

こう考えると「算数」は「数学」と（当然ながら）独立しているものではなく、「数学」の基礎的な演算の具体例という視点に過ぎなかったということが分かります。

こう考えることで「算数 → 数学」という連続性も直観的に理解できます。

# 学び直しのアプローチ

数学と、今回は特に算数の基礎にまで立ち返って、数学の一次関数（多項式関数）という枠ぐみで四則演算を解釈しなおしました。結果としてはより納得のいく説明と表現に辿りつくことが出来ました。

学び直しにはいろんなアプローチがあると思います。昔の教科書を引っ張り出して読み返す、新たな学習ツールやアプリを使ってより現代的な学習をする。それに加えて、生成AIや簡単にセットアップできるプログラミング環境などを活用する方法などがあります。重要なのは「自分にとっての効果的な学び方」を模索していくことです。ハマれば学習効率がグンとアップして、どんどんと楽しく学び直しが出来ます。特に生成AIモデルを安く（無料で）使える今は、それを取り入れない理由はありませんね！

### お断り
なお、始めに書いた通り、数学については素人なので、ところどころでエラーが含まれているかもしれません。アプローチの参考としていただければ幸いですが、数学としての正確さについてはまだ学び直しの途中なので、確認が必要な部分もあるかと思いますので悪しからず。