正木です。

1.8.0 では却下されてしまいましたが、改めて
Integer#gcd,bitsize,isqrt,iroot の組込みを要望します。

size よりは bitsize(bit length) の方が数学的には意味があります。

私が試しに使っている gcd,iroot の code を付記します。
bitsize,isqrt の code は [ruby-math:00907] にあります。
ついでに bitsize の使用例として Bignum#to_f も付けておきます。

-------

static int
int_gcd(i, j)
    int i, j;
{
    if (i < 0) i = -i;
    if (j < 0) j = -j;
    if (j == 0) return i;
    return int_gcd(j, i % j);
}

static VALUE
rb_gcd(x, y)
    VALUE x, y;
{
    VALUE z;

    if (FIXNUM_P(x) && FIXNUM_P(y))
        return INT2FIX(int_gcd(FIX2INT(x), FIX2INT(y)));
    if (FIXNUM_P(y) && FIX2INT(y) == 0) return rb_big_abs(x);
    if (FIXNUM_P(y)) return rb_gcd(y, rb_big_modulo(x, y));
    y = rb_big_abs(y);
    while (!FIXNUM_P(y)) {
        z = rb_big_modulo(x, y);
	x = y;
	y = z;
    }
    return rb_gcd(x, y);
}

static int
int_pow(i, m)
    int i, m;
{
    if (m == 0) return 1;
    return i * int_pow(i, m - 1);
}

static int
int_root(i, m)
    int i, m;
{
    int j, k;
    if (i < 0) rb_raise(rb_eTypeError,"argument is negative");
    if (i == 0) return 0;
    j = int_root(i >> m, m) << 1;
    k = j | 1;
    if (int_pow(k,m) > i) return j;
    return k;
}

static VALUE
rb_int_root(x, m)
    VALUE x, m;
{
    int j, k;
    VALUE y, n, n1, pow;
    if (FIXNUM_P(x) && FIXNUM_P(m))
      return INT2FIX(int_root(FIX2INT(x), FIX2INT(m))); 
    if (!RBIGNUM(x)->sign)  rb_raise(rb_eTypeError,"argument is negative");
    y = rb_int_root(rb_big_rshift(x,INT2FIX(2)), m);
    if (FIXNUM_P(y)){
	j = FIX2INT(y) << 1;
	k = j | 1;
	n = INT2NUM(j);
	n1 = INT2NUM(k);
	pow = rb_big_pow(rb_int2big(k), m);
    }
    else{
        n = rb_big_lshift(y, INT2FIX(1));
	n1 = rb_big_or(n, INT2FIX(1));
	pow = rb_big_pow(n1, m);
    }
    if (FIX2INT(rb_big_cmp(x, pow)) == -1) return n;
    return n1;
}

static VALUE
rb_big_to_f(x)
    VALUE x;
{
    int m, l, n;
    VALUE a, b, sign;
    sign = RBIGNUM(x)->sign;
    m = FIX2INT(rb_const_get(rb_cFloat,rb_intern("MANT_DIG")));
    l = FIX2INT(rb_bitsize(rb_big_abs(x)));
    n = l - m;
    if (n <= 0){
	return rb_float_new(ldexp(rb_big2dbl(x), 0));
    }
    else{
        b = rb_big_aref(rb_big_abs(x), INT2FIX(n - 1));
	if (!sign) b = INT2FIX(-FIX2INT(b));
	a = rb_big_plus(rb_big_rshift(x,INT2FIX(n)), b);
	return rb_float_new(ldexp(rb_big2dbl(a), n));
  }
}

--------