From: Shin-ichiro HARA Date: 2008-05-24T18:32:40+09:00 Subject: [ruby-dev:34838] Re: ComplexFloat 原です。 > こんばんは sheepman です。 > > On Fri, 23 May 2008 07:58:12 +0900 > Shin-ichiro HARA wrote: > >>> が、Complex#divmod を現在の >>> Integer#divmod の拡張として定義することは可能でしょうか? >>> 商を四捨五入とするのは Integer#divmod と一貫しなくなるので >>> floor のままにして、その条件を満たすことは可能でしょうか? >> 私もそれを考えたのですが、できないですね。(少なくとも、一般 >> 的な「ノルム」を使っている限りできない。) >> > > 割る数と割られる数の両方が実数か純虚数の場合だけ、普通の整数の除算として > 定義して、そうでない場合は四捨五入を使うという風にすれば、とりあえずは > Integer#divmod の拡張として Complex#divmod を定義できると思います。 > 拡張になっているといえるかどうかは微妙ですが。 おお、なるほど。それで良いですね! できないと言ったのは間違いでした。方法は無数にある。 例えば、次のようにしたらもう少しきれいかな。(複素数の商の実部 虚部を x, y として) if x + y < x.floor + y.floor + 1 [x.floor, y.floor] else [x.floor + 1, y.floor + 1] end つまり、Integer#/ の自然な拡張として、 class Complex < Numeric def idiv (other) a = self * other.conjugate b = other.abs2 z = a / b a.real + a.image < (z.real + z.image + 1) * b ? z : z + Complex(1, 1) end end