summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--bignum.c10
2 files changed, 15 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 63c8147844..4b64bcb85d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Fri Aug 16 01:09:33 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bigdivrem_restoring): Use bigdivrem_single if non-topmost
+ BDIGITs of y are zero.
+
Fri Aug 16 00:33:12 2013 Tanaka Akira <akr@fsij.org>
* bignum.c (rb_big2str1): Truncate topmost zeros of x.
diff --git a/bignum.c b/bignum.c
index 0bdae81573..fecd0b1953 100644
--- a/bignum.c
+++ b/bignum.c
@@ -2704,6 +2704,16 @@ bigdivrem_restoring(BDIGIT *zds, size_t zn, BDIGIT *yds, size_t yn)
assert(BDIGIT_MSB(yds[yn-1]));
for (ynzero = 0; !yds[ynzero]; ynzero++);
+
+ if (ynzero+1 == yn) {
+ BDIGIT r;
+ r = bigdivrem_single(zds+ynzero, zds+ynzero, zn-ynzero, yds[yn-1]);
+ assert(zds[zn-1] == 0);
+ MEMMOVE(zds+yn, zds+yn-1, BDIGIT, zn - yn);
+ zds[yn-1] = r;
+ return;
+ }
+
bds.yn = yn - ynzero;
bds.zds = zds + ynzero;
bds.yds = yds + ynzero;