fc2ブログ

中の人の徒然草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は、やっぱり気持ちが悪いです。始めて算数を習った時から気になっていました。もし可換性の問題ならば、可換性も満たすような数記号を増やしたほうがいいと私は思うのです。
 私が日常的に考えているのは、こんな具合の事です。システム屋をしているからだと思うのですが、何でも分析して、プログラミング的に美しくしないと気がすみません。非技術者の人から「そんなこと気になる?」といわれますが、ものすごく気になります。何故かって?理由なんてありません。美しくないものは美しくないから気になる。ただ、それだけです。自然を見て、綺麗とか、汚いとか、そういったことを感じるのと同じ感覚です。それを言っても、わかってもらえないんだよね・・・
スポンサーサイト



テーマ : 日記
ジャンル : 日記

コメントの投稿

非公開コメント

No title

代数学を勉強してみると面白いのでは?

Re: No title

> 代数学を勉強してみると面白いのでは?
そうですね。
代数学やってみます。
プロフィール

インドリ

Author:インドリ
みなさん、はじめまして、
コンニチハ。

ボクは、無限の夢(infinity dream)を持つネタ好きな虹色の鳥インドリ(in dre)です。
色々な情報処理技術を啄ばむから楽しみにしてね。

http://twitter.com/indori
は別人による嫌がらせ行為です。
私とは関係ないので注意して下さい。
次はなりすましブログなどをするかもしれませんが、ここ以外でブログをするつもりがないので、ここ以外にインドリのブログがあったとしても無視してください。


何度言っても分からない人がいるので、ここにコメント欄へ書き込むときの注意事項を書きます。


一、社会人としてのマナーをわきまえましょう。
一、妄想に基づく書き込みを止めてください。
一、暴言の類は書かないで下さい。
一、某誹謗中傷サイトの書き込みは彼らの妄想に基づく書き込みですから無視して、ここへ書き込まないで下さい。
一、コメント書く前に他のコメントよく読んでから行って下さい。
一、言いがかかり等の行為を禁止します。
一、その他常識的に考えて迷惑なコメントはしないで下さい。


以上のルールを守れない人のコメントは削除します。



利用上の注意
ここに紹介してある文章およびプログラムコードは正確であるように心がけておりますが、内容を保証するものではありません。当サイトの内容によって生じた損害については、一切の責任を負いませんので御了承ください。


執筆したCodeZineの記事


【VB.NETで仮想CPUを作ろう】

  1. VB.NETで仮想CPUを作ろう
  2. レジスタの実装
  3. 仮想CPUのGUI化
  4. テストドライバの改良
  5. CPUの基礎動作の実装
  6. MOV命令の実装
  7. ADD命令実装
  8. SUB命令実装
  9. INC命令&DEC命令の実装と命令長
  10. MLU命令の実装とModR/Mについて
  11. DIV命令の実装とイベント設計について
  12. 機械語駆動式 関数電卓を作ろう!
  13. 機械語駆動式 関数電卓を作ろう! 解答編(前半)
  14. 機械語駆動式 関数電卓を作ろう! 解答編(後半)


【仮想ネットワーク実装でTCP/IPを学ぼう】
  1. TCP/IPの基礎と勘所
  2. ネットワークアクセス層の勘所
  3. インターネット層の勘所
  4. トランスポート層の勘所
  5. アプリケーション層の勘所
  6. セキュリティの基礎と仮想ネットワークの仕様
  7. GDI+と独自プロトコルの定義



【並列化】
インテル Parallel Studioを使って並列化プログラミングを試してみた
並列プログラミングの効率的なデバッグを実現する「Parallel Inspector」


【TBBシリーズ】
  1. インテル スレッディング・ビルディング・ブロックの概要
  2. インテルTBBから学ぶループの並列化
  3. スレッドセーフとインテルTBBのコンテナ
  4. インテルTBBのスレッドクラス


【OpenMPシリーズ】
  1. OpenMPの基礎構文
  2. OpenMPの実行時ライブラリと並列ループ
  3. OpenMPのメモリモデルとfork- joinモデル

最近の記事
最近のコメント
月別アーカイブ
カテゴリ
Ada (9)
COBOL (5)
C (9)
C++ (11)
C# (370)
D (25)
Java (8)
Perl (1)
Ruby (14)
PHP (2)
Boo (2)
Cobra (2)
LISP (6)
F# (33)
HTML (0)
XHTML (0)
CSS (0)
XML (0)
XSLT (0)
Scala (4)
WPF (0)
WF (2)
WCF (0)
LINQ (4)
MONO (5)
Linux (0)
MySQL (0)
ブログ内検索
リンク
最近のトラックバック
RSSフィード
ブロとも申請フォーム

この人とブロともになる

QRコード
FC2カウンター