Skip to content

Commit 244c698

Browse files
committed
corrected startvalue for sigma and cutoff in mp_div
1 parent 6e779e6 commit 244c698

File tree

2 files changed

+16
-35
lines changed

2 files changed

+16
-35
lines changed

mp_div.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ mp_err mp_div(const mp_int *a, const mp_int *b, mp_int *c, mp_int *d)
2626
}
2727

2828
if (MP_HAS(S_MP_DIV_RECURSIVE)
29-
&& (b->used > MP_MUL_KARATSUBA_CUTOFF)
29+
&& (b->used > (2 * MP_MUL_KARATSUBA_CUTOFF))
3030
&& (b->used <= ((a->used/3)*2))) {
3131
err = s_mp_div_recursive(a, b, c, d);
3232
} else if (MP_HAS(S_MP_DIV_SCHOOL)) {

s_mp_div_recursive.c

Lines changed: 15 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ static mp_err s_recursion(const mp_int *a, const mp_int *b, mp_int *q, mp_int *r
2020
mp_int A1, A2, B1, B0, Q1, Q0, R1, R0, t;
2121
int m = a->used - b->used, k = m/2;
2222

23-
if (m < MP_MUL_KARATSUBA_CUTOFF) {
23+
if (m < (MP_MUL_KARATSUBA_CUTOFF)) {
2424
return s_mp_div_school(a, b, q, r);
2525
}
2626

@@ -43,15 +43,16 @@ static mp_err s_recursion(const mp_int *a, const mp_int *b, mp_int *q, mp_int *r
4343
if ((err = mp_sub(&A1, &t, &A1)) != MP_OKAY) goto LBL_ERR;
4444

4545
/* while A1 < 0 do Q1 = Q1 - 1, A1 = A1 + (beta^k * B) */
46-
if ((err = mp_mul_2d(b, k * MP_DIGIT_BIT, &t)) != MP_OKAY) goto LBL_ERR;
47-
while (mp_cmp_d(&A1, 0uL) == MP_LT) {
48-
if ((err = mp_decr(&Q1)) != MP_OKAY) goto LBL_ERR;
49-
if ((err = mp_add(&A1, &t, &A1)) != MP_OKAY) goto LBL_ERR;
46+
if (mp_cmp_d(&A1, 0uL) == MP_LT) {
47+
if ((err = mp_mul_2d(b, k * MP_DIGIT_BIT, &t)) != MP_OKAY) goto LBL_ERR;
48+
do {
49+
if ((err = mp_decr(&Q1)) != MP_OKAY) goto LBL_ERR;
50+
if ((err = mp_add(&A1, &t, &A1)) != MP_OKAY) goto LBL_ERR;
51+
} while (mp_cmp_d(&A1, 0uL) == MP_LT);
5052
}
51-
5253
/* (Q0, R0) = RecursiveDivRem(A1 / beta^(k), B1) */
5354
if ((err = mp_div_2d(&A1, k * MP_DIGIT_BIT, &A1, &t)) != MP_OKAY) goto LBL_ERR;
54-
if ((err = s_recursion(&A1, &B1, &Q0, &R0)) != MP_OKAY) goto LBL_ERR;
55+
if ((err = s_recursion(&A1, &B1, &Q0, &R0)) != MP_OKAY) goto LBL_ERR;
5556

5657
/* A2 = (R0*beta^k) + (A1 % beta^k) - (Q0*B0) */
5758
if ((err = mp_lshd(&R0, k)) != MP_OKAY) goto LBL_ERR;
@@ -65,13 +66,10 @@ static mp_err s_recursion(const mp_int *a, const mp_int *b, mp_int *q, mp_int *r
6566
if ((err = mp_add(&A2, b, &A2)) != MP_OKAY) goto LBL_ERR;
6667
}
6768
/* return q = (Q1*beta^k) + Q0, r = A2 */
68-
if (q != NULL) {
69-
if ((err = mp_lshd(&Q1, k)) != MP_OKAY) goto LBL_ERR;
70-
if ((err = mp_add(&Q1, &Q0, q)) != MP_OKAY) goto LBL_ERR;
71-
}
72-
if (r != NULL) {
73-
if ((err = mp_copy(&A2, r)) != MP_OKAY) goto LBL_ERR;
74-
}
69+
if ((err = mp_lshd(&Q1, k)) != MP_OKAY) goto LBL_ERR;
70+
if ((err = mp_add(&Q1, &Q0, q)) != MP_OKAY) goto LBL_ERR;
71+
72+
if ((err = mp_copy(&A2, r)) != MP_OKAY) goto LBL_ERR;
7573

7674
LBL_ERR:
7775
mp_clear_multi(&A1, &A2, &B1, &B0, &Q1, &Q0, &R1, &R0, &t, NULL);
@@ -94,24 +92,7 @@ mp_err s_mp_div_recursive(const mp_int *a, const mp_int *b, mp_int *q, mp_int *r
9492
/* most significant bit of a limb */
9593
/* assumes MP_DIGIT_MAX < (sizeof(mp_digit) * CHAR_BIT) */
9694
msb = (MP_DIGIT_MAX + (mp_digit)(1)) >> 1;
97-
98-
/*
99-
Method to compute sigma shamelessly stolen from
100-
101-
J. Burnikel and J. Ziegler, "Fast recursive division", Research Report
102-
MPI-I-98-1-022, Max-Planck-Institut fuer Informatik, Saarbruecken, Germany,
103-
October 1998. (available online)
104-
105-
Vid. section 2.3.
106-
*/
107-
m = MP_MUL_KARATSUBA_CUTOFF;
108-
while (m <= b->used) {
109-
m <<= 1;
110-
}
111-
j = (b->used + m - 1) / m;
112-
n = j * m;
113-
114-
sigma = MP_DIGIT_BIT * (n - b->used);
95+
sigma = 0;
11596
msb_b = b->dp[b->used - 1];
11697
while (msb_b < msb) {
11798
sigma++;
@@ -139,7 +120,7 @@ mp_err s_mp_div_recursive(const mp_int *a, const mp_int *b, mp_int *q, mp_int *r
139120
/* Q = 0 */
140121
mp_zero(&Q);
141122
while (m > n) {
142-
/* (q, r) = RecursveDivRem(A / (beta^(m-n)), B) */
123+
/* (q, r) = RecursiveDivRem(A / (beta^(m-n)), B) */
143124
j = (m - n) * MP_DIGIT_BIT;
144125
if ((err = mp_div_2d(&A, j, &A_div, &A_mod)) != MP_OKAY) goto LBL_ERR;
145126
if ((err = s_recursion(&A_div, &B, &Q1, &R)) != MP_OKAY) goto LBL_ERR;
@@ -152,7 +133,7 @@ mp_err s_mp_div_recursive(const mp_int *a, const mp_int *b, mp_int *q, mp_int *r
152133
/* m = m - n */
153134
m = m - n;
154135
}
155-
/* (q, r) = RecursveDivRem(A, B) */
136+
/* (q, r) = RecursiveDivRem(A, B) */
156137
if ((err = s_recursion(&A, &B, &Q1, &R)) != MP_OKAY) goto LBL_ERR;
157138
/* Q = (Q * beta^m) + q, R = r */
158139
if ((err = mp_mul_2d(&Q, m * MP_DIGIT_BIT, &Q)) != MP_OKAY) goto LBL_ERR;

0 commit comments

Comments
 (0)