library mathn
要約
rational と complex をシームレスに利用できるようにするライブラリです。数値ライブラリの挙動をグローバルに変更します。
- 整数の除算が割り切れない場合、 Rational オブジェクトを返すようになります。
- 複素数や有理数の演算結果が実数や整数に収まる場合、 Float オブジェクトや Integer オブジェクトを返します。
- Math モジュールの数学関数の定義域と終域を、実数のみから複素数へと拡大します。
利用局面
Integer や Float に比べ Rational は誤差無しで表現できる範囲が大きいため、 数値の演算において Rational をシームレスに利用したいことがあります。 そこで mathn ライブラリは、各数値クラスの間の関係を ちょうど Bignum と Fixnum とのような自動的に変換される関係にします。
整数と有理数の相互変換
具体的には、Rational のインスタンスが整数ならば、それは自動的に Integer (Fixnum または Bignum)となり、また、整数/整数の結果、 割り切れない時は Rational が返るようになります。後者は、整数のメソッド「/」が整商(.div)でなく、商(.quo)を返すようになる、ということを意味します。
例:
1/2 #=> 0 2 * Rational(1,2) #=> Rational(1,1) require 'mathn' 1/2 #=> Rational(1,2) 2 * Rational(1,2) #=> 1 (Fixnum)
実数と複素数の相互変換
同様にして Complex のインスタンスの虚部が 0 ならば、実部として含まれていた Rational, Float, または Integer オブジェクトに変換されます。
一方、数学演算の定義域・終域を複素数に拡大するので、 mathn を利用しない場合には範囲エラー例外を発生していたような演算が Complex オブジェクトを返す場合もあります。
例:
Complex(0,-1)**2 #=> Complex(-1,0) Math.sqrt(-1) #=> NaN require 'mathn' Complex(0,-1)**2 #=> -1 Math.sqrt(-1) #=> Complex(0,1)
使用上の注意
なお、この挙動は、グローバルに影響を与えます。 つまり、(Ruby で書かれた)汎用ライブラリを require していた場合、 ライブラリ中の動作も、上のように変更されることになります。 他人の書いたライブラリを使う時は、ご注意下さい
逆に、汎用ライブラリの作者の方々は、この mathn が require される可能性を留意して書いて下されば親切だと思います。 整数同士で整除を意図するならば / メソッド ではなく div メソッド を用いると良いでしょう。
クラス
class Prime |
同時にrequireされるライブラリ
complex | 複素数を扱うためのライブラリです。 |
matrix | 行列と数ベクトルを扱うためのライブラリです。 |
rational | 有理数を扱うためのライブラリです。 |
追加・再定義されるメソッド
Bignum#/
Complex::Unify
Fixnum#/
Integer#gcd2
Integer#prime_division
Integer.from_prime_division
Math.#rsqrt
Math.#sqrt
Rational#**
Rational#inspect
Rational#power2
Rational::Unify