@@ -20,7 +20,7 @@ static mp_err s_recursion(const mp_int *a, const mp_int *b, mp_int *q, mp_int *r
20
20
mp_int A1 , A2 , B1 , B0 , Q1 , Q0 , R1 , R0 , t ;
21
21
int m = a -> used - b -> used , k = m /2 ;
22
22
23
- if (m < MP_MUL_KARATSUBA_CUTOFF ) {
23
+ if (m < ( MP_MUL_KARATSUBA_CUTOFF ) ) {
24
24
return s_mp_div_school (a , b , q , r );
25
25
}
26
26
@@ -43,15 +43,16 @@ static mp_err s_recursion(const mp_int *a, const mp_int *b, mp_int *q, mp_int *r
43
43
if ((err = mp_sub (& A1 , & t , & A1 )) != MP_OKAY ) goto LBL_ERR ;
44
44
45
45
/* 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 );
50
52
}
51
-
52
53
/* (Q0, R0) = RecursiveDivRem(A1 / beta^(k), B1) */
53
54
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 ;
55
56
56
57
/* A2 = (R0*beta^k) + (A1 % beta^k) - (Q0*B0) */
57
58
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
65
66
if ((err = mp_add (& A2 , b , & A2 )) != MP_OKAY ) goto LBL_ERR ;
66
67
}
67
68
/* 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 ;
75
73
76
74
LBL_ERR :
77
75
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
94
92
/* most significant bit of a limb */
95
93
/* assumes MP_DIGIT_MAX < (sizeof(mp_digit) * CHAR_BIT) */
96
94
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 ;
115
96
msb_b = b -> dp [b -> used - 1 ];
116
97
while (msb_b < msb ) {
117
98
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
139
120
/* Q = 0 */
140
121
mp_zero (& Q );
141
122
while (m > n ) {
142
- /* (q, r) = RecursveDivRem (A / (beta^(m-n)), B) */
123
+ /* (q, r) = RecursiveDivRem (A / (beta^(m-n)), B) */
143
124
j = (m - n ) * MP_DIGIT_BIT ;
144
125
if ((err = mp_div_2d (& A , j , & A_div , & A_mod )) != MP_OKAY ) goto LBL_ERR ;
145
126
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
152
133
/* m = m - n */
153
134
m = m - n ;
154
135
}
155
- /* (q, r) = RecursveDivRem (A, B) */
136
+ /* (q, r) = RecursiveDivRem (A, B) */
156
137
if ((err = s_recursion (& A , & B , & Q1 , & R )) != MP_OKAY ) goto LBL_ERR ;
157
138
/* Q = (Q * beta^m) + q, R = r */
158
139
if ((err = mp_mul_2d (& Q , m * MP_DIGIT_BIT , & Q )) != MP_OKAY ) goto LBL_ERR ;
0 commit comments