過去の日記

2011-05-05

これが数学でなくて一体何だというのだろう?? [hatena]

A÷B=C 余り Dという計算をするときに、A=BならC=1 D=0になるはずですよね?
0÷0=1 余り 0という計算は間違っていますか?
0×1+0=0で検算してもあっています。

A÷B=C 余り Dという計算をするときに、A=BならC=1 D=0になるは.. - 人力検索はてな

すみません。数学はわかりません。

うーん、じゃあ何が言いたかったのだろう。


といってもそこはしょうがない。
数学を問題にしてないということは、これは工学上の問題──計算機上の道具としての演算を相手にした話──ということなのでしょう(全然そうは読めませんが)。
0÷0=1 余り 0 というのは実は私はある程度許容範囲内ではあるのです。
計算系に導入して何かメリットがあれば、便宜上そうしてもいいのかもしれない、ぐらいには思います。
そもそもコンピュータの演算上の剰余には、特に負数が混じってくると一意にならないという問題をはらんでいるというのも、そのぐらいには思える一因かもしれません。

負数の割り算が割りきれない

で書きました。
数学上でも、

保障されない簡単な例として、a = 7, b = −3 とすると

7 = (−2)(−3) + 1
7 = (−3)(−3) − 2

と 2 通りに分解することができて、確かに |1| < |−3| も |−2| < |−3| も成り立っている。

先の定義では 「剰余が負でない」 ということを付してこの一意性を保障したが、このような一意性を与える付帯条件のつけ方は一通りではない。

除法 - Wikipedia

となる通り、何らかの恣意的な意味づけをしなければならないことにかわりはないのですから。

同じように、0 ÷ 0 = 1 余り 0 も恣意的な意味づけとして採用することもいいのかもしれません。(最低限 a ÷ b = c 余り d ⇔ a = b × c + d を満たしてはいますし)。


でもそのためには、それがどう役に立つのかという価値を示さなければなりません。
正しいんじゃないの?
では通用しないのです。
主張しなければならないのは、正当性ではなくて有用性です。
その義務は質問者さんの側に課せられるものです。
極端に言うと、除算回路が劇的に早くなるとか、そんな感じのすごい価値/実用性がともなわなければ、はあ? 馬鹿じゃないの? で終わりです*1

そこが分かっていないのだろうし、多分何も考えてないのでしょう。


devide by zero で例外を発生させた方が有益なんじゃないのかな……? という程度の感想ですが、もう少し考えないといけないのかな。
もっともこの程度のことは、計算機工学上誰一人考えたことがない、なんてことはなくて、すでに発案されていて、でもボコボコにされたとか無視されたとかいう事例はきっとあるんだろうな、とも思いますが。


追記
こうやって「0で割る/0の剰余を取ることができる方法」を追加しても、モジュラー算術(計算機工学分野で結構重要)で法を 0 にした時に乗算の逆元がでてこない! 何だよ、やっぱり(モジュラー算術で)除算が定義できるようになったわけじゃないじゃん! 要らなくね。ってことになるのかな。


追記
うん。まあなんていうか「相対性理論は誤りだ!」「じゃあ、原子爆弾や原子力発電は、どういう原理でエネルギーが発生しているんですか?」「そんなもの私の知ったことじゃない!」みたいな雰囲気が漂っているような。

*1 なぜかというと「普通の」数学と対立してるから。


2011-05-06

お風呂の水をきれいに保つために [徒然]

純銅のお風呂ネットが売られている。

そこそこの値段が(500〜700円程度)するし、網が壊れてしまった。
そこで、3個350円の純銅タワシをハンズで買ってきて、100円ショップで買ってきた洗濯ネット(浮き付き)に入れてみた。
やっぱり違う。何度か追い炊きしても何もしないのに比べてお湯がきれい。


2011-05-07

短縮URLをクリックする前に確かめたい! [etc][tips]

会社のファイアウォールなんかで監視されてる場合なんかは特に。
tinyURLにはpreviewモード*1があって便利だったのに、他のサービスはやらないのかな。


まずは、簡単なサービス。

LongURL | The Universal Way to Expand Shortened URLs

自分の物じゃないPCなどではここ経由で。


Firefox Add-on

https://addons.mozilla.org/en-US/firefox/addon/bitly-preview/

残念! Firefox4 では使えない! 他にもちらほらあるけどどれも同じか。

そこで、Greasemonkey Script。

https://addons.mozilla.org/en-US/firefox/addon/bitly-preview/


Chrome add-on

LinkPeelr: Short Link Expander (Chrome Add-on)


それぞれのサービスで伸長するやり方は、

the JoshMeister on Security: How to Preview Shortened URLs (TinyURL, bit.ly, is.gd, and more)

にまとめられていた。


まあ、自分用のメモですな、

*1 設定しておくとそのブラウザでは必ず、伸長したURLが確認できるページを先に表示してくれるモード。


2011-05-08

数学の話をしよう [hatena]

先頭追記。
えー。"浮動小数点演算 結合則"という検索語でのランクが高いようなのですが、それは別のエントリでした。

1000speakers@Sendai

ほかにも、"掛け算 交換法則 実数 証明"なんかから来た人もいました。

メタ数学explorer

もいいかも。でも"公理的集合論を出発点とした数学の構築"という時点でちんぷんかんぷんな人にはお勧めできません。
もちろん「実数領域での掛け算が交換法則を満たすこと」は証明可能です。でも、専門でない人(私も含まれます)には「実数領域での掛け算」どころか、「実数の定義」でさえ理解できないほど難しい、というのが正直なところです。
追記終わり。


きっかけは、

A÷B=C 余り Dという計算をするときに、A=BならC=1 D=0になるはずですよね?
0÷0=1 余り 0という計算は間違っていますか?
0×1+0=0で検算してもあっています。
http://q.hatena.ne.jp/1304487720

です。
公理系を持ち出したりするような「数学を数学する」というほど高度ではない。でも算数の話ではなくて、数学の話をしようと思います。
(したがって、このお話は質問者が望むものではないので、これは、はてなの質問に対する回答ではありません)


割り算とは何か。
整数を整数で割る。有理数を有理数で割る。この辺までは算数の範囲でまぁ、大体理解できそうです。
でも、実数で実数を割る、ということはどういうことか? 例えば何かの数をπで割るってどういうこと?


そこで、割り算を「乗算の逆演算」として定義し直します。
逆演算とは何か。
演算に対する逆元を定義することです。

まずは、演算記号を\(*\) 、演算における単位元を\(e\) と表記します。
任意の元*1\(a\) に対して、\(a~*~e~=~e~*~a~=~a\) を満たす元が単位元です。
「普通」の乗算では1がこれにあたりますね。

逆元とは何か。
ある元\(x\) と\(y\) で、\(x~*~y~=~y~*~x~=~e\) の関係にある時、お互い逆元と呼びます。\(x\) は\(y\) の(演算\(*\) における)逆元で、\(y\) もまた\(x\) の逆元です。

割り算は、乗算に対する逆元をかける、ということで定義します。
ある数\(a\) で割るということは、\(a\) の逆元をかけるということになるわけです。

そういうわけで、ある元に逆元が存在するかどうか? というのは非常に重要なお話です。


それはひとまず置いておいて、今度は零元*2の話をしましょう。
任意の元\(s\) に対して、\(s~*~z~=~z~*~s~=~z\) を満たす元が零元です。
「普通」の乗算では0がこれにあたりますね。


0割りが許されない理由は、これら逆元(の存在性)と零元の関係を見ると分かります。

0で割るということは、0に逆元が存在してその逆元をかける、ということになります。
0に逆元が存在する必要が──つまり\(a~*~0~=~0~*~a~=~1\) である\(a\) が存在する必要があります。
ところが、\(s~*~0~=~0~*~s~=~0\) という性質が0にはあります*3。というか、この性質こそが重要です。
ここが矛盾します。

0割りを許すというのは、つまりこういうことです。
\(s~*~0~=~0~*~s~=~0\) という性質をあきらめて、\(a~*~0~=~0~*~a~=~1\) という数\(a\) が存在することにしよう。そんな数\(a\) を、数の集合に新たに追加しよう(ここからは、そんな数\(a\) のことを、0の逆元とか、\(0^{-1}\) とか書きます。)
こう言っているのと同じなんです。


で、これが大問題なわけで、「普通」の数学ではそんな数を追加するなんて到底認められない。
\(s~*~0~=~0~*~s~=~0\) という性質をあきらめることをあきらめているのです。
「普通」の数学では、割り算の時に「ただし\(x\neq~0\) とする」という但し書きが頻繁にでてきます。面倒です。でも仕方がありません。


え?
\(0^{-1}\) が存在することにするのが面倒なのは分かる。数直線とかそういう道具立てに問題がありそうだし、大体そんな数は想像できない。でも、\(s~*~0~=~0~*~s~=~0\) という性質をあきらめるのがなんでそんなに重要なのか?
ですって?

……そうですねぇ。パッと思いつくのは、こんなものです。


\(xyz\neq~0\) であるとすれば、\(x\neq~0~\land~y\neq~0~\land~z\neq~0\) と言えますね?
これができなくなります。
\(x\) が\(0\) で、\(y\) が\(0^{-1}\) 、という可能性が出てくるからです。


数式を変形していきます。ある項が\(a~\times~(b~-~b)\) という形になりました。これで\(a~\times~0\) となってこの項を消すことができますね?
これができなくなります。
\(a\) が\(0^{-1}\) 、という可能性があるからです。\(a~\times~0\) の項を消すことはできません。


ああ、ここまで考えてきて、やっと、なんとなく理解できた気がします。
0割を許すと「ただし\(x\neq~0\) とする」という但し書きが消えて一見便利になるように思えます。
でも、実は、結局「ただし\(x\neq~0^{-1}\) とする」という但し書きが比べものにならないほどやたら頻繁に出てくるだけになってしまうんじゃないでしょうか?
本当のところはわかりません。
でも私としてはここで納得できてしまいました。
おしまい。


(数式表示の関係で読みにくくなっていますがご容赦を)


追記 2011/05/09
あ、なんかもっと大変なことに気がついてしまった。
\((0\times~0)~\times~0^{-1}=0~\times~0^{-1}~=~1\)
\(0~\times~(0~\times~0^{-1})=0~\times~1~=~0\)
結合法則が成立しないじゃないですか。

一般に\((xy)z=x(yz)\) が成立しないのだから、括弧を外して書くことができないとか、なんて使いにくい数学になるんでしょう!
\((x+y)^3\) とかもう書けないんじゃないですか? (追記:ここ分かりにくかったので補足。上の「一般に\((xy)z=x(yz)\) が成立しない」の\(x,y,z\) を\((x+y)\) に置き換えると分かる。\(((x+y)(x+y))(x+y)=(x+y)((x+y))(x+y))\) が成立しない(するとは限らない)ので、左から計算するか右から計算するかの括弧を常に書かなければならなくなり、\((x+y)^3\) とは書けないんじゃないか? ということ。↓で展開してみているのはそれを確認するため。)
気になるので書いてみようっと。
\(((x+y)(x+y))(x+y)=(x^2+2(xy)+y^2)(x+y)=(x^2)x+(x^2)y+(2(xy))x+(2(xy))y+(y^2)x+(y^2)y\)
\((x+y)((x+y))(x+y))=(x+y)(x^2+2(xy)+y^2)=x(x^2)+x(2(xy))+x(y^2)+y(x^2)+y(2(xy))+y(y^2)\)
うん。\((x^2)y+(2(xy))x=3x^2y\) ってできないじゃないか! もうやだ……。

\((2(xy))x\) なんかの"2"は\(0^{-1}\) が紛れ込む余地がないので括弧の外に出てくるような気もするし、\(x(x^2)=(x^2)x=x^3\) あたりは成立するような気もする。

あまり考えずに\(0\times~0=0\) にしてしまうのがまずいのか……。
いずれにせよ、これは私の手に負えません。

やっぱり、これは《使えない道具》でしょう。

でも、この質問者さん、\(0^{-1}\) の存在を仮定した時に\(0\times~0=0\) とすると、結合法則が成立しなくなるという可能性に自分でたどり着いてるんですよ。
これはちゃんと自分で数式をいじっている証拠です(いじり方が正しいとは言ってません)。

ここから、結合法則が通用しなくなるってことに行かないあたりが何とも。
気がついていてペテンを仕掛けてるのだとしたら、あの有名な1=0の証明なんかよりも遙かに高度ですね。:-P

*1 集合の話から始めないのは手抜きですね。

*2 零元という用語は半群に限って使われる用語らしいです。吸収元という用語の方が精確な様ですが、ここでは零元とします。適当ですね。

*3 この辺から、"任意の元sに対して"とか"となる元aが存在する"とかいう表現が消えていきます。ひどいですね。


2011-05-09

皮肉じゃなくて [hatena]

これはいい質問だと思いますよ。
素朴ではあるけれど、ちゃんと分かる様に伝えようとすると、考えちゃいますね。

掛け算は交換法則を満たし割り算は交換法則を満たさないのであれば
掛け算と割り算は違うものであり、掛け算を割り算にしたり、割り算を掛け算にしてはいけないということになりませんか?
掛け算と割り算が同じものであるならば、掛け算は交換法則を満たしていないということでは?
http://q.hatena.ne.jp/1304857863

(ここで引用した部分より下はどうでもいいです)


ということで色々と考えて書いてみたけれど、どうだったろうか。
回答の中で、

「ある演算が交換法則を満たしていたら、逆演算も交換法則を満たすはず」というのがただの勘違いなので、

とか断言しちゃってるけど本当だろうか。
自分の理解が浅いだけなのでは? という心配は残るが、まぁいいや。

メタ数学explorer [etc]

追記 2011/05/12
このページで説明されている公理系は、一般的なZF(C)公理系じゃなくて、別の公理系みたいです。でも、説明には「ZFCを出発点にして数学を構築する」という文章もあるし、ちょっとまだちゃんと読めていないかも。
追記終わり


公理的集合論からどうやって数学が構成されるかを網羅的に収集したサイトを見つけた。
スゴイ! と思った。

Proof Explorer - Home Page - Metamath

がそれだ!


右上の Theorem List というリンクを開いてみる。
ページ全体からすると"上の方"に、Real and complex numbersというカテゴリがある。
そのちょっと下に Multiplication とある。ここに実数と複素数の掛け算に関する定理が並んでいる。
一番上、Identity law for multiplication. が、1が単位元となることの証明で、それは表の左から2番目、mulid2 5662 と書いてある部分のリンクから見られる。
1の定義とか、掛け算(・)の定義などはこのページの Syntax hints という部分から見られる。右側に登場している記号と、その説明へのリンクがある。記号の説明に飛んで、そこから See definition の部分のリンクをたどると定義が出てくる。
例えば実数、複素数の掛け算の定義はこれ→ ( Define multiplication over complex numbers. ) になる。


ちょっと戻って、実数の掛け算に関する定理が並んでいるところの一つ下、Commutative/associative law for multiplication. の部分が交換・結合規則になる。また左側の mul12 というリンクから進む。
表の Step1 が交換法則なので、Ref 列の mulcom というリンクをたどる。これが交換法則の証明となる定理、定義、公理の羅列連鎖の記述である!


……と思う、としか言えないけど。
こんなん読めるか〜!!
でも、それでもなお、このサイトにはすごく感動した。


2011-05-10

1+1=2を証明する [hatena]

昨日の話の追補。
そして、

1+1=2であると論理的に証明してください。
そう定義しているからというのは証明ではありません。
http://q.hatena.ne.jp/1304867846

のお話。


http://us.metamath.org/mpegif/mmset.html#trivia

ここに「2 + 2 = 4 の計算を公理まで溯ったら?」という trivia が書いてある。
ちょうどこの部分に「なんで 1 + 1 = 2 を例にしないのかといえば、これは本質的には 2 の定義であるから、したがってtrivialな証明になる」としっかり書かれている。
「定義だから」で終わりにしていいわけではないことが分かる。「定義と本質的に同じなので簡単な証明で終わる」となっているのだ。


ここ↓

http://us.metamath.org/mpegif/1p1e2.html

が、1 + 1 = 2 の証明。
どうやら、定義以外に可換則*1が必要になるということのようだ。
1 の 定義、= の 定義、整数の + の定義、2 の 定義、可換則の定理と連なっていることがここから読める。
細かく見ていくと、「A を B と定義する」という意味での記号=と、「A と B は等しい」という意味での記号=とは違うものらしいことが見てとれる。
この2つに同じ記号を使っていい理由─私たちが普段気にしなくてもいい理由は、つまり、「A を B と定義したらA=Bが成立する、が証明可能だから」なのだろうか? (追記2011/05/16:違うなぁ。定義の記号と等号に同じ記号を使うけど。厳密には違う記号だよ、という程度の話に思えてきた。)
私では断言はできないが、2 を 1 + 1 と定義したから 1 + 1 = 2 を証明したことにはならない、らしい。
さすがに厳密である。

もっとも、私がなんとか「読める」のは説明文の方であって、証明にあたる公理への道筋はとても追えないのだが。


その他にも、プリンキア・マティマティカに書いてある「1 + 1 = 2 の証明」を、モダンに書き直したものも書いてある。

http://us.metamath.org/mpegif/pm54.43.html

空集合(0)を定義*2。空集合の後続数として1を定義。1の後続数として2を定義。後はちゃんと追えないのだけど、1 + 1 を集合バージョンで記して、それが 2 と同じ集合になる、と書いているようである。


後者に関しては、2の定義と1+1=2は別物で、証明になっている。
前者の関しても、確かに2の定義は1+1ではあるけれど、「2の定義が1+1である」ことと、「1+1=2 という数式が成立する」こと*3」は、厳密にみればやっぱり違うんだな、ということが分かった。


(追記)
ここに書いてあることはほぼ嘘で、実際には(複素数での1+1)が(複素数での2)の定義だとして進行してます。

自然数での1+1=2の証明は大ざっぱに以下の通り。

自然数と呼べる集合は、どのような性質を持っていないといけないか、を考察して形にします(公理と呼びます)。
加算を定義します。
1を定義します。
2を定義します。
1+1 の結果と 2 が同じことを確認します。

と進みます。

《自然数の公理》
・0 という自然数が存在する。 0∈N
・任意の自然数 a には、後続数 a' が存在する。 ∀a∈N[a'∈N]
・後続数が同じなら、元の数は同じ。 ∀a∈N ∀b∈N [a'=b' ⇒ a=b]
・a' = 0 となる a は存在しない。 ∀a∈N[a'≠0]
・もう一つ、数学的帰納法に関する公理がありますが省略。

《加算の定義》
加算を
a + 0 = a
a + b' = (a + b)'
で定義します。

《1と2の定義》
1=0'
2=1'=0''
として定義します。

あとは確認。
1+1
=1+0' ←1の定義から
=(1+0)' ←加算の定義の2番目
=1' ←加算の定義の1番目

で、1+1の結果が2の定義と同じになることが確認できました。

これだと簡単すぎて加算のエッセンスが分からないのでもすこし。
2+2
=2+1' ←2の定義から
=(2+1)' ←加算の定義の2番目
=(2+0')' ←1の定義から
=((2+0)')' ←加算の定義の2番目
=(2')' ←加算の定義の1番目
=3' ←3の定義から
=4 ←4の定義から

*1 間違い。単に可換則といえば x op y = y op x を想像してしまうだろう。ここで言っているのは A=B ⇒ B=A のこと。

*2 プリンキア・マティマティカ バージョンの空集合なので、公理から自明ではない(らしい)。

*3 「1+1=2 が証明可能である」の方がより精確だと思う。


2011-05-20

jsMathのバージョンあげました

数式表示に使っている jsMath のバージョンを3.6eにしました。

http://www.math.union.edu/~dpvc/jsMath/welcome.html

Mac OS X+Firefox4 で表示がおかしかったのが直りました。