methods=Integer/s.from_prime_division.mathn,Integer/s.gcd2.mathn,Integer/s.prime_division.mathn,Fixnum/i.=2f.mathn,Bignum/i.=2f.mathn,Rational/i.=2a=2a.mathn,Rational/i.power2.mathn,Rational/i.inspect.mathn,Math/m.sqrt.mathn,Math/m.rsqrt.mathn,Rational/c.Unify.mathn,Complex/c.Unify.mathn
sublibraries=
requires=matrix,rational,complex
classes=Prime
is_sublibrary=false

[[lib:rational]] と [[lib:complex]] をシームレスに利用するようにするライブラリです。

Integer や Float に比べ Rational は誤差無しで表現できる範囲が大きいため、
数値の演算において Rational をシームレスに利用したいことがあります。

例:

  1/2 -> Rational(1,2)
  2 * Rational(1,2) -> 1 (Fixnum)

また、Complex も演算結果の表現範囲を広げるのに利用できます。

例:

  Complex(0,-1)**2 -> -1 (Fixnum)
  Complex(1,-1) - Complex(0,-1) -> 1 (Fixnum)

require 'mathn' すると上の様な動作を行なうようになります。
つまり、Rational (や Rationalを含む Complex) と Integer (Fixnum と Bignum) との間の関係を、
ちょうど Bignum と Fixnum との間のような関係にします。
具体的には、Rational のインスタンスが整数ならば、それは自動的に Integer
(Fixnum または Bignum)となり、また、整数/整数の結果、
割り切れない時は Rational が返るようになります。
後者は、整数のメソッド「/」が整商(.div)でなく、
商(.quo)を返すようになる、ということを意味します。

なお、この挙動は、グローバルに影響を与えます。
つまり、(Ruby で書かれた)汎用ライブラリを require していた場合、
ライブラリ中の動作も、上のように変更されることになります。
他人の書いたライブラリを使う時は、ご注意下さい
(逆に、汎用ライブラリの作者の方々は、この [[lib:mathn]] が require
される可能性を留意して書いて下されば、親切だと思います)。

=== 参考

  * [[unknown:ruby-list:1174]]
