近岡です。

>>|私も最初にテストするときは Integer に定義したりしますが、組み込み
>>|にするなら Fixnum と Bignum に定義することになるでしょうね。なぜ
>>|ならメソッド探索順が Fixnum -> Integer, Bignum -> Integer ですし、
>>|Integer での定義が場合分けの形になっているなら、もともとシステム
>>|が分けてくれていたものを Integer で集めてからまた分けたことになっ
>>|てしまいますから。
>>
>>
>>Fixnum と Bignum の区別は Ruby の内部事情ですから、出来る限り
>>user に意識させるべきではないと考えます。
>
>同意します。変ですねえ。どこから意見が分かれているのでしょう。(^^;
>
>>私は整数演算の再定義をする際、非常に苦労しました。
>>Integer に再定義して、それが反映されない理由が分からず悩んだことも
>>あります。
>
>今は組み込みにする話をしているのでから、数値関係の階層はすべて
>熟知していると仮定すべき(実際にそうでなくても)でしょう。組み
>込みのメソッドを書く人はユーザーではありませんよね。
>
>>C 言語の場合、関数が Fixnum と Bignum 共通に使えるように定義されて
>>いないと、その場合分けに苦労することになります。結局その繁雑さに耐
>>え切れず rb_funcall を多用することになりますが、そうすると折角 C 
>>で書く利点があまり生かされません。
>
>rb_funcall ばかりをしていたら C で書く意味がないのは確かで、私はむし
>ろ Fixnum と Bignum とで分けて実装した方が rb_funcall は減る気がしま
>す。
>
>Integer が Fixnum と Bignum に分かれているのは、色んな理由があると思
>いますが、とにかく分かれている現状を前提とするなら、分けて実装するの
>はあたりまえだと思うんだけどな。
>

isqrtの組込みに関して意見を述べさせてください。
組込みを前提とした場合、私の意見は、次の2点です。

1.FIXNUM用とBIGNUM用の2つに分ける

2a.FIXNUM用は通常のNewton法にする。
2b.BIGNUM用は改良型の”正木法”にする。
  [ruby-math:00943][ruby-math:00954]の
  再帰呼び出しをするタイプ

理由は、

A.判りやすく簡潔なコードにできる。
B.速い。

  例えば、巨大な整数の平方根を計算したときに、
 値が返らないという状態が何分も続き、
 制御が組込み関数の内部に移ったまま
 帰らないというのは、好ましくありません。
 その点、正木法ならそんな心配はありません。

  BIGNUMの場合、正木法([ruby-math:00943]のもの)
 なら簡潔で判りやすいものになります。
 あちらこちらでビットずらしが必要になりますが、
 その分だけ高速化が期待できます。

  ただ、値がFIXNUMの範囲内におさまる場合、
 正木法のビットずらしなどは高速化の役に立ちません。
 一方、通常のNewton法は、FIXNUMの範囲に限れば、
 C言語の標準の機能だけで組むことができ、
 簡潔で判りやすいものができます。

C.再帰呼出しの回数のオーダーはO(log(log(x)))程度。

  スタックの消費などが心配ですが、
 再帰呼出しの回数は、さほど多くはありません。
 また、[ruby-math:00965]にあるように
 正木法を再帰呼出し無しにすると、
 判りづらくメンテナンスが大変です。

D.Integer クラスの多くのメゾットが、
  FIXNUM用とBIGNUMに分けて実装されている。

  FIXNUM用とBIGNUMに分けて実装すると、
 メゾットの再定義の際に不便であるのは、
 isqrtだけに限りません。

以上、こんなところでしょうか。