正木です。

|近岡です。


|上の不等式は、もう少し制限を強めることができます。
|
|  | x - sqrt(a)| ≦ 2 ** n  …(米)

最初の証明ではこうしていました。
直観的にはこれで正しいはずだったんですが

|  s≦sqrt(b)<sqrt(b+1)≦s+1

に気がつかなくて簡単な証明が思い付きませんでした。
ありがとうございました。
証明の最初に付けた n > 1 の制限も不必要ですね。

|この証明を検討してみると、
|[ruby-math:00943]のプログラムisqrt_iniの
|  >     j = (bitlength - 1) >> 2
|
|  >     j = (bitlength + 1) >> 2
|でも、構わないんじゃないかと思うようになりました。

ということは code をできるだけ短くしたい時には


  def isqrt_ini
    return 0 if self == 0
    return 1 if self < 4
    j = (bitlength + 1) >> 2
    x = (self >> (j << 1)).isqrt_ini
    ((x<<j) + (self>>j).div(x)) >> 1
  end

  def isqrt
    raise "argument is negative" if self < 0
    x = isqrt_ini
    x -= 1 if x * x > self
    x
  end

でも良いということですね。
ただ速度的にはどうなんでしょうか? >> 原さん
私のところでは殆んど差がわかりません。


ところで、こういう同じような再帰定義を色々書きかえて試して
いるときに、定義している method 自身を呼ぶ記法があると便利
だと思うんですが、どうでしょうか。

例えば上記の例でいえば

    x = (self >> (j << 1)).isqrt_ini

のかわりに

    x = (self >> (j << 1)).this_method

と書けたらということですが。

私の Function(Sequence) ではこれができるので、普通の method
で再帰を書くたびに不便を感じています。

例えば

Factorial = Sequence([1]){"|n| n * Factorial[n-1]"}

の代わりに

Factorial = Sequence([1]){"|n|  n * self[n-1]"}

と書くことができます。
このままだと大きな数で StackError を起こすので FactorialA 
とか色々名前を変えて対策を試す訳ですがその際に self の部分を
書き換える必要がありません。