正木です。 |近岡です。 |上の不等式は、もう少し制限を強めることができます。 | | | 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 の部分を 書き換える必要がありません。