こんにちは、京大生ブロガーのゲーテ(@goethe_kyodai)です。
プログラマーなのに「プログラミングに数学は必要ない」なんて思っちゃったりしてませんか?
プログラミングの背景には、コンピュータ・サイエンスという学問があります。そのコンピュータ・サイエンスの理解には数学が必須です。
「数学が必要ない」と本気で思ってる人は、コンピュータ・サイエンスが分かってなくてもできるレベルの仕事を任されているだけです。仕事のレベルが限定されるので一流プログラマーにはなれません。
プログラミングをやっていると、数学が大切だと思うことがたくさんあります。
プログラミングと数学の関係を踏まえて、プログラミングに数学が必要な理由 を説明します。プログラマーは必見です。
目次
アルゴリズムの理解に数学が必要
プログラミングで絶対つかうのがアルゴリズムです。
よく使うソートアルゴリズムの理解は必須です。ライブラリーがあるから詳しい中身は理解しなくてもいい、という人もいますが、ライブラリーの中身のアルゴリズムを理解していなければ応用ができません。
応用というのは、現実の問題に合わせてアルゴリズムを少し変えて適用することです。それができないプログラマーは、ライブラリーをそのまま使うだけで済む仕事しか任されず、プログラマーとして上には登れません。
そんなアルゴリズムの理解に数学が絶対必要です。具体的には、アルゴリズムの計算量の解析、アルゴリズムのメモリ消費量の解析、計算困難問題かどうかの判定などです。これらはlogや指数関数が分かってないと理解不可能です。
計算量がわからない人は説明はコチラの記事が分かりやすいです。
qiita.com
アルゴリズムで解けない問題というのがあって、問題がアルゴリズムで解けないことの証明にも数学が使われています。
あと、何らかの仮定がなければ、全てのソートアルゴリズムの計算量がO(nlogn)より速くならないことを知ってますか?あれは二分木を使えば証明できるのですが、これはグラフ理論という数学の一分野のおかげです。
こんな風にアルゴリズムを応用できるレベルまで理解するには数学が必須なのです。
数学のおかげでアルゴリズムの計算量が激的に減る
そのアルゴリズムの計算量は、数学を知っているか知っていないかで激的に変わることがあります。
具体例を出しましょう。
1からNまでの自然数の和を求めるプログラムを書くとしましょう。
普通にやったらこんな風にfor文のループで計算するでしょう。この場合の計算量はO(N)です。
int sum = 0; for( int i = 1; i <= N; i++){ sum = sum + i; }
しかし、自然数の和の公式()というものを知ってる人だったら、こんな風にもっと簡単に書きます。
int sum = N*(N+1)/2;
式一発で求められちゃいますし、計算量もO(1)なので一瞬で求められます。
似た例ですが、nの階乗、n!を求めるプログラムを書くとしましょう。これもfor文で書けて、O(n)の計算量になります。
でもスターリングの公式 (もっといい精度の形がありますが、簡潔さを優先しました)を使えば、近似ですが、O(n)ではなくO(1)の計算量で求められます。
例から分かるように、数学を知っている・知らないでプログラムの計算量は激的に変わってきます。
アルゴリズムを考えるのに数学の証明のアイデアが役立つことがある
実務で、自分でアルゴリズムを考えなければいけない場面があると思います。そんな時に数学の証明のアイデアがヒントになって良いアルゴリズムを思いつくことがあります。
自分も課題や競プロで一からアルゴリズムを考えなければいけない時がありますが、数学の証明のアイデアがヒントになったことはたくさんありました。
機械学習や人工知能の学習に必要
最近機械学習や人工知能のエンジニアがかなり需要があるようです。生き残るためにそれらの勉強としているプログラマーもいるでしょう。
そんな機械学習や人工知能の理解に数学は必須です。機械学習や人工知能では、データを学習させます。そしてそのデータは行列の形で表して色々いじるんです。
だから、理解には行列を扱う線形代数という分野が必要です。
この記事を見て何を思ったでしょうか?
logや行列は高校で習うから数学じゃないなんて思ってませんか?あれも文系の方からしたら立派な数学です。自分のレベルの数学だけが数学ではないのです。(かといって四則演算が数学と言われれば怪しいですが・・・)