From: "H. Shimura" Date: 2009-07-22T17:48:05+09:00 Subject: [ruby-dev:38847] Re: 複素数リテラルについて 昔少し数学をしていたことがあります、志村といいます。 In message "[ruby-dev:38845] Re: 複素数リテラルについて", <20090722091344.B28E.C613B076@garbagecollect.jp>, U.Nakamura wrote... > on Jul.22,2009 07:08:24, wrote: >> * iでいいのか。Pythonはなぜかjだが。 Python の事は分かりませんが、 確かに虚数単位の記号に「j」を使うような立場もあります。 電気系など、既に別の意味で変数名などに「i」を使う習慣のある場合に 虚数単位として「j」を採用するケースなどです。 一方もともと Imaginary number の unit (imaginary unit) からくる「i」 という文字の方が一般性が高いのでやはり「i」の方が良いと思います。 >特に問題がないなら、iとjの両方を許すのがいいのではないでしょ >うか。 数学の方ではさらに四元数というのがあります。 複素数の「複素」で二つのところが四つになってるものです。 その三つの虚数単位には「i」「j」「k」を使うのが一般的だったりします。 そちらに誤解される事を思うと「iとjの両方」というのは怖いです。 「i」(だけ)が良いと思います。 >> * 複素数化するメソッドNumeric#iは要らないか >> * 要るなら、虚数.iの値は何か? 複素数.iの値は? >Numeric#iが必要かどうかについては特に意見はないですが、それは >selfに虚数単位を掛けるという操作になるのでしょう。 >つまり、Numeric#iの実装はComplex(0, self)相当になるのではない >かと思います。 2.0.i とか、(3 + 2.0i).i がどうなるべきかと言う事ですね。 値の候補を考えて見ます。 (1) 値に虚数単位を掛けたもの 「2.0i」と「2.0.i」は同じものになる、或いは「2.0*1i」 「(3 + 2.0i).i」は「- 2.0 + 3.0i」、或いは「(3 + 2.0i)*1i」 前者は分かりやすいですね、「.」のあるなし位で意味がぶれなくて良い。 後者はまあそうですね、というか、それで納得はするけど。 (2) 虚部を返す 「2.0.i」=> 0 「(3 + 2.0i).i」=> 2.0i この動作だけだとちょっと変な感じですね。 Numeric#r メソッドがあって実部がとれるのでなければ変。 そしてその二つの一文字メソッドを作る必要性は特に感じないです。 現行の Complex#real 、Complex#image で十分。 (3) 実数としてそのまま複素平面に埋め込む 「2.0.i」=> 2.0 + 0i 「(3 + 2.0i).i」=> 3 + 2.0i Numeric 複素数化するメソッドというならこういう挙動もありかもしれないが、 #i という名前でこの挙動は変かもしれない。 単純に (1) の動作で良さそうです。 ただ、Matrix や Vector に各要素を (1) の動作で複素数する #iメソッドを 付け加えるのかどうか(大きな必要性は感じないです) 迷う事まで考えると、そもそも Numeric#i 自体が要らないのかもしれません。 「2.0.i」がなく、掛け算(メソッド)で書く事になって、 その時は必ず「2.0 * Complex::I」と書かないといけないならちょっと煩わしい ですが、上に挙げたように「2.0*1i」と書けるので、それで良いかなあと思います。 ---------------------------------------+---------+---------+以上 2009/7/22 志村弘之 mailto: shimura-hir@obun.jp