blog.waterlow.work

Ruby, Rails, js, etc...

【Ruby】Gold試験対策-ライブラリ

Rubyには数学的な計算をするために便利なライブラリが揃っている。

Complex、Rational

複素数体有理数体を表す。演算の時は集合として大きな方に合わせる。たとえばこんな感じ。

a = Rational(1,2) + 0.1
p a.class #=> Float
a += Complex(1,1)
p a.class #=> Complex

またそれぞれに覚えないといけないメソッドがある。
Rationalの分母分子を返すメソッド、商と余りを返すメソッド。Complexの実部虚部を返すメソッド、極座標のrと偏角を返すメソッド。

p Rational(1,3).numerator
p Rational(1,3).denominator
p Rational(1,3).divmod(Rational(1,4))
p Complex(1, -1).real
p Complex(1, -1).imag
p Complex(1, -1).abs
p Complex(1, -1).arg
p Complex(1, -1).polar
# 1
# 3
# [1, (1/12)]
# 1
# -1
# 1.4142135623730951
# -0.7853981633974483
# [1.4142135623730951, -0.7853981633974483]

バージョン違いかと思いますが。本にはimagではなくimageと書いてありました。
あと、divmodの計算結果と演算子/の結果が違います。(ruby2.0.0p451使用)

p Rational(1,3).divmod(Rational(1,4))
p Rational(1,3) / Rational(1,4)
p Rational(1,3) % Rational(1,4)
# [1, (1/12)]
# (4/3)
# (1/12)

divmodだと商は整数に限定されているみたいです。普通に有理数の範囲で割り算してもあまりは絶対出ないので、演算子%の結果がいまいちですね。

truncateはRationalの絶対値が最小になるように切り捨てを行います。

p Rational(4,-3).truncate #=> -1
p Rational(4,3).truncate #=> 1