数学とプログラムはどちらが易しいか/数学とプログラムの違い

最近、某所で「数学とプログラムはどちらが易しいか」という話題が出ました。その場ではあまり上手い返しができなかったので、ブログ記事の題材にして供養します。

もちろん、この質問の答えは人によって違うでしょうし、人によって違うからこそ質問として意味があると言えるでしょう。この記事に書くのは私の見方、私の意見です。

短い答えが欲しい人向けに2択で答えておくと「私にとってはプログラムの方が易しい」となりますが、以下に長い答えを書きます。

具体例は大事、ならばアルゴリズムも大事

プログラムが扱えるものは必然的に具体的で、大抵の場合は計算できます。整数も浮動小数点数も配列もメモリ上の表現があり、関数は実行可能なコードとして表現されています。一方、数学では「なんらかの集合の上の同値関係」などの抽象的なものを考えたり、機械的に扱えそうにないもの、例えば「\(\mathbf{R}\)を\(\mathbf{Q}\)上の線型空間として見たときの基底」だとか「無限集合の濃度」のようなものも扱えます。

とはいえ、数学でも具体例は重要です。人が数学的概念を理解するときは、なんらかの具体例が頭の中にあることが多いのではないでしょうか。「考えている概念の具体例をひとつ挙げてください」と言われて答えられない人がいたら、その人はその概念の理解が足りないか、あるいは有限斜体や奇数の完全数のように具体例の存在そのものが重大な問題なのでしょう。数学的な仮説を立てる際にも、具体例は重要だと思われます。現代数学は抽象化の学問な印象がありますが、むしろ、隙あらば数学的対象を具体例で「表現」したり、具体例へ「分類」しようとするのが数学者ではないでしょうか。

そして、具体例を扱う上では計算方法、アルゴリズムを知っておくことも重要だと私は思います。素数を扱うなら素数判定や列挙のアルゴリズムを、実数の平方根\(\sqrt{x}\)を扱うなら計算方法(開平法など)を、行列の固有値を扱うならその計算方法を、\(\mathbf{Z}[x]\)が一意分解整域であることを使うなら因数分解のアルゴリズムを、知っておくべきだと思います。

(「そのようなアルゴリズムはアルゴリズムの専門家が考えれば良いのであって、一般の数学者が知っている必要はない」というような反論はありうると思います。)

普通の数学では非構成的な議論が許容される

しかし、数学的な議論をやっていると、具体例の構成方法やアルゴリズムが必ずしも明らかではないものを使うことがあります。例えば、「無理数の無理数乗が有理数になることがある」という命題の証明を考えましょう(これは「非構成的な証明の例」としてよく引き合いに出される証明です):

「\(a:=\sqrt{2}^{\sqrt{2}}\)とおく。\(a^{\sqrt{2}}=2\)に注意する。\(a\)が有理数かどうかで場合分けする(排中律)。\(a\)が有理数なら、『無理数\(\sqrt{2}\)の無理数\(\sqrt{2}\)乗が有理数』ということになる。\(a\)が無理数なら、『無理数\(a\)の無理数\(\sqrt{2}\)乗が有理数\(2\)』ということになる。いずれにせよ、無理数の無理数乗が有理数になることがあることがわかった。」

この証明を読んでも、結局「無理数\(x\)の無理数\(y\)乗が有理数になる例(\(x^y\in\mathbf{Q}\)となる\((x,y)\in(\mathbf{R}\setminus\mathbf{Q})^2\))」がどちらなのか分かりません。証明からアルゴリズムを取り出すことができないのです。これは、非構成的な原理である排中律を使ったせいだと考えられます。

つまり、「数学的に許容される議論」と「プログラム的なもの(アルゴリズム)」には差があり、数学の議論からアルゴリズムを取り出すことは一般にはできないのです。

構成的数学

先ほどの証明では排中律を使ったためにアルゴリズムが取り出せなくなりました。しかし、同じ命題の、排中律を使わない証明を考えることもできます:

「\(b:=\sqrt{3}\), \(c:=\log_{3}4\)を考える。これらは無理数である(証明略)。\(b^c\)を考えると、これは\(b^c=3^{\frac{1}{2}\log_{3}4}=2\)と、有理数になる。よって、これが『無理数の無理数乗が有理数になることがある』ことの例である。」

こちらの証明からは、「無理数の無理数乗が有理数になる例」を取り出すことができます。

もっと複雑な議論でも、非構成的な原理を避けるように証明を注意深く書くことができれば、証明からアルゴリズムを取り出しやすくなり、具体例の計算の際に役に立つでしょう。

このように、排中律やその他「非構成的な原理」の使用を避ける数学が構成的数学です。「非構成的な原理」と聞いて選択公理を思い浮かべる人もいるかもしれませんが、フルの選択公理からは排中律が導かれるので、選択公理は使わないか、従属選択公理や可算選択公理のように弱めた形で使います(Bishopの構成的数学では従属選択公理を認めています)。なお、非構成的な原理は、「使用を避ける」のであって、「否定する」わけではありません(直観主義数学や再帰的数学のように、通常の数学と矛盾する原理を仮定する流儀もありますが、ここでの「構成的数学」はBishop流のように通常の数学と矛盾しない流儀を念頭に置きます)。

最初の質問に戻ると、「構成的数学なら、数学もプログラムも同じくらい易しい」ということにならないか、というのが一つの答えです。

(まあ、プログラムの場合は「効率の良いアルゴリズム」みたいなものが問題になったりするわけで、そういう意味では若干プログラムの方が難しいかもしれません。)

非構成的な数学は易しいか

もちろん、現在実践されている数学には非構成的な原理を本質的に使うものがたくさんあります。例えば、「上に有界な実数の集合は、空でなければ上限を持つ」という、誰もが学部で学ぶ定理も、構成的数学では示すことができません(関連:Specker sequence)。中間値の定理だってよくある「構成」ではがっつり排中律を使うので、構成的数学ではそのままのステートメントでは成り立ちません。

「数学」を「現在実践されている数学」と解釈するならば(それが普通の解釈だと思いますが)、「数学とプログラムはどちらが易しいか」という質問は、「排中律などの非構成的な原理を許可することによって議論が易しくなるか」と言い換えられるのではないでしょうか。

私にとっては、非構成的な原理はあまり心の底から「受け入れた」とは言えません。なので、非構成的な原理を含む「数学」よりも、構成的な議論で済む「プログラム」の方が「易しい」ということになります。

非構成的な原理が心の底から自然だと思える人であれば、非構成的な原理が使い放題の「数学」の方が「易しい」ということになるかもしれません。


先月も「√2が無理数であることの証明と背理法と構成的数学」という記事を書きましたが、どうも私は「なんでも構成的数学の話に持っていきたい年頃」のようです。しかし、私には相応の構成的数学の実力があるわけではないので、「エッセイばかり書いてないで数学しろ」と言われても仕方がないかもしれません。

Spread the love