Ruby 1.8.7 リファレンスマニュアル > ライブラリ一覧 > complexライブラリ > Complexクラス

class Complex + Numeric

クラスの継承リスト: Complex < Numeric < Comparable < Object < Kernel

要約

複素数を扱うためのクラスです。

このライブラリを require すると、Math モジュールが複素数対応に拡張されます。 対象となる複素数を以下のように極座標表示した時の

z = a + b * i = r * exp(i * t)

偏角 t は[-π,π]の範囲であると考えて、関数は定義されます。 Complex#argを参照して下さい。

以下が複素関数の定義です。

abs(z)  = r
sqrt(z) = sqrt(r) * exp(i * t/2)
exp(z)  = exp(a) * exp(i * b)
log(z)  = log(r) + i * t

sin(z)  = (exp(i * z) - exp(-i * z)) / 2i
cos(z)  = (exp(i * z) + exp(-i * z)) / 2
tan(z)  = sin(z) / cos(z)
sinh(z) = (exp(z) - exp(-z)) / 2
cosh(z) = (exp(z) + exp(-z)) / 2
tanh(z) = sinh(z) / cosh(z)

asin(z) = -i * log(i*z + sqrt(1-z*z))
acos(z) = -i * log(z + i*sqrt(1-z*z))
atan(z) = i/2 * log((i+z) / (i-z))
atan2(y, x) = -i * log( (x + i * y) / sqrt( x*x + y*y ) )
asinh(z) = log(z + sqrt(z*z+1))
acosh(z) = log(z + sqrt(z*z-1))
atanh(z) = 1/2 * log((1+z) / (1-z))

また、添付ライブラリのベクトルクラス Vector、および、 行列クラス Matrix を読み込んでいるとき、 Vector や Matrix の要素として、複素数を使うことができます。 Vector および Matrix のそれぞれの項目を参照してください。

require 'complex'

z1 = Complex.new(4, 3)
z2 = Complex.new(2, 1)

p z1 + z2 #=> Complex(6, 4)
p z1 * z2 #=> Complex(5, 10)

i = Complex::I

p z1 == 4 + 3 * i #=> true

特異メソッド

generic?(other) -> bool

other が Integer Float Rational クラスのオブジェクトかどうか判定します。

[PARAM] other:
判定対象のオブジェクト
[RETURN]
Integer Float Rational クラスのオブジェクトの時 true それ以外の場合には false を返します。
new(r, i) -> Complex
new!(r, i = 0) -> Complex

実部が r、虚部が i であるComplexクラスのオブジェクトを生成します。

[PARAM] r:
生成する複素数の実部
[PARAM] i:
生成する複素数の虚部

例:

p Complex.new(1, 1)   #=> Complex(1, 1)
p Complex.new!(3.5)   #=> Complex(3.5, 0)
polar(r, theta) -> Complex

絶対値が r、偏角が theta である Complexクラスのオブジェクトを生成します。

[PARAM] r:
生成する複素数の絶対値。
[PARAM] theta:
生成する複素数の偏角。単位はラジアンです。

例:

p Complex.polar(2.0, 0)         #=> Complex(2.0, 0.0)
p Complex.polar(2.0, Math::PI)  #=> Complex(-2.0, 2.44929359829471e-16)

インスタンスメソッド

self % c -> Complex

除算の剰余を計算します。

引数other がComplexオブジェクトの場合、

(自分自身の実部 % c の実部) + (自分自身の虚部 % c の虚部) * i

を返します。 このため、c の実部または虚部が0だった場合、ZeroDivisionError例外が発生することに注意してください。 引数 c がComplexのオブジェクトではない場合、実部・虚部それぞれを c で除算したときの剰余を実部・虚部に持つComplexオブジェクトを返します。

例:

Complex(5, 4) % 3 #=> Complex(2, 1)
[PARAM] c:
除算する数
[RETURN]
演算結果をComplexクラスのオブジェクトとして返します。

[注意] このメソッドは Ruby 1.9 で廃止されました。

self * c -> Complex

複素数 c を乗じた結果を返します。

[PARAM] c:
乗算する数
[RETURN]
乗算結果をComplexクラスのオブジェクトとして返します。

例:

c =  Complex(1, 1)    #=> Complex(1, 1)
p c * Complex(2, 2)   #=> Complex(0, 4)
p c * 3               #=> Complex(3, 3)
self ** c -> Complex

複素数 c でべき乗した結果

exp(c * log(self))

を返します

[PARAM] c:
累乗する数
[RETURN]
演算結果をComplexクラスのオブジェクトとして返します。

例:

z1 = Complex.new(1, 1)
z2 = Complex.new(2, 2)

p z1 ** 2     #=> Complex(0, 2)
p z1 ** z2    #=> Complex(-0.265653998849241, 0.319818113856136)
self + c -> Complex

複素数 c を加えた結果を返します。

[PARAM] c:
加算する数
[RETURN]
加算結果をComplexクラスのオブジェクトとして返します。

例:

c =  Complex(1, 1)    #=> Complex(1, 1)
p c + Complex(3, 3)   #=> Complex(4, 4)
p c + 3               #=> Complex(4, 1)
+ -> self

単項演算子の + です。 self を返します。

self - c -> Complex

複素数 c を減じた結果を返します。

[PARAM] c:
減算する数
[RETURN]
減算結果をComplexクラスのオブジェクトとして返します。

例:

c =  Complex(3, 3)    #=> Complex(3, 3)
p c - Complex(2, 2)   #=> Complex(1, 1)
p c - 3               #=> Complex(0, 3)
- -> Numeric

単項演算子の - です。 self の符号を反転させたものを返します。

このメソッドは、二項演算子 - で 0 - self によって定義されています。

self / other -> Complex

複素数 other で除した結果を返します。

z1 = a + b * i
z2 = c + d * i

としたとき、除算の定義は

z1 / z2 = ((a*c + b*d)/(c*c + d*d)) + ((b*c - a*d)/(c*c + d*d)) * i

です。このため実部と虚部が全て整数だった場合、整数同士の除算として / が 計算されることに注意してください。

z1 = Complex.new(4, 3)
z2 = Complex.new(2, 1)

p z1 / z2       #=> Complex(2, 0)
p 1.0 * z1 / z2 #=> Complex(2.2, 0.4)
[PARAM] other:
除算する数
[RETURN]
除算結果をComplexクラスのオブジェクトとして返します。

例:

z1 = Complex.new(4, 3)
z2 = Complex.new(2, 1)

p z1 / z2       #=> Complex(2, 0)
p 1.0 * z1 / z2 #=> Complex(2.2, 0.4)
self <=> c -> Fixnum

cとselfの絶対値absを比較した結果を返します。

self と c のComplex#absメソッドの結果を比較し、

  • self が大きい場合は正の数
  • c が大きい場合は負の数
  • 同じ場合には 0

を返します。

[PARAM] c:
比較するComplexクラスのオブジェクト

例:

z1 = Complex.new(1, 1)
z2 = Complex.new(2, -2)
p z1 <=> z2   #=> -1

[注意] このメソッドは Ruby 1.9 で廃止されます。

self <=> other -> -1 | 0 | 1 | nil

自身が other より大きい場合に 1 を、等しい場合に 0 を、小さい場合には -1 をそれぞれ返します。 自身と other が比較できない場合には nil を返します。

Numeric のサブクラスは、上の動作を満たすよう このメソッドを適切に再定義しなければなりません。

[PARAM] other:
自身と比較したい数値を指定します。
1 <=> 0   #=> 1
1 <=> 1   #=> 0
1 <=> 2   #=> -1
1 <=> "0" #=> nil
self == c -> bool

数値として等しいか判定します。

[PARAM] c:
自身と比較する数値

例:

z1 = Complex.new(1, 2)
z2 = Complex.new(1, 0)
z3 = Complex.new(0, 1)

p z1 == Complex.new(1, 2)  #=> true
p z1 == z2                 #=> false
p z2 == 1.0                #=> true
p z3 == Complex::I         #=> true
abs -> Float

自分自身の絶対値を返します。

z = a + b * i

としたとき、絶対値の定義は

sqrt(a*a + b*b)

です。 計算結果としてFloatクラスのオブジェクトが返されることに注意してください。

abs -> Numeric

自身が 0 以上ならば self を、そうでない場合は -self を返します。

abs2 -> Fixnum
abs2 -> Float

自分自身の絶対値の2乗を返します。

z = a + b * i

としたとき、Complex#abs2 の定義は

a*a + b*b

です。

angle -> Float
arg -> Float

複素数の偏角を[-π,π]の範囲で返します。

例:

p Complex.new(0, 1).arg == Math::PI/2 #=> true
p Complex.new(0, -1).arg              #=> -1.5707963267949

非正の実軸付近での挙動に注意してください。 以下の例のように虚部が 0.0 と -0.0 では値が変わります。

p Complex.new(-1, 0).arg              #=>  3.14159265358979
p Complex.new(-1, -0).arg             #=>  3.14159265358979
p Complex.new(-1, -0.0).arg           #=> -3.14159265358979

p Complex.new(0, 0.0).arg             #=>  0.0
p Complex.new(0, -0.0).arg            #=> -0.0
p Complex.new(-0.0, 0).arg            #=>  3.14159265358979
p Complex.new(-0.0, -0.0).arg         #=> -3.14159265358979
ceil -> Integer

自身と等しいかより大きな整数のうち最小のものを返します。

1.ceil        #=> 1
1.2.ceil      #=> 2
(-1.2).ceil   #=> -1
(-1.5).ceil   #=> -1

[SEE_ALSO] Numeric#floor, Numeric#round, Numeric#truncate

coerce(other) -> Array

自分自身とotherのペアの配列を生成し、生成した配列を返します。

otherが Complex のオブジェクトではないときは Complex オブジェクト化したものが配列の要素となります。

[PARAM] other:
配列の要素となるオブジェクト

例:

z1 = Complex.new(1, 2)
z2 = Complex.new(3, 4)

p z1.coerce(5)  #=>  [Complex(5, 0), Complex(1, 2)]
p z1.coerce(z2) #=>  [Complex(3, 4), Complex(1, 2)]
coerce(other) -> [Numeric]

自身と other が同じクラスになるよう、自身か other を変換し [other, self] という配列にして返します。

デフォルトでは self と other を Float に変換して [other, self] という配列にして返します。 Numeric のサブクラスは、このメソッドを適切に再定義しなければなりません。 以下は Rational の coerce のソースです。other が自身の知らない数値クラスであった場合、 super を呼んでいることに注意して下さい。

# lib/rational.rb より

def coerce(other)
  if other.kind_of?(Float)
    return other, self.to_f
  elsif other.kind_of?(Integer)
    return Rational.new!(other, 1), self
  else
    super
  end
end

数値クラスの算術演算子は通常自分と演算できないクラスをオペランドとして受け 取ると coerce を使って自分とオペランドを変換した上で演算を行います。 以下は Rational の + メソッドを一部省略したものです。 引数が自身の知らない数値クラスである場合、引数の coerce により自身を変換してから + 演算子を呼んでいます。

# lib/rational.rb より

def + (a)
  if a.kind_of?(Rational)
    # 長いので省略
  elsif a.kind_of?(Integer)
    # 長いので省略
  elsif a.kind_of?(Float)
    Float(self) + a
  else
    x, y = a.coerce(self)
    x + y
  end
end
[PARAM] other:
オペランドを数値で指定します。
conj -> Complex
conjugate -> Complex

自分の共役複素数を返します。

例:

z = Complex.new(1, 1)
p z.conjugate   #=> Complex(1, -1)
denominator -> Fixnum

自分自身の実部・虚部の分母のLCM(最小公倍数)を返します。

例:

z1 = Complex.new(1, 2)
z2 = Complex.new(Rational.new!(1, 3), Rational.new!(3, 5))

p z1.denominator  #=> 1
p z2.denominator  #=> 15
div(other) -> Integer

self を other で割った整数の商 q を返します。

ここで、商 q と余り r は、それぞれ

  • self == other * q + r

  • other > 0 のとき: 0 <= r < other
  • other < 0 のとき: other < r <= 0
  • q は整数

をみたす数です。 商に対応する余りは Numeric#modulo で求められます。 div はメソッド / の呼び出しとして定義されています。

[PARAM] other:
自身を割る数を指定します。
p 3.div(2) # => 1
p (-3).div(2) # => -2
p (-3.0).div(2) # => -2
divmod(other) -> [Numeric]

self を other で割った商 q と余り r を、 [q, r] という 2 要素の配列にして返します。 商 q は常に整数ですが、余り r は整数であるとは限りません。

ここで、商 q と余り r は、

  • self == other * q + r

  • other > 0 のとき: 0 <= r < other
  • other < 0 のとき: other < r <= 0
  • q は整数

をみたす数です。 divmod が返す商は Numeric#div と同じです。 また余りは、Numeric#modulo と同じです。 このメソッドは、メソッド / と % によって定義されています。

[PARAM] other:
自身を割る数を指定します。
11.divmod(3)         #=> [3, 2]
(11.5).divmod(3.5)   #=> [3, 1.0]
11.divmod(-3)        #=> [-4, -1]
11.divmod(3.5)       #=> [3, 0.5]
(-11).divmod(3.5)    #=> [-4, 3.0]

[SEE_ALSO] Numeric#div, Numeric#modulo

eql?(other) -> bool

自身と other のクラスが等しくかつ == メソッドで比較して等しい場合に true を返します。 そうでない場合に false を返します。

Numeric のサブクラスは、eql? で比較して等しい数値同士が同じハッシュ値を返すように hash メソッドを適切に定義する必要があります。

[PARAM] other:
自身と比較したい数値を指定します。
p 1.eql?(1)    #=> true
p 1.eql?(1.0)  #=> false
p 1 == 1.0     #=> true

[SEE_ALSO] Object#equal?, Object#eql?, Object#==, Object#===

quo(other) -> Float
fdiv(other) -> Float

self を other で割った実数の商を返します。

Numeric のサブクラスは、このメソッドを適切に再定義しなければなりません。

[PARAM] other:
自身を割る数を指定します。
p 1.quo(3)      # => 0.3333333333333333

require 'rational'
p 1.quo(3)      # => Rational(1, 3)
floor -> Integer

自身と等しいかより小さな整数のうち最大のものを返します。

1.floor        #=> 1
1.2.floor      #=> 1
(-1.2).floor   #=> -2
(-1.5).floor   #=> -2

[SEE_ALSO] Numeric#ceil, Numeric#round, Numeric#truncate

hash -> Fixnum

複素数のハッシュ値を返します。

例:

z1 = Complex.new(3.5, 1.20)
z2 = Complex.new(3.5, 1.21)

p z1.hash    #=> 1889428376
p z2.hash    #=> 425788526
imag -> Fixnum
imag -> Float
image -> Fixnum
image -> Float

虚部を返します。

inspect -> String

自分自身について "Complex(実部, 虚部)" 形式の文字列を返します。

integer? -> bool

self が整数の時、真を返します。そうでない場合に false を返します。

Numeric のサブクラスは、このメソッドを適切に再定義しなければなりません。

modulo(other) -> Numeric

self を other で割った余り r を返します。

ここで、商 q と余り r は、

  • self == other * q + r

  • other > 0 のとき 0 <= r < other
  • other < 0 のとき other < r <= 0
  • q は整数

をみたす数です。 余り r は、other と同じ符号になります。 商 q は、Numeric#div (あるいは 「/」)で求められます。 modulo はメソッド % の呼び出しとして定義されています。

[PARAM] other:
自身を割る数を指定します。
p 13.modulo(4)       #=>  1
p (11.5).modulo(3.5) #=> 1.0
p 13.modulo(-4)      #=> -3
p (-13).modulo(4)    #=>  3
p (-13).modulo(-4)   #=> -1
p (-11).modulo(3.5)  #=> 3.0

[SEE_ALSO] Numeric#divmod, Numeric#remainder

nonzero? -> self | nil

自身がゼロの時 nil を返し、非ゼロの時 self を返します。

p 10.nonzero?              #=> 10
p 0.nonzero?               #=> nil
p 0.0.nonzero?             #=> nil

require 'rational'
p Rational(0, 2).nonzero?  #=> nil
numerator -> Complex

Complex#denominator の値で実部・虚部を通分したものの分子のみを Complex で返します。

具体的な計算式は

  • 実部 = 実部の分子 * (実部、虚部の分母の最大公約数 / 実部の分母)
  • 虚部 = 虚部の分子 * (実部、虚部の分母の最大公約数 / 虚部の分母)

例:

z1 = Complex.new(1, 2)
z2 = Complex.new(Rational.new!(1, 3), Rational.new!(3, 5))

p z1.numerator
p z2.numerator
polar -> Array

複素数の極座標表示、すなわち、配列 [self.abs, self.arg] を返します。

例:

z = Complex.new(3.0, 4.0)

p z        #=> Complex(3.0, 4.0)
p z.polar  #=> [5.0, 0.927295218001612]
quo(other) -> Complex

複素数otherでの除算結果を返します。

[PARAM] other:
複素数
[RETURN]
self./(other) の結果においての実部と虚部をそれぞれRationalオブジェクト化したものを実部・虚部とするComplexクラスのオブジェクトを返します。
注意

Complex#/ との違いは実部と虚部が全て整数だった場合に分数(Rationalクラスのオブジェクト)として計算されます。

例:

z1 = Complex.new(6, 4)
z2 = Complex.new(2, 2)

p z1.quo(2)   #=> Complex(Rational(3, 1), Rational(2, 1))
p z1.quo(z2)  #=> Complex(Rational(5, 2), Rational(-1, 2))
real -> Fixnum
real -> Float

実部を返します。

remainder(other) -> Numeric

self を other で割った余り r を返します。

ここで、商 q と余り r は、

  • self == other * q + r

  • self > 0 のとき 0 <= r < |other|
  • self < 0 のとき -|other| < r <= 0
  • q は整数

をみたす数です。r の符号は self と同じになります。 商 q を直接返すメソッドはありません。self.quo(other).truncate がそれに相当します。

[PARAM] other:
自身を割る数を指定します。
p 13.remainder(4)       #=>  1
p (11.5).remainder(3.5) #=> 1.0
p 13.remainder(-4)      #=>  1
p (-13).remainder(4)    #=> -1
p (-13).remainder(-4)   #=> -1
p (-11).remainder(3.5)  #=> -0.5

[SEE_ALSO] Numeric#divmod, Numeric#modulo

round -> Integer

自身ともっとも近い整数を返します。

中央値 0.5, -0.5 はそれぞれ 1,-1 に切り上げされます。いわゆる四捨五入ですが、偶数丸めではありません。

1.round        #=> 1
1.2.round      #=> 1
(-1.2).round   #=> -1
(-1.5).round   #=> -2

[SEE_ALSO] Numeric#ceil, Numeric#floor, Numeric#truncate

step(limit, step = 1) {|n| ... } -> self
step(limit, step = 1) -> Enumerable::Enumerator

self からはじめ step を足しながら limit を越える 前までブロックを繰り返します。step は負の数も指定できます。また、limit や step には Float なども 指定できます。

[PARAM] limit:
ループの上限あるいは下限を数値で指定します。step に負の数が指定された場合は、 下限として解釈されます。
[PARAM] step:
各ステップの大きさを数値で指定します。負の数を指定することもできます。
[EXCEPTION] ArgumentError:
step に 0 を指定した場合に発生します。
2.step(5){|n| p n}
2
3
4
5

1.1.step(1.5, 0.1) {|n| p n}
=> 1.1
   1.2
   1.3
   1.4
   1.5

10.step(6, -1){|n| p n}
10
9
8
7
6

注:浮動小数点数の 0.1 は 2進数では正確な表現ができない(2進数で 0.1は 0.00011001100....となる)ので、以下のようなループでは誤差が 生じて意図した回数ループしないことがある。step はこの誤差を考慮し て実装されている。

i = 1.1
while i <= 1.5
  p i
  i += 0.1
end
=> 1.1
   1.2
   1.3
   1.4   <- 1.5 が表示されない

[SEE_ALSO] Integer#downto

to_int -> Integer

self.to_i と同じです。

to_s -> String

自分自身について "実部 + 虚部i" 形式の文字列を返します。

truncate -> Integer

自身と 0 との間にある整数で、自身にもっとも近い整数を返します。

1.truncate        #=> 1
1.2.truncate      #=> 1
(-1.2).truncate   #=> -1
(-1.5).truncate   #=> -1

[SEE_ALSO] Numeric#ceil, Numeric#floor, Numeric#round

zero? -> bool

自身がゼロの時、真を返します。そうでない場合は false を返します。

p 10.zero?              #=> false
p 0.zero?               #=> true
p 0.0.zero?             #=> true

定数

I -> Complex

虚数単位です。

[注意] Complex::I は Complex.new(0, 1) で生成されるオブジェクトと同じものです。

class Complex