[#954] Rational — keiju@... (Keiju ISHITSUKA)

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

23 messages 1996/10/30
[#955] Re: Rational — matz@... (Yukihiro Matsumoto) 1996/10/30

まつもと ゆきひろです.

[#968] Re: Rational 1996/10/31

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

[ruby-list:956] Re: Rational[coerce(Re: ruby 0.99.3-961030 available) ]

From: Shin-ichiro Hara <sinara@...>
Date: 1996-10-30 09:36:05 UTC
List: ruby-list #956
原です。

> まつもと ゆきひろです.

> 基本的にはそういうことです.つまりrubyの数値型システム(現状
> ではFixnum, Bignum, Float)に新しい数値型を追加した時の型変換
> の仕組みの話をしていたのでした.

そうでしたか。

> で,有理数クラスはだいたいできてるみたいです.スクリプト言語
> で有理数をだれが使うかと言うことはとりあえず置いておいて,練

おお!有理数を誰が使うって大勢が使いますよ!そもそも私が初めて
ruby の class を使ったのは、そして感激したのは、有理数のクラス
を作り、さらに複素数のクラスを作って、たんに並べただけで、自動
的に有理数成分の複素数が出来てしまったということです。

ちょっと長いけど日経 MIX に書いたのを引用すると、

---------^ RationalComplex_test1.rb
#!/usr/local/bin/ruby
class Complex
  def initialize(x = 0, y = 0)
    @re, @im = x, y
  end
  attr("re", 1); attr("im", 1)
  def +(x); Complex.new(@re + x.re, im + x.im); end
  def -(x); Complex.new(@re - x.re, im - x.im); end
  def *(x)
    Complex.new(@re*x.re - @im*x.im, @re*x.im + @im*x.re)
  end
  def to_s; "#@re+#{@im}i"; end
end

class Rational
  def initialize(x = 0, y = 1)
    @nu, @de = x, y
  end
  attr("nu", 1); attr("de", 1)
  def gcd(x, y)
    if y == 0 then x else gcd(y, x % y) end
  end
  def simplify
    g = gcd(@nu, @de)
    @nu /= g; @de /= g;
    self
  end
  def +(x)
    Rational.new(@nu*x.de + @de*x.nu, @de*x.de ).simplify
  end
  def -(x)
    Rational.new(@nu*x.de - @de*x.nu, @de*x.de ).simplify
  end
  def *(x)
    Rational.new(@nu*x.nu, @de*x.de).simplify
  end
  def /(x)
    Rational.new(@nu*x.de, @de*x.nu).simplify
  end
  def to_s; "#@nu/#@de"; end
end

a = Rational.new(5,2)
b = Rational.new(113,355)
z = Complex.new(a, b)
d = Rational.new(31,21)
e = Rational.new(17,16)
w = Complex.new(d, e)

print "#{z} + #{w} = #{z+w}\n"
print "(#{z})*(#{w}) = #{z*w}\n"
---------$ RationalComplex.rb

> 5/2+113/355i + 31/21+17/16i = 167/42+7843/5680i
> (5/2+113/355i)*(31/21+17/16i) = 399859/119280+745771/238560i


雰囲気としては、群・環・体などの代数的「構造」は module を使って、
実数や有理数などの代数的「実体」は class を使って実現できる、とい
う感じでしょうか。#必ずしもそれだけではないか。

この「たんに並べただけ」でこれだけ面白いのだから、もし、

class Rational < Numeric 

なんて継承が合理的な形で出来る様になるならばますます素晴らしいですね。


                           Shin-ichro Hara(Nagaoka Univ.of Tech.)

In This Thread

Prev Next