diff options
Diffstat (limited to 'libtommath/bn_mp_div.c')
-rw-r--r-- | libtommath/bn_mp_div.c | 156 |
1 files changed, 2 insertions, 154 deletions
diff --git a/libtommath/bn_mp_div.c b/libtommath/bn_mp_div.c index b80797f..ce6c255 100644 --- a/libtommath/bn_mp_div.c +++ b/libtommath/bn_mp_div.c @@ -87,158 +87,6 @@ LBL_ERR: #else -#if 0 -/* Integer signed division. - * - * c*b + d == a, that is, c = a/b and c = a%b - * - * This is a wrapper function that dispatches to various service - * functions that actually perform the division. - */ - -int mp_div(mp_int* a, mp_int* b, mp_int* c, mp_int* d) -{ - - int bitShift; /* Amount by which the divisor and - * dividend were scaled in the normalization - * step */ - mp_digit dig; - int res; - mp_int x, y, q; - - /* Division by zero is an error. */ - if (mp_iszero (b) == 1) { - return MP_VAL; - } - - /* If a < b, the quotient is zero, no need to divide. */ - if (mp_cmp_mag (a, b) == MP_LT) { - if (d != NULL) { - res = mp_copy (a, d); - } else { - res = MP_OKAY; - } - if (c != NULL) { - mp_zero (c); - } - return res; - } - - /* If the divisor has a single digit, then use short division - * to handle it. */ - - if (b->used == 1) { - mp_digit rem; - if ((res = mp_div_d(a, b->dp[0], c, &rem)) != MP_OKAY) { - return res; - } - if (a->sign != b->sign) { - c->sign = MP_NEG; - } else { - c->sign = MP_ZPOS; - } - if (d != NULL) { - d->dp[0] = rem; - d->used = 1; - d->sign = a->sign; - mp_clamp(d); - } - return MP_OKAY; - } - - /* Allocate temporary storage */ - - if ((res = mp_init_size(&q, a->used + 2 - b->used)) != MP_OKAY) { - return res; - } - if ((res = mp_init_copy(&x, a)) != MP_OKAY) { - goto LBL_Q; - } - if ((res = mp_init_copy(&y, b)) != MP_OKAY) { - goto LBL_X; - } - - /* Divisor is at least two digits. Prescale so that the divisor - * has 1 in its most significant bit. */ - - bitShift = 0; - dig = y->dp[y->used-1]; - while (dig < 1<<(DIGIT_BIT-1)) { - dig <<= 1; - ++bitShift; - } - if ((res = mp_mul_2d(&x, bitShift, &x)) != MP_OKAY - || (res = mp_mul_2d(&y, bitShift, &y)) != MP_OKAY) { - goto LBL_Y; - } - - /* Perform the division, leaving quotient in q and remainder in x */ - -#ifdef BN_S_MP_DIV_BZ_C - if (y->used > BZ_DIV_THRESHOLD) { - - /* Above the threshold of digits for Burnikel-Ziegler */ - - if ((res = bn_s_mp_div_bz(&x, &y, &q)) != MP_OKAY) { - goto LBL_Y; - } - - } else -#endif - { - /* Either Burnikel-Ziegler is not available, or the divisor has - * too few digits for it to be profitable. Hence, we shall use - * ordinary school division for this case. Accumulate the quotient - * in q, and leave the remainder in x. */ - - if ((res = bn_s_mp_div_school(&x, &y, &q)) != MP_OKAY) { - goto LBL_Y; - } - } - - /* Correct the sign of the remainder */ - - if (x->used == 0) { - x->sign = MP_ZPOS; - } else { - x->sign = a->sign; - } - - /* Store quotient, setting the correct sign */ - - if (c != NULL) { - mp_clamp(&q); - if (a->sign == b->sign) { - q->sign = MP_ZPOS; - } else { - q->sign = MP_NEG; - } - mp_exch(&q, c); - } - - /* Store remainder, copying the sign of a */ - - if (d != NULL) { - mp_div_2d(&x, bitShift, &x, NULL); - mp_exch(&x, d); - } - - res = MP_OKAY; - - /* Free memory */ - - LBL_Y: - mp_clear(&y); - LBL_X: - mp_clear(&x); - LBL_Q: - mp_clear(&q); - - return res; - -} -#endif - /* integer signed division. * c*b + d == a [e.g. a/b, c=quotient, d=remainder] * HAC pp.598 Algorithm 14.20 @@ -440,5 +288,5 @@ LBL_Q:mp_clear (&q); #endif /* $Source: /root/tcl/repos-to-convert/tcl/libtommath/bn_mp_div.c,v $ */ -/* $Revision: 1.3 $ */ -/* $Date: 2006/12/01 15:55:45 $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/01 19:45:38 $ */ |