正木です。

Rationalを組み込みにするという話は当分望み薄らしいので、Rational の
高速化計画の手始めとして、とりあえず gcd の高速化に挑戦してみました。
Ruby のおかげで最近殆んど C を使わなくなっていたので、C の文法もあやしい
位で大変でしたが、README.EXT.ja をたよりに一応何とか動くものを作ってみま
した。これで 10倍程度早くなるようです。
2行目の
#include "/usr/local/ruby-1.6.5/bignum.c" 
は、これを書かないと
ruby: error in loading shared libraries: ./gcd.so: undefined symbol: rb_big_mo
dulo
という error がでるので仕方なく付けてありますが、本当はどうすべきもので
しょうか?
他にもおかしな所があったら指摘して下さい。

---- gcd.c ----

#include "ruby.h"
#include "/usr/local/ruby-1.6.5/bignum.c"

static VALUE
gcd(self, m, n)
    VALUE self;
    VALUE m;
    VALUE n;
{
    int i,j;
    if(FIXNUM_P(n) && FIX2INT(n)==0) return m;
    if(FIXNUM_P(m) && FIX2INT(m)==0) return n;
    switch (TYPE(m)) {
    case T_FIXNUM:
      i = FIX2INT(m);
      switch (TYPE(n)) {
      case T_FIXNUM:
	j = FIX2INT(n);
	return gcd(self,n,INT2FIX(i%j));
	break;
      case T_BIGNUM:
	return gcd(self,m,rb_big_modulo(n, m));
	break;
      }
      break;
    case T_BIGNUM:
	return gcd(self,n,rb_big_modulo(m, n));
    break;
    }
}

Init_gcd()
{
    VALUE mGcd = rb_define_module("Gcd");
    rb_define_module_function(mGcd, "gcd", gcd, 2);
}
-----

require "gcd"
include Gcd
class Integer
  def gcd(n)
    Gcd.gcd(abs,n.abs)
  end
end
----