comparison libtommath/bn_mp_toom_sqr.c @ 1436:60fc6476e044

Update to libtommath v1.0
author Matt Johnston <matt@ucc.asn.au>
date Sat, 24 Jun 2017 22:37:14 +0800
parents 5ff8218bcee9
children 8bba51a55704
comparison
equal deleted inserted replaced
1435:f849a5ca2efc 1436:60fc6476e044
1 #include <tommath.h> 1 #include <tommath_private.h>
2 #ifdef BN_MP_TOOM_SQR_C 2 #ifdef BN_MP_TOOM_SQR_C
3 /* LibTomMath, multiple-precision integer library -- Tom St Denis 3 /* LibTomMath, multiple-precision integer library -- Tom St Denis
4 * 4 *
5 * LibTomMath is a library that provides multiple-precision 5 * LibTomMath is a library that provides multiple-precision
6 * integer arithmetic as well as number theoretic functionality. 6 * integer arithmetic as well as number theoretic functionality.
10 * additional optimizations in place. 10 * additional optimizations in place.
11 * 11 *
12 * The library is free for all purposes without any express 12 * The library is free for all purposes without any express
13 * guarantee it works. 13 * guarantee it works.
14 * 14 *
15 * Tom St Denis, [email protected], http://math.libtomcrypt.com 15 * Tom St Denis, [email protected], http://libtom.org
16 */ 16 */
17 17
18 /* squaring using Toom-Cook 3-way algorithm */ 18 /* squaring using Toom-Cook 3-way algorithm */
19 int 19 int
20 mp_toom_sqr(mp_int *a, mp_int *b) 20 mp_toom_sqr(mp_int *a, mp_int *b)
37 37
38 if ((res = mp_copy(a, &a1)) != MP_OKAY) { 38 if ((res = mp_copy(a, &a1)) != MP_OKAY) {
39 goto ERR; 39 goto ERR;
40 } 40 }
41 mp_rshd(&a1, B); 41 mp_rshd(&a1, B);
42 mp_mod_2d(&a1, DIGIT_BIT * B, &a1); 42 if ((res = mp_mod_2d(&a1, DIGIT_BIT * B, &a1)) != MP_OKAY) {
43 goto ERR;
44 }
43 45
44 if ((res = mp_copy(a, &a2)) != MP_OKAY) { 46 if ((res = mp_copy(a, &a2)) != MP_OKAY) {
45 goto ERR; 47 goto ERR;
46 } 48 }
47 mp_rshd(&a2, B*2); 49 mp_rshd(&a2, B*2);
113 1 0 0 0 0 115 1 0 0 0 0
114 116
115 using 12 subtractions, 4 shifts, 2 small divisions and 1 small multiplication. 117 using 12 subtractions, 4 shifts, 2 small divisions and 1 small multiplication.
116 */ 118 */
117 119
118 /* r1 - r4 */ 120 /* r1 - r4 */
119 if ((res = mp_sub(&w1, &w4, &w1)) != MP_OKAY) { 121 if ((res = mp_sub(&w1, &w4, &w1)) != MP_OKAY) {
120 goto ERR; 122 goto ERR;
121 } 123 }
122 /* r3 - r0 */ 124 /* r3 - r0 */
123 if ((res = mp_sub(&w3, &w0, &w3)) != MP_OKAY) { 125 if ((res = mp_sub(&w3, &w0, &w3)) != MP_OKAY) {
124 goto ERR; 126 goto ERR;
125 } 127 }
126 /* r1/2 */ 128 /* r1/2 */
127 if ((res = mp_div_2(&w1, &w1)) != MP_OKAY) { 129 if ((res = mp_div_2(&w1, &w1)) != MP_OKAY) {
128 goto ERR; 130 goto ERR;
129 } 131 }
130 /* r3/2 */ 132 /* r3/2 */
131 if ((res = mp_div_2(&w3, &w3)) != MP_OKAY) { 133 if ((res = mp_div_2(&w3, &w3)) != MP_OKAY) {
132 goto ERR; 134 goto ERR;
133 } 135 }
134 /* r2 - r0 - r4 */ 136 /* r2 - r0 - r4 */
135 if ((res = mp_sub(&w2, &w0, &w2)) != MP_OKAY) { 137 if ((res = mp_sub(&w2, &w0, &w2)) != MP_OKAY) {
136 goto ERR; 138 goto ERR;
137 } 139 }
138 if ((res = mp_sub(&w2, &w4, &w2)) != MP_OKAY) { 140 if ((res = mp_sub(&w2, &w4, &w2)) != MP_OKAY) {
139 goto ERR; 141 goto ERR;
140 } 142 }
141 /* r1 - r2 */ 143 /* r1 - r2 */
142 if ((res = mp_sub(&w1, &w2, &w1)) != MP_OKAY) { 144 if ((res = mp_sub(&w1, &w2, &w1)) != MP_OKAY) {
143 goto ERR; 145 goto ERR;
144 } 146 }
145 /* r3 - r2 */ 147 /* r3 - r2 */
146 if ((res = mp_sub(&w3, &w2, &w3)) != MP_OKAY) { 148 if ((res = mp_sub(&w3, &w2, &w3)) != MP_OKAY) {
147 goto ERR; 149 goto ERR;
148 } 150 }
149 /* r1 - 8r0 */ 151 /* r1 - 8r0 */
150 if ((res = mp_mul_2d(&w0, 3, &tmp1)) != MP_OKAY) { 152 if ((res = mp_mul_2d(&w0, 3, &tmp1)) != MP_OKAY) {
151 goto ERR; 153 goto ERR;
152 } 154 }
153 if ((res = mp_sub(&w1, &tmp1, &w1)) != MP_OKAY) { 155 if ((res = mp_sub(&w1, &tmp1, &w1)) != MP_OKAY) {
154 goto ERR; 156 goto ERR;
155 } 157 }
156 /* r3 - 8r4 */ 158 /* r3 - 8r4 */
157 if ((res = mp_mul_2d(&w4, 3, &tmp1)) != MP_OKAY) { 159 if ((res = mp_mul_2d(&w4, 3, &tmp1)) != MP_OKAY) {
158 goto ERR; 160 goto ERR;
159 } 161 }
160 if ((res = mp_sub(&w3, &tmp1, &w3)) != MP_OKAY) { 162 if ((res = mp_sub(&w3, &tmp1, &w3)) != MP_OKAY) {
161 goto ERR; 163 goto ERR;
162 } 164 }
163 /* 3r2 - r1 - r3 */ 165 /* 3r2 - r1 - r3 */
164 if ((res = mp_mul_d(&w2, 3, &w2)) != MP_OKAY) { 166 if ((res = mp_mul_d(&w2, 3, &w2)) != MP_OKAY) {
165 goto ERR; 167 goto ERR;
166 } 168 }
167 if ((res = mp_sub(&w2, &w1, &w2)) != MP_OKAY) { 169 if ((res = mp_sub(&w2, &w1, &w2)) != MP_OKAY) {
168 goto ERR; 170 goto ERR;
169 } 171 }
170 if ((res = mp_sub(&w2, &w3, &w2)) != MP_OKAY) { 172 if ((res = mp_sub(&w2, &w3, &w2)) != MP_OKAY) {
171 goto ERR; 173 goto ERR;
172 } 174 }
173 /* r1 - r2 */ 175 /* r1 - r2 */
174 if ((res = mp_sub(&w1, &w2, &w1)) != MP_OKAY) { 176 if ((res = mp_sub(&w1, &w2, &w1)) != MP_OKAY) {
175 goto ERR; 177 goto ERR;
176 } 178 }
177 /* r3 - r2 */ 179 /* r3 - r2 */
178 if ((res = mp_sub(&w3, &w2, &w3)) != MP_OKAY) { 180 if ((res = mp_sub(&w3, &w2, &w3)) != MP_OKAY) {
179 goto ERR; 181 goto ERR;
180 } 182 }
181 /* r1/3 */ 183 /* r1/3 */
182 if ((res = mp_div_3(&w1, &w1, NULL)) != MP_OKAY) { 184 if ((res = mp_div_3(&w1, &w1, NULL)) != MP_OKAY) {
183 goto ERR; 185 goto ERR;
184 } 186 }
185 /* r3/3 */ 187 /* r3/3 */
186 if ((res = mp_div_3(&w3, &w3, NULL)) != MP_OKAY) { 188 if ((res = mp_div_3(&w3, &w3, NULL)) != MP_OKAY) {
187 goto ERR; 189 goto ERR;
188 } 190 }
189 191
190 /* at this point shift W[n] by B*n */ 192 /* at this point shift W[n] by B*n */
191 if ((res = mp_lshd(&w1, 1*B)) != MP_OKAY) { 193 if ((res = mp_lshd(&w1, 1*B)) != MP_OKAY) {
192 goto ERR; 194 goto ERR;
193 } 195 }
194 if ((res = mp_lshd(&w2, 2*B)) != MP_OKAY) { 196 if ((res = mp_lshd(&w2, 2*B)) != MP_OKAY) {
195 goto ERR; 197 goto ERR;
196 } 198 }
197 if ((res = mp_lshd(&w3, 3*B)) != MP_OKAY) { 199 if ((res = mp_lshd(&w3, 3*B)) != MP_OKAY) {
198 goto ERR; 200 goto ERR;
199 } 201 }
200 if ((res = mp_lshd(&w4, 4*B)) != MP_OKAY) { 202 if ((res = mp_lshd(&w4, 4*B)) != MP_OKAY) {
201 goto ERR; 203 goto ERR;
202 } 204 }
203 205
204 if ((res = mp_add(&w0, &w1, b)) != MP_OKAY) { 206 if ((res = mp_add(&w0, &w1, b)) != MP_OKAY) {
205 goto ERR; 207 goto ERR;
206 } 208 }
207 if ((res = mp_add(&w2, &w3, &tmp1)) != MP_OKAY) { 209 if ((res = mp_add(&w2, &w3, &tmp1)) != MP_OKAY) {
208 goto ERR; 210 goto ERR;
209 } 211 }
210 if ((res = mp_add(&w4, &tmp1, &tmp1)) != MP_OKAY) { 212 if ((res = mp_add(&w4, &tmp1, &tmp1)) != MP_OKAY) {
211 goto ERR; 213 goto ERR;
212 } 214 }
213 if ((res = mp_add(&tmp1, b, b)) != MP_OKAY) { 215 if ((res = mp_add(&tmp1, b, b)) != MP_OKAY) {
214 goto ERR; 216 goto ERR;
215 } 217 }
216 218
217 ERR: 219 ERR:
218 mp_clear_multi(&w0, &w1, &w2, &w3, &w4, &a0, &a1, &a2, &tmp1, NULL); 220 mp_clear_multi(&w0, &w1, &w2, &w3, &w4, &a0, &a1, &a2, &tmp1, NULL);
219 return res; 221 return res;
220 } 222 }
221 223
222 #endif 224 #endif
223 225
224 /* $Source: /cvs/libtom/libtommath/bn_mp_toom_sqr.c,v $ */ 226 /* $Source$ */
225 /* $Revision: 1.3 $ */ 227 /* $Revision$ */
226 /* $Date: 2006/03/31 14:18:44 $ */ 228 /* $Date$ */