From: Yukihiro Matsumoto Date: 2007-08-07T01:08:53+09:00 Subject: [ruby-dev:31353] Re: Bignum#to_s の Karatsuba 基数変換による高速化 まつもと ゆきひろです In message "Re: [ruby-dev:31352] Re: Bignum#to_s の Karatsuba 基数変換による高速化" on Tue, 7 Aug 2007 00:50:27 +0900, "Kenta Murata" writes: |[ruby-dev:31323] で提出したパッチに対して,テーブル周辺の処理を変更した |改良版をこしらえました.一つ目の添付パッチがそれです.この変更で, |いくらか高速化できましたので,以下で報告します. ありがとうございます。パッチはどうやらちょっと古いtrunkがベー スになっているようですが、すでに前回のパッチが取り込まれてい ますから、現在のtrunkとの差分を提出していただけませんか? |一つ目の添付のパッチを当てたソースでこの症状が出る部分は,1101行目にある |bigdivmod(x, b, &q, &r) という呼び出しです.ここで,b が正規化されていない |ために症状が発生したわけですが,b は rb_big_pow か bigsqr のどちらかによって |生成されるオブジェクトです.両者のコードを見ると,bigsqr で呼び出している |rb_big_mul0 の中で作られる Bignum が bigtrunc もしくは bignorm されずに |戻されているので,これが原因ではないかと思います. | |もっとも,bigdivmod を非正規化オブジェクトでも正しく動くように修正することでも対応 |出来ると思いますが,bigsqr の中で rb_big_mul0 を呼び出しているところに bigtrunc |を被せるだけで修正できるので,bigsqr をいじるほうが簡単だと思います |(もしくは rb_big_mul0 で z を bigtrunc する). | |どちらを行うべきかは Bignum のライブラリとしての仕様の問題だと思うので, |最終的にはまつもとさんの判断にお任せします. とりあえずbigdivmodを非正規化オブジェクトでも動くようにする意 図はないので、bigsqrの修正で対応するのがよいのではないでしょ うか。こちらもパッチを作っていただけませんか?