中の人の徒然草494 掛け算と割り算の定義がおかしい事が気になって仕方がない
最近私がこだわっているのは、掛け算と割り算の定義です。小さいころから思っていたのですが、やっぱりおかしいです。プログラミング的に考えても、このような仕様は気持ちが悪いです。というのも・・・
1 + 0 = 1というふうに足し算では、 0を足しても相棒を覚えています。しかし、掛け算では、1 * 0 = 0、 2 * 0 = 0・・・というふうに「相棒」を忘れてしまいます。割り算に至っては、1 ÷ 0 = エラー(無限)です。この仕様は、プログラミング的に考えて実に不可解です。対応関係が保持されていません。
0を使用すると1対1対応でなくなるのは頂けません。また、処理的に考えても、加算処理を包含する乗算処理が、0を引数として指定すると0を返すのはおかしいです。どういうことかというと・・・
足し算はインクリメント(1増加)を引数回数行う演算です。この時の0は引数がない状態だと考えられます。つまり・・・
inc() = 1、inc( inc() ) = 2。これを踏まえて、 add( inc( inc(), inc() ) = 1という具合の演算子だと思われます。
という事は、mul( x, 0 ) = 0 というのはおかしいです。何故かって?加算処理では、引数がないときに、もう一つの指定されている値を返します。これにより、1対1対応が実現されています。という事は、乗算処理でも0を指定されたら違う引数の値を返さないと情報の整合性がありません。とはいえ・・・
5 * 1 = 5、 5 * 0 = 5 となったら、2つの値が対応してしまうことになります。
これはこれでおかしいのですが、だからといって「全部0にしちゃえ」というのは乱暴すぎます。だって、加算処理では0回処理しても違う引数の値を返しているのですから、初期値を変更しないという定義になります。それが、乗算処理になったからといって、加算処理を0回したら、初期値を忘れて全部0というのは、投げやりすぎませんか?
多分職業病(システム屋病?)なのでしょうが、こういう定義は気持ちが悪くて仕方がありません。私ならば、数記号を増やして、符号付き数と同様の発想で・・・
5 * 0 = *5、5 * 1 = 5、 5 / 0 = /5、*5 / 0 = 5 ・・・
という具合にします。その方が1対1対応になって、プログラミング的に美しいと思います。数学オブジェクトは、対称性にこそ、その美があるのですから、乗算ごときで美しさを放棄しないでほしいです。数学は一貫して、対称の美を守るべきだと私は思います。
情報技術者から見たら、数学は「少数のオブジェクトを極める学問」です。その扱うオブジェクトの少なさ、シンプルさ、対称さ、明晰さ、といったものに心が惹かれるので、徹底的にやってほしいです。そういったことから、掛け算と割り算に拘らないで、一体どこに拘るんだと私は思います。数オブジェクトの2つのメソッドの仕様に問題があれば、数学全体の美しさも損なわれます。どうして数学者は気にしないんだろう・・・実に不思議です。おそらく、可換性と関係している思いますが、だからといって全て0は、やっぱり気持ちが悪いです。始めて算数を習った時から気になっていました。もし可換性の問題ならば、可換性も満たすような数記号を増やしたほうがいいと私は思うのです。
私が日常的に考えているのは、こんな具合の事です。システム屋をしているからだと思うのですが、何でも分析して、プログラミング的に美しくしないと気がすみません。非技術者の人から「そんなこと気になる?」といわれますが、ものすごく気になります。何故かって?理由なんてありません。美しくないものは美しくないから気になる。ただ、それだけです。自然を見て、綺麗とか、汚いとか、そういったことを感じるのと同じ感覚です。それを言っても、わかってもらえないんだよね・・・