library mathn

要約

RationalComplex をよりシームレスに利用できるようにするライブラリです。数値ライブラリの挙動をグローバルに変更します。

なお、このライブラリは非推奨(deprecated)です。

利用局面

Integer や Float に比べ Rational は誤差無しで表現できる範囲が大きいため、数値の演算において Rational をシームレスに利用したいことがあります。そこで mathn ライブラリは、各数値クラスの間の関係を自動的に変換される関係にします。

整数と有理数の相互変換

具体的には、Rational のインスタンスが整数ならば、それは自動的に Integer となり、また、整数/整数の結果、割り切れない時は 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

実数と複素数の相互変換

同様にして 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 メソッド を用いると良いでしょう。

Prime

クラス Prime はRuby 1.8までは mathn で定義されていました。現在はライブラリ prime に移動しています。互換性のため mathn を読み込むと自動的に prime も Kernel.#require されます。

同時にrequireされるライブラリ

cmath

複素数演算をサポートするライブラリです。

forwardable

クラスやオブジェクトに、メソッドの委譲機能を追加するためのライブラリです。

matrix

行列と数ベクトルを扱うためのライブラリです。

prime

素数や素因数分解を扱うライブラリです。

singleton

Singleton パターンを扱うためのライブラリです。

追加・再定義されるメソッド

Integer#/ Math.#rsqrt Math.#sqrt Rational#**