ちょっと息抜きに「Project Euler」で数学パズルプログラミングはいかが?

仕事や勉強の合間に、なんとなくスマホをいじってしまう。
そんな時間、せっかくなら少しだけ頭を使う息抜きに充ててみませんか?

今回は、プログラミングと数学が好きな人にとってはたまらない、
ちょっとニッチなオンラインサービス「Project Euler」をご紹介します。
学生時代に数学から逃げていたという方も、
プログラミングという武器があればちょっと好きになれるかも?

Project Eulerとは?

Project Eulerは、数学的な問題をプログラミングで解くことを楽しむためのWebサービスです。
2001年にスタートし、現在は900問以上の問題が公開されています。
スイスの数学者レオンハルト・オイラー(Euler)の名を冠しており、
問題のテイストも純粋に数学的です。
問題の難易度は幅広く、最初のうちは「数列の和を求める」など比較的シンプルですが、
徐々に歯ごたえが増していきます。
すべての問題に共通しているのは、
手計算では現実的に解けない規模の計算をいかに効率よく解くかという点です。
たとえば「100万以下の素数の和は?」という問題は手計算では日が暮れてしまいますが、
プログラムを書けば一瞬です。
「数学的な発想」と「プログラミングの実装力」の両方が試されるのが、
このサービスの醍醐味です。
利用は無料で、アカウント登録をすることで解いた問題の記録が残ります。
面白いのが登録時にいきなり1問解かされること。
「まず腕試しをしてから入会してね」というスタンスが、
いかにもマニア向けのサービスって感じがしますね笑。
登録の壁がそのままチュートリアルになっているわけで、
最初の1問を解いた達成感とともにアカウントが開設されます。

試しに1問

試しに実際に載っている問題を1つ解いてみましょう。

10未満の自然数のうち、3または5の倍数は 3, 5, 6, 9 です。
これらの合計は23になります。
では、1000未満の3または5の倍数をすべて足すといくつになるでしょう?

【手計算】
等差数列として考えられると簡単です。
3の倍数(3,6,9,15,…)と5の倍数(5,10,15,30,…)を分けて考えます。
等差数列の合計は、要素数 × (最小 + 最大)/ 2で算出できます。
3の倍数の合計 = (1000/3の商) × (3+999) =166833
5の倍数の合計 = (1000/5の商) × (5+1000) =99500
これらを足すわけですが、15の倍数が被ってしまいます。
15の倍数の合計 = (1000/15の商) × (3+990) =33165
この被り分を考慮しまして、
166833 + 99500 − 33165 = 答えは「233168」になります。

【プログラミング】

total = sum(i for i in range(1000) if i % 3 == 0 or i % 5 == 0)
print(total)  # 233168

Pythonの例です。
「1000未満の3または5の倍数をすべて足す」をプログラミング言語で書いただけですね。
実際は行を分けて分かりやすく書くかと思いますが、
それでも手計算よりも圧倒的に楽でしょう。

簡単な問題を選んだので手計算もプログラミングも手短に解説できましたが、
もちろんプログラミングでも手応えがある問題がたくさんあります。
ぜひチャレンジしてみてはいかがでしょうか?

まとめ

もしかしたらあなたは「こういう計算はAIに任せればいい」と考えているかもしれません。
しかし、問題の構造を理解し、どんなアプローチが有効かを判断する力がないと、
AIへの指示も的外れになってしまいます。

Project Euler で数学的な思考やアルゴリズムの感覚を磨き、
AIをより効果的な道具として使いこなせるようになって初めて、
「こういう計算はAIに任せればいい」と言えるようになると私は思います。
まずは登録時の1問だけでも、ぜひチャレンジしてみてください!