Optimize rb_big2str0 and big2str_karatsuba

e$BK-J!$G$9!#e(B

e$BITMW$Je(B FIXNUMe$BMQ$N=hM}$N:o=|$H%o!<%/MQe(BBignum
e$B$N8eJRIU$1$G$9!#e(B

bignum.c.org
+++ bignum.c
@@ -893,21 +893,6 @@
long lh, ll, m1;
VALUE b, q, r;

  • if (FIXNUM_P(x)) {
  •   VALUE str = rb_fix2str(x, base);
    
  •   char* str_ptr = RSTRING_PTR(str);
    
  •   long str_len = RSTRING_LEN(str);
    
  •   if (trim) {
    
  •       if (FIX2INT(x) == 0) return 0;
    
  •       MEMCPY(ptr, str_ptr, char, str_len);
    
  •       return str_len;
    
  •   }
    
  •   else {
    
  •       memset(ptr, '0', len - str_len);
    
  •       MEMCPY(ptr + len - str_len, str_ptr, char, str_len);
    
  •       return len;
    
  •   }
    
  • }
    if (BIGZEROP(x)) {
    if (trim) return 0;
    else {
    @@ -924,8 +909,10 @@
    bigdivmod(x, b, &q, &r);
    lh = big2str_karatsuba(q, base, ptr, (len - m1)/2,
    len - m1, hbase, trim);
  • rb_big_resize(q, 0);
    ll = big2str_karatsuba(r, base, ptr + lh, m1/2,
    m1, hbase, !lh && trim);

  • rb_big_resize(r, 0);

    return lh + ll;
    }
    @@ -968,6 +955,7 @@
    len = off + big2str_karatsuba(xx, base, ptr + off, n1,
    n2, hbase, trim);
    }

  • rb_big_resize(xx, 0);

    ptr[len] = ‘\0’;
    rb_str_resize(ss, len);


e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:36217] optimize rb_big2str0 and
big2str_karatsuba”
on Mon, 8 Sep 2008 22:17:46 +0900, TOYOFUKU Chikanobu
[email protected] writes:

| e$BITMW$Je(B FIXNUMe$BMQ$N=hM}$N:o=|$H%o!<%/MQe(BBignum e$B$N8eJRIU$1$G$9!#e(B

Fixnume$B=hM}$r:o=|$9$k$N$O$h$$$G$9$,!"%o!<%/MQe(BBignume$B$N8eJR$E$1e(B
e$B$OI,MW$G$9$+$M!#%5%$%:e(B0e$B$K$J$kItJ,$rKPLG$G$-$kJ]>Z$,$J$$8B$j7ke(B
e$B6I$O@55,2=$5$l$J$$e(BBignume$B$KBP1~$9$kKI8fE*%3!<%G%#%s%0$OI,MW$Ge(B
e$B$7$g$&$7!#e(B

e$BK-J!$G$9!#e(B

In [ruby-dev:36252]

| e$BITMW$Je(B FIXNUMe$BMQ$N=hM}$N:o=|$H%o!<%/MQe(BBignum e$B$N8eJRIU$1$G$9!#e(B

Fixnume$B=hM}$r:o=|$9$k$N$O$h$$$G$9$,!"%o!<%/MQe(BBignume$B$N8eJR$E$1e(B
e$B$OI,MW$G$9$+$M!#%5%$%:e(B0e$B$K$J$kItJ,$rKPLG$G$-$kJ]>Z$,$J$$8B$j7ke(B
e$B6I$O@55,2=$5$l$J$$e(BBignume$B$KBP1~$9$kKI8fE*%3!<%G%#%s%0$OI,MW$Ge(B
e$B$7$g$&$7!#e(B

e$B%5%$%:it:GE,$rKPLG$G$-$k$H$O;W$$$^$9$,B>$N%P%0$HF1MM$KKPLGe(B
e$B$G$-$?J]>Z$O$G$-$J$$$G$9$M!#KI8fE*%3!<%G%#%s%0$r;D$5$M$P$J$ie(B
e$B$J$$$N$O$7$g$&$,$J$$$H;W$$$^$9!#e(B
Bignume$B$N8eJR$E$1$O%5%$%:$N:GE,2=$N0U?^$b$b$A$m$s$G$9$,ITI,MW$He(B
e$B$J$C$?e(B digits
e$B$rAa$/2rJ|$7$?J}$,$h$$$N$G$O$H$$$&0U?^$b$"$j$^$9!#e(B