[#32434] signature of exit() on C++ — "KISHIMOTO, Makoto" <ksmakoto@...4u.or.jp>
きしもとです
なかだです。
> > /usr/local/include/ruby-1.9/i686-linux/ruby/config.h
[#32447] ruby 1.9 trunk NKF and KCONV Encoding:ASCII-8BIT — WATANABE Tetsuya <Tetsuya.WATANABE@...>
渡辺哲也です。
[#32448] SEGV on "abcd\xf0".force_encoding("utf-8").reverse — Tanaka Akira <akr@...>
以下のようにすると SEGV します。
[#32452] `split': negative string size (or size too big) (ArgumentError) — Tanaka Akira <akr@...>
"あいうえお".force_encoding("euc-jp").split(//) と (EUC-JP
[#32462] SEGV by test/ruby/test_fiber.rb — Tanaka Akira <akr@...>
test/ruby/test_fiber.rb ですが、以下のように insnhelper.ci
In article <87fxyhpw0t.fsf@fsij.org>,
[#32468] Iconv.list patch for NetBSD/Citrus — "NARUSE, Yui" <naruse@...>
成瀬です。
[#32473] about to_path and to_open — "Yusuke ENDOH" <mame@...>
遠藤と申します。
[#32498] Re: [ruby-cvs:21399] Ruby:r14162 (trunk): * parse.y (expr): redefinable not (!) operator. — SASADA Koichi <ko1@...>
ささだです.
まつもと ゆきひろです
[#32512] Re: [ruby-cvs:21409] Ruby:r14172 (trunk): * transcode.c: new file to provide encoding conversion features. — Nobuyoshi Nakada <nobu@...>
なかだです。
中田さん、こんにちは。
成瀬です。
中田さん、こんにちは。
なかだです。
まつもと ゆきひろです
At 15:33 07/12/11, Yukihiro Matsumoto wrote:
まつもと ゆきひろです
なかだです。
まつもと ゆきひろです
成瀬です。
At Wed, 12 Dec 2007 02:49:09 +0900,
At 02:55 07/12/12, SATOH Fumiyasu wrote:
At 21:50 07/12/10, Nobuyoshi Nakada wrote:
松本さん、中田さん、こんにちは。
なかだです。
[#32518] bug in Array#slice! — Satoshi Nakagawa <snakagawa@...>
中川といいます。
At Mon, 10 Dec 2007 19:27:17 +0900,
[#32550] Binary String — Hidetoshi NAGAI <nagai@...>
永井@知能.九工大です.
まつもと ゆきひろです
永井@知能.九工大です.
まつもと ゆきひろです
永井@知能.九工大です.
なかだです。
永井@知能.九工大です.
In article <20080111.171950.78716471.nagai@ai.kyutech.ac.jp>,
永井@知能.九工大です.
In article <20080111.184442.74744388.nagai@ai.kyutech.ac.jp>,
まつもと ゆきひろです
永井@知能.九工大です.
In article <20080112.004750.74741782.nagai@ai.kyutech.ac.jp>,
永井@知能.九工大です.
In article <20080112.100830.112615025.nagai@ai.kyutech.ac.jp>,
永井@知能.九工大です.
成瀬です。
永井@知能.九工大です.
成瀬です。
永井@知能.九工大です.
成瀬です。
永井@知能.九工大です.
成瀬です。
遊楽庵です。
成瀬です。
まつもと ゆきひろです
In article <E1JFVE8-0000Co-QL@x61.netlab.jp>,
成瀬です。
In article <47975933.8010907@airemix.com>,
まつもと ゆきひろです
こんにちは、なかむら(う)です。
まつもと ゆきひろです
こんにちは、なかむら(う)です。
まつもと ゆきひろです
こんにちは、なかむら(う)です。
まつもと ゆきひろです
西山和広です。
まつもと ゆきひろです
In article <20080115.024201.41653719.nagai@ai.kyutech.ac.jp>,
永井@知能.九工大です.
In article <20080116.102057.41656941.nagai@ai.kyutech.ac.jp>,
永井@知能.九工大です.
In article <20080117.233832.74721189.nagai@ai.kyutech.ac.jp>,
Gimiteといいます。
成瀬です。
Gimiteです。
永井@知能.九工大です.
まつもと ゆきひろです
永井@知能.九工大です.
まつもと ゆきひろです
永井@知能.九工大です.
m17n には近づかないようにしているささだです。
成瀬です。
遊楽庵です。
成瀬です。
まつもと ゆきひろです
成瀬です。
まつもと ゆきひろです
永井@知能.九工大です.
成瀬です。
永井@知能.九工大です.
成瀬です。
永井@知能.九工大です.
長文失礼します。
まつもと ゆきひろです
From: Yukihiro Matsumoto <matz@ruby-lang.org>
まつもと ゆきひろです
成瀬です。
At 04:55 08/01/20, NARUSE, Yui wrote:
成瀬です。
成瀬です。
永井@知能.九工大です.
成瀬です。
遊楽庵と申します。
永井@知能.九工大です.
[#32556] default completion for irb1.9 — Tadashi Saito <shiba@...2.accsnet.ne.jp>
斎藤と申します。
[#32563] transcoder loading — Nobuyoshi Nakada <nobu@...>
なかだです。
[#32567] [nil, [...]] — Tanaka Akira <akr@...>
以下のようにすると作っていないはずの再帰的な配列が出てきます。
[#32588] /(?<foo>...)/ =~ str assigns foo — Tanaka Akira <akr@...>
以下のように named capture の結果を自動的に変数に代入させた
まつもと ゆきひろです
In article <E1J34q8-00027E-EF@localhost>,
[#32610] 1.9.1 issues left (as of 12/15) — Yukihiro Matsumoto <matz@...>
まつもと ゆきひろです
Yukihiro Matsumoto さんは書きました:
まつもと ゆきひろです
You may consider this:
[#32629] faster Bignum#* — "Yusuke ENDOH" <mame@...>
遠藤と申します。
[#32662] encode! は変換しないときに <nil> になってしまう。 — Martin Duerst <duerst@...>
中田さん、こんにちは。
[#32668] syntax errors on ext/tk/sample — "U.Nakamura" <usa@...>
こんにちは、なかむら(う)です。
[#32695] ISO-2022-JP output for transcode — "NARUSE, Yui" <naruse@...>
成瀬です。
なかだです。
成瀬さん、中田さん、こんにちは。
[#32708] Enumerable can't take multiple parameters — GOTOU Yuuzou <gotoyuzo@...>
eachで複数のパラメータをyieldしたときに、Enumerable#colectで、
[#32715] issues left as of 12/25 2:00am JST — Yukihiro Matsumoto <matz@...>
まつもと ゆきひろです
まつもとさん、こんにちは。
まつもと ゆきひろです
まつもと ゆきひろです
まつもと ゆきひろです
まつもと ゆきひろです
[#32726] Can't build on MacOSX 10.4(Tiger) (was Re: Re: 1.9.1 issues left (as of 12/15)) — "MOROHASHI Kyosuke" <moronatural@...>
もろはしです。お世話になっております。
[#32756] make rdoc cause segv on OpenBSD — SASADA Koichi <ko1@...>
ささだです。
[#32763] Re: [ruby-cvs:21913] Ruby:r14676 (trunk): * trunk/common.mk, goruby.c, golf_prelude.rb: for golfers. — Yukihiro Matsumoto <matz@...>
まつもと ゆきひろです
[#32791] Re: [ruby-list:44387] [ANN] Ruby 1.9.0 is released — SASADA Koichi <ko1@...>
ささだです。
まつもとさん、笹田さん、
まつもと ゆきひろです
まつもと ゆきひろです
福島の藤岡です。
木村です。
[#32823] class TimeSpan — "NARUSE, Yui" <naruse@...>
成瀬です。
ActiveSupportにあるNumericの拡張はダメですか??
[#32834] Re: [ ruby-Bugs-16634 ] Tk#bindinfo fails with: NoMethodError: undefined method 'collect' for "":String — Urabe Shyouhei <shyouhei@...>
以下のバグ報告が来ています
[#32843] Windowでのデフォルトエンコーディング — KIMURA Koichi <kimura.koichi@...>
木村です。
こんにちは、なかむら(う)です。
At 13:55 07/12/28, U.Nakamura wrote:
成瀬です。
なかだです。
In article <20071228092137.97233E065F@mail.bc9.jp>,
なかだです。
U.Nakamura wrote:
こんにちは、なかむら(う)です。
木村です。
成瀬です。
[#32848] Fwd: [ruby-cvs:21983] Ruby:r14746 (trunk): * transcode.c (transcode_dispatch): allows transcoding from/to — Martin Duerst <duerst@...>
中田さん、こんにちは。
[#32852] Resolv::DNS#getaddresses doesn't return IPv6 address — "NARUSE, Yui" <naruse@...>
成瀬です。
こんにちは。
成瀬です。
In message <477EF0C9.4060103@airemix.com>
成瀬です
In message <477FAAB4.1060005@airemix.com>
梅本です。
成瀬です。
In article <47809D55.4030208@airemix.com>,
[#32892] *, z = 1 breaks stack consistency — "Yusuke ENDOH" <mame@...>
遠藤と申します。
[#32904] Integer overflow on struct timespec — zunda <zunda616e@...>
zundaと申します
[ruby-dev:32629] faster Bignum#*
遠藤と申します。
Bignum#* に FFT を用いた乗算を実装してみました。
10 進で 100000 桁以上あるような巨大な整数の乗算が速くなります。
そんな需要はないでしょうか。
$ cat ../test_fft.rb
require "benchmark"
n = 10**10000
puts Benchmark.measure { 100.times { n * n } }
n = 10**100000
puts Benchmark.measure { 10.times { n * n } }
n = 10**1000000
puts Benchmark.measure { 1.times { n * n } }
# 現状
$ ./ruby.org ../test_fft.rb
2.590000 0.000000 2.590000 ( 2.874859)
26.040000 0.010000 26.050000 ( 28.927583)
266.540000 0.040000 266.580000 (276.491797)
# FFT 版
$ ./ruby.fft ../test_fft.rb
2.630000 0.010000 2.640000 ( 2.636339)
2.790000 0.040000 2.830000 ( 2.836020)
6.270000 0.090000 6.360000 ( 6.368478)
FFT の実装は教科書通りです。基数も 65536 (=2**(8*sizeof(short))) か
256 (=2**(8*sizeof(char))) の決め打ちです。フーリエ変換とかよく
わかってないので、バグってたらすみません。詳しい方に検証や再実装を
して頂けたら最高です。
# あと誰か、ニュートン法による除算を実装しません?
Index: bignum.c
===================================================================
--- bignum.c (revision 14308)
+++ bignum.c (working copy)
@@ -1442,10 +1442,145 @@
}
}
+static void
+big_fft(double *ar, double *ai, int al, double theta)
+{
+ int m, mh, i, j, k, irev;
+ double wr, wi, xr, xi;
+
+ i = 0;
+ for (j = 1; j < al - 1; j++) {
+ for (k = al >> 1; k > (i ^= k); k >>= 1);
+ if (j < i) {
+ xr = ar[j];
+ xi = ai[j];
+ ar[j] = ar[i];
+ ai[j] = ai[i];
+ ar[i] = xr;
+ ai[i] = xi;
+ }
+ }
+ for (mh = 1; (m = mh << 1) <= al; mh = m) {
+ irev = 0;
+ for (i = 0; i < al; i += m) {
+ wr = cos(theta * irev);
+ wi = sin(theta * irev);
+ for (k = al >> 2; k > (irev ^= k); k >>= 1);
+ for (j = i; j < mh + i; j++) {
+ k = j + mh;
+ xr = ar[j] - ar[k];
+ xi = ai[j] - ai[k];
+ ar[j] += ar[k];
+ ai[j] += ai[k];
+ ar[k] = wr * xr - wi * xi;
+ ai[k] = wr * xi + wi * xr;
+ }
+ }
+ }
+}
+
+static void
+big_digits_to_bases(int base, double *xr, long rlen, BDIGIT *xds, long dlen)
+{
+ long i, j, k, div = 1 << (base * CHAR_BIT);
+ BDIGIT v;
+
+ k = 0;
+ for (i = 0; i < dlen; i++) {
+ v = xds[i];
+ for (j = 0; j < sizeof(BDIGIT) / base; j++) {
+ xr[k++] = (double) (v % div);
+ v /= div;
+ }
+ }
+ for (; k < rlen; k++) xr[k] = 0;
+}
+
+static void
+big_bases_to_digits(int base, BDIGIT *zds, long dlen, double *xr)
+{
+ long i, j, k, div = 1 << (base * CHAR_BIT);
+ BDIGIT v, s;
+ double x, xm;
+
+ x = 0;
+ i = j = 0;
+ v = 0;
+ s = 1;
+ for (k = 0;; k++) {
+ x += floor(xr[k] + 0.5);
+ xm = fmod(x, div);
+ v |= ((BDIGIT) xm) * s;
+ x = (x - xm) / div;
+ s *= div;
+ if (++j >= sizeof(BDIGIT) / base) {
+ zds[i++] = v;
+ if (i == dlen) return;
+ j = 0;
+ v = 0;
+ s = 1;
+ }
+ }
+}
+
static VALUE
+big_mul_fft(VALUE x, VALUE y)
+{
+ long i, len, base;
+ VALUE z;
+ double *xr, *xi, *yr, *yi, pi = atan(1.0) * 4.0;
+
+ /* calculate FFT length and decide the base of radix */
+ base = sizeof(short);
+ i = (RBIGNUM_LEN(x) + RBIGNUM_LEN(y) + 1) * sizeof(BDIGIT) / base;
+ for (len = 1; len < i; len *= 2);
+ if (len > 131072) {
+ len *= sizeof(short) / sizeof(char);
+ base = sizeof(char);
+ }
+
+ /* allocate two arraies of complexes */
+ xr = ALLOC_N(double, len);
+ xi = ALLOC_N(double, len);
+ yr = ALLOC_N(double, len);
+ yi = ALLOC_N(double, len);
+
+ /* initialize the arraies */
+ big_digits_to_bases(base, xr, len, BDIGITS(x), RBIGNUM_LEN(x));
+ big_digits_to_bases(base, yr, len, BDIGITS(y), RBIGNUM_LEN(y));
+ for (i = 0; i < len; i++) xi[i] = yi[i] = 0;
+
+ /* perform FFT */
+ big_fft(xr, xi, len, 2 * pi / len);
+ big_fft(yr, yi, len, 2 * pi / len);
+
+ /* multiply the arraies */
+ for (i = 0; i < len; i++) {
+ double t = xr[i] * yr[i] - xi[i] * yi[i];
+ xi[i] = xr[i] * yi[i] + xi[i] * yr[i];
+ xr[i] = t;
+ }
+ free(yr);
+ free(yi);
+
+ /* perform IFFT */
+ big_fft(xr, xi, len, -2 * pi / len);
+ free(xi);
+ for (i = 0; i < len; i++) xr[i] /= len;
+
+ /* make a result bignum */
+ len = RBIGNUM_LEN(x) + RBIGNUM_LEN(y) + 1;
+ z = bignew(len, RBIGNUM_SIGN(x)==RBIGNUM_SIGN(y));
+ big_bases_to_digits(base, BDIGITS(z), len, xr);
+ free(xr);
+
+ return z;
+}
+
+static VALUE
rb_big_mul0(VALUE x, VALUE y)
{
- long i, j;
+ long i, j, nx, ny, len;
BDIGIT_DBL n = 0;
VALUE z;
BDIGIT *zds;
@@ -1465,6 +1600,22 @@
return rb_num_coerce_bin(x, y);
}
+ /* estimate time */
+ for (i = nx = 0; i < RBIGNUM_LEN(x); i++) if (BDIGITS(x)[i]) nx++;
+ for (i = ny = 0; i < RBIGNUM_LEN(y); i++) if (BDIGITS(y)[i]) ny++;
+ for (len = 1; RBIGNUM_LEN(x) + RBIGNUM_LEN(y) > len; len *= 2);
+
+ /* swap x and y (when y is more sparse than x) */
+ if (ny < nx) {
+ z = x; x = y; y = z; nx = ny;
+ }
+
+ /* multiply by FFT (if FFT seems to be faster) */
+ if ((double) nx * RBIGNUM_LEN(y) > (double) len * log(len) * 30) {
+ return big_mul_fft(x, y);
+ }
+
+ /* multiply in a normal way */
j = RBIGNUM_LEN(x) + RBIGNUM_LEN(y) + 1;
z = bignew(j, RBIGNUM_SIGN(x)==RBIGNUM_SIGN(y));
zds = BDIGITS(z);
--
Yusuke ENDOH <mame@tsg.ne.jp>