* bignum.c (big_div_struct): Remove xn and j field. Add zn field.
(bigdivrem1): Follow the above change. (bigdivrem_restoring): Ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42545 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
26e69a89fa
commit
f069f26bc2
@ -1,3 +1,9 @@
|
|||||||
|
Wed Aug 14 00:18:39 2013 Tanaka Akira <akr@fsij.org>
|
||||||
|
|
||||||
|
* bignum.c (big_div_struct): Remove xn and j field. Add zn field.
|
||||||
|
(bigdivrem1): Follow the above change.
|
||||||
|
(bigdivrem_restoring): Ditto.
|
||||||
|
|
||||||
Tue Aug 13 23:38:17 2013 Tanaka Akira <akr@fsij.org>
|
Tue Aug 13 23:38:17 2013 Tanaka Akira <akr@fsij.org>
|
||||||
|
|
||||||
* bignum.c (big_div_struct): ynzero field removed.
|
* bignum.c (big_div_struct): ynzero field removed.
|
||||||
|
25
bignum.c
25
bignum.c
@ -2625,7 +2625,7 @@ bary_mul(BDIGIT *zds, size_t zn, const BDIGIT *xds, size_t xn, const BDIGIT *yds
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct big_div_struct {
|
struct big_div_struct {
|
||||||
size_t xn, yn, j;
|
size_t yn, zn;
|
||||||
BDIGIT *yds, *zds;
|
BDIGIT *yds, *zds;
|
||||||
volatile VALUE stop;
|
volatile VALUE stop;
|
||||||
};
|
};
|
||||||
@ -2635,33 +2635,33 @@ bigdivrem1(void *ptr)
|
|||||||
{
|
{
|
||||||
struct big_div_struct *bds = (struct big_div_struct*)ptr;
|
struct big_div_struct *bds = (struct big_div_struct*)ptr;
|
||||||
size_t yn = bds->yn;
|
size_t yn = bds->yn;
|
||||||
size_t j;
|
size_t zn = bds->zn;
|
||||||
BDIGIT *yds = bds->yds, *zds = bds->zds;
|
BDIGIT *yds = bds->yds, *zds = bds->zds;
|
||||||
BDIGIT_DBL_SIGNED num;
|
BDIGIT_DBL_SIGNED num;
|
||||||
BDIGIT q;
|
BDIGIT q;
|
||||||
|
|
||||||
j = bds->j;
|
|
||||||
do {
|
do {
|
||||||
if (bds->stop) {
|
if (bds->stop) {
|
||||||
bds->j = j;
|
bds->zn = zn;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (zds[j] == yds[yn-1]) q = BDIGMAX;
|
if (zds[zn-1] == yds[yn-1]) q = BDIGMAX;
|
||||||
else q = (BDIGIT)((BIGUP(zds[j]) + zds[j-1])/yds[yn-1]);
|
else q = (BDIGIT)((BIGUP(zds[zn-1]) + zds[zn-2])/yds[yn-1]);
|
||||||
if (q) {
|
if (q) {
|
||||||
num = bigdivrem_mulsub(zds+j-yn, yn+1,
|
num = bigdivrem_mulsub(zds+zn-(yn+1), yn+1,
|
||||||
q,
|
q,
|
||||||
yds, yn);
|
yds, yn);
|
||||||
while (num) { /* "add back" required */
|
while (num) { /* "add back" required */
|
||||||
q--;
|
q--;
|
||||||
num = bary_add(zds+j-yn, yn,
|
num = bary_add(zds+zn-(yn+1), yn,
|
||||||
zds+j-yn, yn,
|
zds+zn-(yn+1), yn,
|
||||||
yds, yn);
|
yds, yn);
|
||||||
num--;
|
num--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
zds[j] = q;
|
zn--;
|
||||||
} while (--j >= yn);
|
zds[zn] = q;
|
||||||
|
} while (zn > yn);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2704,12 +2704,11 @@ bigdivrem_restoring(BDIGIT *zds, size_t zn, size_t xn, BDIGIT *yds, size_t yn)
|
|||||||
assert(BDIGIT_MSB(yds[yn-1]));
|
assert(BDIGIT_MSB(yds[yn-1]));
|
||||||
|
|
||||||
for (ynzero = 0; !yds[ynzero]; ynzero++);
|
for (ynzero = 0; !yds[ynzero]; ynzero++);
|
||||||
bds.xn = xn - ynzero;
|
|
||||||
bds.yn = yn - ynzero;
|
bds.yn = yn - ynzero;
|
||||||
bds.zds = zds + ynzero;
|
bds.zds = zds + ynzero;
|
||||||
bds.yds = yds + ynzero;
|
bds.yds = yds + ynzero;
|
||||||
bds.stop = Qfalse;
|
bds.stop = Qfalse;
|
||||||
bds.j = zn - 1 - ynzero;
|
bds.zn = zn - ynzero;
|
||||||
if (xn > 10000 || yn > 10000) {
|
if (xn > 10000 || yn > 10000) {
|
||||||
retry:
|
retry:
|
||||||
bds.stop = Qfalse;
|
bds.stop = Qfalse;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user