けいじゅ@SHLジャパンです. 

またまた, 1週間ほど外に出ていました. rubyのメイルがいっぱい溜っていて
読むのが大変です(^^;;;

RationalとComplexができましたのでリリースします.

rational.rb -- Rational関係のファイル
complex.rb  -- Complex関係のファイル
mathn.rb    -- 数に関してより頑張っている関数群

1. rational.rb

分数関係の計算を主にサポートしています.

定義されているものは以下の通りです.

関数
  Rational(a, b) --> a/b

クラスRational
  Rational#+
  Rational#-
  Rational#*
  Rational#/
  Rational#**
  Rational#%
  Rational#divmod
  Rational#abs
  Rational#<=>
  Rational#to_i
  Rational#to_f
  Rational#to_s

クラスInteger
  Integer#gcd
  Integer#lcm
  Integer#gcdlcm
  Integer#to_r

クラスFixnum
  Fixnum#**

クラスBignum
  Bignum#**

Fixnum#** と Bignum#**は 指数がマイナスの時の対応で再定義しています.
オリジナル**は power!にエイリアスされます.

2. Complex.rb

分数関係の計算を主にサポートしています. rational.rbとは独立に動作しま
す(インクルードしていればそれなりに動作します).

定義されているものは以下の通りです.

  Complex(x, y) --> x + yi
  y.im          --> 0 + yi

  Complex::I      -- クラス定数 i(sqrt(-1))です.
  Complex::polar  -- 極座標から複素数を生成します.
  Complex#+
  Complex#-
  Complex#*
  Complex#/
  Complex#**
  Complex#%
  Complex#divmod
  Complex#abs
  Complex#abs2        -- 絶対値の2乗を帰します.
  Complex#arg         -- 極座標の角度
  Complex#polar       -- 極座標系での原点からの長さ
  Complex#conjugate   -- 複素共役.
  Complex#<=>
  Complex#==
  Complex#to_i
  Complex#to_f
  Complex#to_r
  Complex#to_s

以下は, Complexとプロトコルを一致させるために追加しました.
  Numeric#im          
  Numeric#arg
  Numeric#polar
  Numeric#conjugate

複素数に対応しています. 逆関数はいい加減です(主値をとっていない??). オ
リジナルの関数は, Math.sqrt!の様になっています.
  Math.sqrt           
  Math.exp
  Math.cos
  Math.sin
  Math.tan
  Math.log
  Math.log10
  Math.atan

3. Mathn.rb

Ratinal.rb, Complex.rb をインクルードしただけでは:

Rational(1)/Rational(2) -> 1/2(Rational)

となるのですが,

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

となります. 1/2が0になるのは, rubyの動作を根本的に変えてしまうことにな
りかねないので, Rational.rbをインクルードしただけでは, その挙動を変更
しないようになっています.

後者は, 2*Rational(1,2) が 1(Fixnum) となると,

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

となり少々困ります. 

ただ, 本来 Floatととは異なり, Ratinalは誤差がないので, 

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

となってほしいこともあるかと思います. つまり, rubyのBignumとFixnumの様
な関係ですね. rubyではこれらの型変換は勝手に行なっています. 

mathn.rbをインクルードするとこの様な動作を行ないます. つまり, Ratinal
とComplexをBignumとFixnumと同等な関係にします.

また, **とsqrtについてですが,
現状では,

Math.sqrt(4) -> 2(Float)
Math.sqrt(Rational(1,4)) -> 0.5(Float)

ですが, Mathn.rbをインクルードすると

Math.sqrt(4) -> 2(Fixnum)
Math.sqrt(1/4) -> 1/2(Rational)

の様に計算する様に関数を再定義します.

定義されているメソッドは以下の通りです.

  Intefer#prime_division
      素因数分解を行ないます. 例:

        12 -> [[2, 2], [3, 1]]
      
  Integer::from_prime_division 
      素因数分解された結果から, 元の数を帰します. 例:
        
        [[2, 2], [3, 1]] -> 12
        
  Intefer#gcd2
      最大公約数を帰します. 素因数分解を用いています.

  Prime:    素数を帰すストリームです. エラトステネスのふるいを用いてい
            ます.
  Prime#succ  -- 次の素数を帰します.
  Prime#each  -- 素数を次々と帰すイテレータです.

  Rational#**
    ベキを帰します. RationalになるようであればRationalで帰します.
    ただ, 現行は純代数的方法(素因数分解を用いている)いてとても遅いので, 
    そのうち改良したいです.

  Rational#power2
    作りかけです(^^;; 気にしないで下さい.

  Math.sqrt(a)
    これはなかなかの傑作だと思っています. sqrtとそのサブルーチンの
    rsqrtはどういう動作しているか理解するのがむずかしいに違いありませ
    ん(^^;;;

この他にaliasがかなり行なわれています.

-- ここから.
begin 644 mathn.rb.tgz
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
M[6JWG,X2W)62BENE]XFL'6B,8+<Q / H]FC.#]C+$[!':8,?S<%,"?]?*+]6?[
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
=JE.=ZE2G.M6I3G6J4YWJ5*<_7_H?,VN1RP!X   Z
 
end
__
.........................................石塚 圭樹@SHLジャパン(株)...
------------>アドレス変わりました!! e-mail: keiju / shljapan.co.jp <----