Coverage Report

Created: 2026-02-09 06:47

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/botan/src/lib/math/mp/mp_comba.cpp
Line
Count
Source
1
/*
2
* Comba Multiplication and Squaring
3
*
4
* This file was automatically generated by ./src/scripts/dev_tools/gen_mp_comba.py on 2024-06-27
5
*
6
* Botan is released under the Simplified BSD License (see license.txt)
7
*/
8
9
#include <botan/internal/mp_core.h>
10
11
namespace Botan {
12
13
/*
14
* Comba 4x4 Squaring
15
*/
16
228k
void bigint_comba_sqr4(word z[8], const word x[4]) {
17
228k
   word3<word> accum;
18
19
228k
   accum.mul(x[0], x[0]);
20
228k
   z[0] = accum.extract();
21
228k
   accum.mul_x2(x[0], x[1]);
22
228k
   z[1] = accum.extract();
23
228k
   accum.mul_x2(x[0], x[2]);
24
228k
   accum.mul(x[1], x[1]);
25
228k
   z[2] = accum.extract();
26
228k
   accum.mul_x2(x[0], x[3]);
27
228k
   accum.mul_x2(x[1], x[2]);
28
228k
   z[3] = accum.extract();
29
228k
   accum.mul_x2(x[1], x[3]);
30
228k
   accum.mul(x[2], x[2]);
31
228k
   z[4] = accum.extract();
32
228k
   accum.mul_x2(x[2], x[3]);
33
228k
   z[5] = accum.extract();
34
228k
   accum.mul(x[3], x[3]);
35
228k
   z[6] = accum.extract();
36
228k
   z[7] = accum.extract();
37
228k
}
38
39
/*
40
* Comba 4x4 Multiplication
41
*/
42
144k
void bigint_comba_mul4(word z[8], const word x[4], const word y[4]) {
43
144k
   word3<word> accum;
44
45
144k
   accum.mul(x[0], y[0]);
46
144k
   z[0] = accum.extract();
47
144k
   accum.mul(x[0], y[1]);
48
144k
   accum.mul(x[1], y[0]);
49
144k
   z[1] = accum.extract();
50
144k
   accum.mul(x[0], y[2]);
51
144k
   accum.mul(x[1], y[1]);
52
144k
   accum.mul(x[2], y[0]);
53
144k
   z[2] = accum.extract();
54
144k
   accum.mul(x[0], y[3]);
55
144k
   accum.mul(x[1], y[2]);
56
144k
   accum.mul(x[2], y[1]);
57
144k
   accum.mul(x[3], y[0]);
58
144k
   z[3] = accum.extract();
59
144k
   accum.mul(x[1], y[3]);
60
144k
   accum.mul(x[2], y[2]);
61
144k
   accum.mul(x[3], y[1]);
62
144k
   z[4] = accum.extract();
63
144k
   accum.mul(x[2], y[3]);
64
144k
   accum.mul(x[3], y[2]);
65
144k
   z[5] = accum.extract();
66
144k
   accum.mul(x[3], y[3]);
67
144k
   z[6] = accum.extract();
68
144k
   z[7] = accum.extract();
69
144k
}
70
71
/*
72
* Comba 6x6 Squaring
73
*/
74
700k
void bigint_comba_sqr6(word z[12], const word x[6]) {
75
700k
   word3<word> accum;
76
77
700k
   accum.mul(x[0], x[0]);
78
700k
   z[0] = accum.extract();
79
700k
   accum.mul_x2(x[0], x[1]);
80
700k
   z[1] = accum.extract();
81
700k
   accum.mul_x2(x[0], x[2]);
82
700k
   accum.mul(x[1], x[1]);
83
700k
   z[2] = accum.extract();
84
700k
   accum.mul_x2(x[0], x[3]);
85
700k
   accum.mul_x2(x[1], x[2]);
86
700k
   z[3] = accum.extract();
87
700k
   accum.mul_x2(x[0], x[4]);
88
700k
   accum.mul_x2(x[1], x[3]);
89
700k
   accum.mul(x[2], x[2]);
90
700k
   z[4] = accum.extract();
91
700k
   accum.mul_x2(x[0], x[5]);
92
700k
   accum.mul_x2(x[1], x[4]);
93
700k
   accum.mul_x2(x[2], x[3]);
94
700k
   z[5] = accum.extract();
95
700k
   accum.mul_x2(x[1], x[5]);
96
700k
   accum.mul_x2(x[2], x[4]);
97
700k
   accum.mul(x[3], x[3]);
98
700k
   z[6] = accum.extract();
99
700k
   accum.mul_x2(x[2], x[5]);
100
700k
   accum.mul_x2(x[3], x[4]);
101
700k
   z[7] = accum.extract();
102
700k
   accum.mul_x2(x[3], x[5]);
103
700k
   accum.mul(x[4], x[4]);
104
700k
   z[8] = accum.extract();
105
700k
   accum.mul_x2(x[4], x[5]);
106
700k
   z[9] = accum.extract();
107
700k
   accum.mul(x[5], x[5]);
108
700k
   z[10] = accum.extract();
109
700k
   z[11] = accum.extract();
110
700k
}
111
112
/*
113
* Comba 6x6 Multiplication
114
*/
115
839k
void bigint_comba_mul6(word z[12], const word x[6], const word y[6]) {
116
839k
   word3<word> accum;
117
118
839k
   accum.mul(x[0], y[0]);
119
839k
   z[0] = accum.extract();
120
839k
   accum.mul(x[0], y[1]);
121
839k
   accum.mul(x[1], y[0]);
122
839k
   z[1] = accum.extract();
123
839k
   accum.mul(x[0], y[2]);
124
839k
   accum.mul(x[1], y[1]);
125
839k
   accum.mul(x[2], y[0]);
126
839k
   z[2] = accum.extract();
127
839k
   accum.mul(x[0], y[3]);
128
839k
   accum.mul(x[1], y[2]);
129
839k
   accum.mul(x[2], y[1]);
130
839k
   accum.mul(x[3], y[0]);
131
839k
   z[3] = accum.extract();
132
839k
   accum.mul(x[0], y[4]);
133
839k
   accum.mul(x[1], y[3]);
134
839k
   accum.mul(x[2], y[2]);
135
839k
   accum.mul(x[3], y[1]);
136
839k
   accum.mul(x[4], y[0]);
137
839k
   z[4] = accum.extract();
138
839k
   accum.mul(x[0], y[5]);
139
839k
   accum.mul(x[1], y[4]);
140
839k
   accum.mul(x[2], y[3]);
141
839k
   accum.mul(x[3], y[2]);
142
839k
   accum.mul(x[4], y[1]);
143
839k
   accum.mul(x[5], y[0]);
144
839k
   z[5] = accum.extract();
145
839k
   accum.mul(x[1], y[5]);
146
839k
   accum.mul(x[2], y[4]);
147
839k
   accum.mul(x[3], y[3]);
148
839k
   accum.mul(x[4], y[2]);
149
839k
   accum.mul(x[5], y[1]);
150
839k
   z[6] = accum.extract();
151
839k
   accum.mul(x[2], y[5]);
152
839k
   accum.mul(x[3], y[4]);
153
839k
   accum.mul(x[4], y[3]);
154
839k
   accum.mul(x[5], y[2]);
155
839k
   z[7] = accum.extract();
156
839k
   accum.mul(x[3], y[5]);
157
839k
   accum.mul(x[4], y[4]);
158
839k
   accum.mul(x[5], y[3]);
159
839k
   z[8] = accum.extract();
160
839k
   accum.mul(x[4], y[5]);
161
839k
   accum.mul(x[5], y[4]);
162
839k
   z[9] = accum.extract();
163
839k
   accum.mul(x[5], y[5]);
164
839k
   z[10] = accum.extract();
165
839k
   z[11] = accum.extract();
166
839k
}
167
168
/*
169
* Comba 7x7 Squaring
170
*/
171
0
void bigint_comba_sqr7(word z[14], const word x[7]) {
172
0
   word3<word> accum;
173
174
0
   accum.mul(x[0], x[0]);
175
0
   z[0] = accum.extract();
176
0
   accum.mul_x2(x[0], x[1]);
177
0
   z[1] = accum.extract();
178
0
   accum.mul_x2(x[0], x[2]);
179
0
   accum.mul(x[1], x[1]);
180
0
   z[2] = accum.extract();
181
0
   accum.mul_x2(x[0], x[3]);
182
0
   accum.mul_x2(x[1], x[2]);
183
0
   z[3] = accum.extract();
184
0
   accum.mul_x2(x[0], x[4]);
185
0
   accum.mul_x2(x[1], x[3]);
186
0
   accum.mul(x[2], x[2]);
187
0
   z[4] = accum.extract();
188
0
   accum.mul_x2(x[0], x[5]);
189
0
   accum.mul_x2(x[1], x[4]);
190
0
   accum.mul_x2(x[2], x[3]);
191
0
   z[5] = accum.extract();
192
0
   accum.mul_x2(x[0], x[6]);
193
0
   accum.mul_x2(x[1], x[5]);
194
0
   accum.mul_x2(x[2], x[4]);
195
0
   accum.mul(x[3], x[3]);
196
0
   z[6] = accum.extract();
197
0
   accum.mul_x2(x[1], x[6]);
198
0
   accum.mul_x2(x[2], x[5]);
199
0
   accum.mul_x2(x[3], x[4]);
200
0
   z[7] = accum.extract();
201
0
   accum.mul_x2(x[2], x[6]);
202
0
   accum.mul_x2(x[3], x[5]);
203
0
   accum.mul(x[4], x[4]);
204
0
   z[8] = accum.extract();
205
0
   accum.mul_x2(x[3], x[6]);
206
0
   accum.mul_x2(x[4], x[5]);
207
0
   z[9] = accum.extract();
208
0
   accum.mul_x2(x[4], x[6]);
209
0
   accum.mul(x[5], x[5]);
210
0
   z[10] = accum.extract();
211
0
   accum.mul_x2(x[5], x[6]);
212
0
   z[11] = accum.extract();
213
0
   accum.mul(x[6], x[6]);
214
0
   z[12] = accum.extract();
215
0
   z[13] = accum.extract();
216
0
}
217
218
/*
219
* Comba 7x7 Multiplication
220
*/
221
0
void bigint_comba_mul7(word z[14], const word x[7], const word y[7]) {
222
0
   word3<word> accum;
223
224
0
   accum.mul(x[0], y[0]);
225
0
   z[0] = accum.extract();
226
0
   accum.mul(x[0], y[1]);
227
0
   accum.mul(x[1], y[0]);
228
0
   z[1] = accum.extract();
229
0
   accum.mul(x[0], y[2]);
230
0
   accum.mul(x[1], y[1]);
231
0
   accum.mul(x[2], y[0]);
232
0
   z[2] = accum.extract();
233
0
   accum.mul(x[0], y[3]);
234
0
   accum.mul(x[1], y[2]);
235
0
   accum.mul(x[2], y[1]);
236
0
   accum.mul(x[3], y[0]);
237
0
   z[3] = accum.extract();
238
0
   accum.mul(x[0], y[4]);
239
0
   accum.mul(x[1], y[3]);
240
0
   accum.mul(x[2], y[2]);
241
0
   accum.mul(x[3], y[1]);
242
0
   accum.mul(x[4], y[0]);
243
0
   z[4] = accum.extract();
244
0
   accum.mul(x[0], y[5]);
245
0
   accum.mul(x[1], y[4]);
246
0
   accum.mul(x[2], y[3]);
247
0
   accum.mul(x[3], y[2]);
248
0
   accum.mul(x[4], y[1]);
249
0
   accum.mul(x[5], y[0]);
250
0
   z[5] = accum.extract();
251
0
   accum.mul(x[0], y[6]);
252
0
   accum.mul(x[1], y[5]);
253
0
   accum.mul(x[2], y[4]);
254
0
   accum.mul(x[3], y[3]);
255
0
   accum.mul(x[4], y[2]);
256
0
   accum.mul(x[5], y[1]);
257
0
   accum.mul(x[6], y[0]);
258
0
   z[6] = accum.extract();
259
0
   accum.mul(x[1], y[6]);
260
0
   accum.mul(x[2], y[5]);
261
0
   accum.mul(x[3], y[4]);
262
0
   accum.mul(x[4], y[3]);
263
0
   accum.mul(x[5], y[2]);
264
0
   accum.mul(x[6], y[1]);
265
0
   z[7] = accum.extract();
266
0
   accum.mul(x[2], y[6]);
267
0
   accum.mul(x[3], y[5]);
268
0
   accum.mul(x[4], y[4]);
269
0
   accum.mul(x[5], y[3]);
270
0
   accum.mul(x[6], y[2]);
271
0
   z[8] = accum.extract();
272
0
   accum.mul(x[3], y[6]);
273
0
   accum.mul(x[4], y[5]);
274
0
   accum.mul(x[5], y[4]);
275
0
   accum.mul(x[6], y[3]);
276
0
   z[9] = accum.extract();
277
0
   accum.mul(x[4], y[6]);
278
0
   accum.mul(x[5], y[5]);
279
0
   accum.mul(x[6], y[4]);
280
0
   z[10] = accum.extract();
281
0
   accum.mul(x[5], y[6]);
282
0
   accum.mul(x[6], y[5]);
283
0
   z[11] = accum.extract();
284
0
   accum.mul(x[6], y[6]);
285
0
   z[12] = accum.extract();
286
0
   z[13] = accum.extract();
287
0
}
288
289
/*
290
* Comba 8x8 Squaring
291
*/
292
1
void bigint_comba_sqr8(word z[16], const word x[8]) {
293
1
   word3<word> accum;
294
295
1
   accum.mul(x[0], x[0]);
296
1
   z[0] = accum.extract();
297
1
   accum.mul_x2(x[0], x[1]);
298
1
   z[1] = accum.extract();
299
1
   accum.mul_x2(x[0], x[2]);
300
1
   accum.mul(x[1], x[1]);
301
1
   z[2] = accum.extract();
302
1
   accum.mul_x2(x[0], x[3]);
303
1
   accum.mul_x2(x[1], x[2]);
304
1
   z[3] = accum.extract();
305
1
   accum.mul_x2(x[0], x[4]);
306
1
   accum.mul_x2(x[1], x[3]);
307
1
   accum.mul(x[2], x[2]);
308
1
   z[4] = accum.extract();
309
1
   accum.mul_x2(x[0], x[5]);
310
1
   accum.mul_x2(x[1], x[4]);
311
1
   accum.mul_x2(x[2], x[3]);
312
1
   z[5] = accum.extract();
313
1
   accum.mul_x2(x[0], x[6]);
314
1
   accum.mul_x2(x[1], x[5]);
315
1
   accum.mul_x2(x[2], x[4]);
316
1
   accum.mul(x[3], x[3]);
317
1
   z[6] = accum.extract();
318
1
   accum.mul_x2(x[0], x[7]);
319
1
   accum.mul_x2(x[1], x[6]);
320
1
   accum.mul_x2(x[2], x[5]);
321
1
   accum.mul_x2(x[3], x[4]);
322
1
   z[7] = accum.extract();
323
1
   accum.mul_x2(x[1], x[7]);
324
1
   accum.mul_x2(x[2], x[6]);
325
1
   accum.mul_x2(x[3], x[5]);
326
1
   accum.mul(x[4], x[4]);
327
1
   z[8] = accum.extract();
328
1
   accum.mul_x2(x[2], x[7]);
329
1
   accum.mul_x2(x[3], x[6]);
330
1
   accum.mul_x2(x[4], x[5]);
331
1
   z[9] = accum.extract();
332
1
   accum.mul_x2(x[3], x[7]);
333
1
   accum.mul_x2(x[4], x[6]);
334
1
   accum.mul(x[5], x[5]);
335
1
   z[10] = accum.extract();
336
1
   accum.mul_x2(x[4], x[7]);
337
1
   accum.mul_x2(x[5], x[6]);
338
1
   z[11] = accum.extract();
339
1
   accum.mul_x2(x[5], x[7]);
340
1
   accum.mul(x[6], x[6]);
341
1
   z[12] = accum.extract();
342
1
   accum.mul_x2(x[6], x[7]);
343
1
   z[13] = accum.extract();
344
1
   accum.mul(x[7], x[7]);
345
1
   z[14] = accum.extract();
346
1
   z[15] = accum.extract();
347
1
}
348
349
/*
350
* Comba 8x8 Multiplication
351
*/
352
1.05k
void bigint_comba_mul8(word z[16], const word x[8], const word y[8]) {
353
1.05k
   word3<word> accum;
354
355
1.05k
   accum.mul(x[0], y[0]);
356
1.05k
   z[0] = accum.extract();
357
1.05k
   accum.mul(x[0], y[1]);
358
1.05k
   accum.mul(x[1], y[0]);
359
1.05k
   z[1] = accum.extract();
360
1.05k
   accum.mul(x[0], y[2]);
361
1.05k
   accum.mul(x[1], y[1]);
362
1.05k
   accum.mul(x[2], y[0]);
363
1.05k
   z[2] = accum.extract();
364
1.05k
   accum.mul(x[0], y[3]);
365
1.05k
   accum.mul(x[1], y[2]);
366
1.05k
   accum.mul(x[2], y[1]);
367
1.05k
   accum.mul(x[3], y[0]);
368
1.05k
   z[3] = accum.extract();
369
1.05k
   accum.mul(x[0], y[4]);
370
1.05k
   accum.mul(x[1], y[3]);
371
1.05k
   accum.mul(x[2], y[2]);
372
1.05k
   accum.mul(x[3], y[1]);
373
1.05k
   accum.mul(x[4], y[0]);
374
1.05k
   z[4] = accum.extract();
375
1.05k
   accum.mul(x[0], y[5]);
376
1.05k
   accum.mul(x[1], y[4]);
377
1.05k
   accum.mul(x[2], y[3]);
378
1.05k
   accum.mul(x[3], y[2]);
379
1.05k
   accum.mul(x[4], y[1]);
380
1.05k
   accum.mul(x[5], y[0]);
381
1.05k
   z[5] = accum.extract();
382
1.05k
   accum.mul(x[0], y[6]);
383
1.05k
   accum.mul(x[1], y[5]);
384
1.05k
   accum.mul(x[2], y[4]);
385
1.05k
   accum.mul(x[3], y[3]);
386
1.05k
   accum.mul(x[4], y[2]);
387
1.05k
   accum.mul(x[5], y[1]);
388
1.05k
   accum.mul(x[6], y[0]);
389
1.05k
   z[6] = accum.extract();
390
1.05k
   accum.mul(x[0], y[7]);
391
1.05k
   accum.mul(x[1], y[6]);
392
1.05k
   accum.mul(x[2], y[5]);
393
1.05k
   accum.mul(x[3], y[4]);
394
1.05k
   accum.mul(x[4], y[3]);
395
1.05k
   accum.mul(x[5], y[2]);
396
1.05k
   accum.mul(x[6], y[1]);
397
1.05k
   accum.mul(x[7], y[0]);
398
1.05k
   z[7] = accum.extract();
399
1.05k
   accum.mul(x[1], y[7]);
400
1.05k
   accum.mul(x[2], y[6]);
401
1.05k
   accum.mul(x[3], y[5]);
402
1.05k
   accum.mul(x[4], y[4]);
403
1.05k
   accum.mul(x[5], y[3]);
404
1.05k
   accum.mul(x[6], y[2]);
405
1.05k
   accum.mul(x[7], y[1]);
406
1.05k
   z[8] = accum.extract();
407
1.05k
   accum.mul(x[2], y[7]);
408
1.05k
   accum.mul(x[3], y[6]);
409
1.05k
   accum.mul(x[4], y[5]);
410
1.05k
   accum.mul(x[5], y[4]);
411
1.05k
   accum.mul(x[6], y[3]);
412
1.05k
   accum.mul(x[7], y[2]);
413
1.05k
   z[9] = accum.extract();
414
1.05k
   accum.mul(x[3], y[7]);
415
1.05k
   accum.mul(x[4], y[6]);
416
1.05k
   accum.mul(x[5], y[5]);
417
1.05k
   accum.mul(x[6], y[4]);
418
1.05k
   accum.mul(x[7], y[3]);
419
1.05k
   z[10] = accum.extract();
420
1.05k
   accum.mul(x[4], y[7]);
421
1.05k
   accum.mul(x[5], y[6]);
422
1.05k
   accum.mul(x[6], y[5]);
423
1.05k
   accum.mul(x[7], y[4]);
424
1.05k
   z[11] = accum.extract();
425
1.05k
   accum.mul(x[5], y[7]);
426
1.05k
   accum.mul(x[6], y[6]);
427
1.05k
   accum.mul(x[7], y[5]);
428
1.05k
   z[12] = accum.extract();
429
1.05k
   accum.mul(x[6], y[7]);
430
1.05k
   accum.mul(x[7], y[6]);
431
1.05k
   z[13] = accum.extract();
432
1.05k
   accum.mul(x[7], y[7]);
433
1.05k
   z[14] = accum.extract();
434
1.05k
   z[15] = accum.extract();
435
1.05k
}
436
437
/*
438
* Comba 9x9 Squaring
439
*/
440
3
void bigint_comba_sqr9(word z[18], const word x[9]) {
441
3
   word3<word> accum;
442
443
3
   accum.mul(x[0], x[0]);
444
3
   z[0] = accum.extract();
445
3
   accum.mul_x2(x[0], x[1]);
446
3
   z[1] = accum.extract();
447
3
   accum.mul_x2(x[0], x[2]);
448
3
   accum.mul(x[1], x[1]);
449
3
   z[2] = accum.extract();
450
3
   accum.mul_x2(x[0], x[3]);
451
3
   accum.mul_x2(x[1], x[2]);
452
3
   z[3] = accum.extract();
453
3
   accum.mul_x2(x[0], x[4]);
454
3
   accum.mul_x2(x[1], x[3]);
455
3
   accum.mul(x[2], x[2]);
456
3
   z[4] = accum.extract();
457
3
   accum.mul_x2(x[0], x[5]);
458
3
   accum.mul_x2(x[1], x[4]);
459
3
   accum.mul_x2(x[2], x[3]);
460
3
   z[5] = accum.extract();
461
3
   accum.mul_x2(x[0], x[6]);
462
3
   accum.mul_x2(x[1], x[5]);
463
3
   accum.mul_x2(x[2], x[4]);
464
3
   accum.mul(x[3], x[3]);
465
3
   z[6] = accum.extract();
466
3
   accum.mul_x2(x[0], x[7]);
467
3
   accum.mul_x2(x[1], x[6]);
468
3
   accum.mul_x2(x[2], x[5]);
469
3
   accum.mul_x2(x[3], x[4]);
470
3
   z[7] = accum.extract();
471
3
   accum.mul_x2(x[0], x[8]);
472
3
   accum.mul_x2(x[1], x[7]);
473
3
   accum.mul_x2(x[2], x[6]);
474
3
   accum.mul_x2(x[3], x[5]);
475
3
   accum.mul(x[4], x[4]);
476
3
   z[8] = accum.extract();
477
3
   accum.mul_x2(x[1], x[8]);
478
3
   accum.mul_x2(x[2], x[7]);
479
3
   accum.mul_x2(x[3], x[6]);
480
3
   accum.mul_x2(x[4], x[5]);
481
3
   z[9] = accum.extract();
482
3
   accum.mul_x2(x[2], x[8]);
483
3
   accum.mul_x2(x[3], x[7]);
484
3
   accum.mul_x2(x[4], x[6]);
485
3
   accum.mul(x[5], x[5]);
486
3
   z[10] = accum.extract();
487
3
   accum.mul_x2(x[3], x[8]);
488
3
   accum.mul_x2(x[4], x[7]);
489
3
   accum.mul_x2(x[5], x[6]);
490
3
   z[11] = accum.extract();
491
3
   accum.mul_x2(x[4], x[8]);
492
3
   accum.mul_x2(x[5], x[7]);
493
3
   accum.mul(x[6], x[6]);
494
3
   z[12] = accum.extract();
495
3
   accum.mul_x2(x[5], x[8]);
496
3
   accum.mul_x2(x[6], x[7]);
497
3
   z[13] = accum.extract();
498
3
   accum.mul_x2(x[6], x[8]);
499
3
   accum.mul(x[7], x[7]);
500
3
   z[14] = accum.extract();
501
3
   accum.mul_x2(x[7], x[8]);
502
3
   z[15] = accum.extract();
503
3
   accum.mul(x[8], x[8]);
504
3
   z[16] = accum.extract();
505
3
   z[17] = accum.extract();
506
3
}
507
508
/*
509
* Comba 9x9 Multiplication
510
*/
511
2
void bigint_comba_mul9(word z[18], const word x[9], const word y[9]) {
512
2
   word3<word> accum;
513
514
2
   accum.mul(x[0], y[0]);
515
2
   z[0] = accum.extract();
516
2
   accum.mul(x[0], y[1]);
517
2
   accum.mul(x[1], y[0]);
518
2
   z[1] = accum.extract();
519
2
   accum.mul(x[0], y[2]);
520
2
   accum.mul(x[1], y[1]);
521
2
   accum.mul(x[2], y[0]);
522
2
   z[2] = accum.extract();
523
2
   accum.mul(x[0], y[3]);
524
2
   accum.mul(x[1], y[2]);
525
2
   accum.mul(x[2], y[1]);
526
2
   accum.mul(x[3], y[0]);
527
2
   z[3] = accum.extract();
528
2
   accum.mul(x[0], y[4]);
529
2
   accum.mul(x[1], y[3]);
530
2
   accum.mul(x[2], y[2]);
531
2
   accum.mul(x[3], y[1]);
532
2
   accum.mul(x[4], y[0]);
533
2
   z[4] = accum.extract();
534
2
   accum.mul(x[0], y[5]);
535
2
   accum.mul(x[1], y[4]);
536
2
   accum.mul(x[2], y[3]);
537
2
   accum.mul(x[3], y[2]);
538
2
   accum.mul(x[4], y[1]);
539
2
   accum.mul(x[5], y[0]);
540
2
   z[5] = accum.extract();
541
2
   accum.mul(x[0], y[6]);
542
2
   accum.mul(x[1], y[5]);
543
2
   accum.mul(x[2], y[4]);
544
2
   accum.mul(x[3], y[3]);
545
2
   accum.mul(x[4], y[2]);
546
2
   accum.mul(x[5], y[1]);
547
2
   accum.mul(x[6], y[0]);
548
2
   z[6] = accum.extract();
549
2
   accum.mul(x[0], y[7]);
550
2
   accum.mul(x[1], y[6]);
551
2
   accum.mul(x[2], y[5]);
552
2
   accum.mul(x[3], y[4]);
553
2
   accum.mul(x[4], y[3]);
554
2
   accum.mul(x[5], y[2]);
555
2
   accum.mul(x[6], y[1]);
556
2
   accum.mul(x[7], y[0]);
557
2
   z[7] = accum.extract();
558
2
   accum.mul(x[0], y[8]);
559
2
   accum.mul(x[1], y[7]);
560
2
   accum.mul(x[2], y[6]);
561
2
   accum.mul(x[3], y[5]);
562
2
   accum.mul(x[4], y[4]);
563
2
   accum.mul(x[5], y[3]);
564
2
   accum.mul(x[6], y[2]);
565
2
   accum.mul(x[7], y[1]);
566
2
   accum.mul(x[8], y[0]);
567
2
   z[8] = accum.extract();
568
2
   accum.mul(x[1], y[8]);
569
2
   accum.mul(x[2], y[7]);
570
2
   accum.mul(x[3], y[6]);
571
2
   accum.mul(x[4], y[5]);
572
2
   accum.mul(x[5], y[4]);
573
2
   accum.mul(x[6], y[3]);
574
2
   accum.mul(x[7], y[2]);
575
2
   accum.mul(x[8], y[1]);
576
2
   z[9] = accum.extract();
577
2
   accum.mul(x[2], y[8]);
578
2
   accum.mul(x[3], y[7]);
579
2
   accum.mul(x[4], y[6]);
580
2
   accum.mul(x[5], y[5]);
581
2
   accum.mul(x[6], y[4]);
582
2
   accum.mul(x[7], y[3]);
583
2
   accum.mul(x[8], y[2]);
584
2
   z[10] = accum.extract();
585
2
   accum.mul(x[3], y[8]);
586
2
   accum.mul(x[4], y[7]);
587
2
   accum.mul(x[5], y[6]);
588
2
   accum.mul(x[6], y[5]);
589
2
   accum.mul(x[7], y[4]);
590
2
   accum.mul(x[8], y[3]);
591
2
   z[11] = accum.extract();
592
2
   accum.mul(x[4], y[8]);
593
2
   accum.mul(x[5], y[7]);
594
2
   accum.mul(x[6], y[6]);
595
2
   accum.mul(x[7], y[5]);
596
2
   accum.mul(x[8], y[4]);
597
2
   z[12] = accum.extract();
598
2
   accum.mul(x[5], y[8]);
599
2
   accum.mul(x[6], y[7]);
600
2
   accum.mul(x[7], y[6]);
601
2
   accum.mul(x[8], y[5]);
602
2
   z[13] = accum.extract();
603
2
   accum.mul(x[6], y[8]);
604
2
   accum.mul(x[7], y[7]);
605
2
   accum.mul(x[8], y[6]);
606
2
   z[14] = accum.extract();
607
2
   accum.mul(x[7], y[8]);
608
2
   accum.mul(x[8], y[7]);
609
2
   z[15] = accum.extract();
610
2
   accum.mul(x[8], y[8]);
611
2
   z[16] = accum.extract();
612
2
   z[17] = accum.extract();
613
2
}
614
615
/*
616
* Comba 16x16 Squaring
617
*/
618
40
void bigint_comba_sqr16(word z[32], const word x[16]) {
619
40
   word3<word> accum;
620
621
40
   accum.mul(x[0], x[0]);
622
40
   z[0] = accum.extract();
623
40
   accum.mul_x2(x[0], x[1]);
624
40
   z[1] = accum.extract();
625
40
   accum.mul_x2(x[0], x[2]);
626
40
   accum.mul(x[1], x[1]);
627
40
   z[2] = accum.extract();
628
40
   accum.mul_x2(x[0], x[3]);
629
40
   accum.mul_x2(x[1], x[2]);
630
40
   z[3] = accum.extract();
631
40
   accum.mul_x2(x[0], x[4]);
632
40
   accum.mul_x2(x[1], x[3]);
633
40
   accum.mul(x[2], x[2]);
634
40
   z[4] = accum.extract();
635
40
   accum.mul_x2(x[0], x[5]);
636
40
   accum.mul_x2(x[1], x[4]);
637
40
   accum.mul_x2(x[2], x[3]);
638
40
   z[5] = accum.extract();
639
40
   accum.mul_x2(x[0], x[6]);
640
40
   accum.mul_x2(x[1], x[5]);
641
40
   accum.mul_x2(x[2], x[4]);
642
40
   accum.mul(x[3], x[3]);
643
40
   z[6] = accum.extract();
644
40
   accum.mul_x2(x[0], x[7]);
645
40
   accum.mul_x2(x[1], x[6]);
646
40
   accum.mul_x2(x[2], x[5]);
647
40
   accum.mul_x2(x[3], x[4]);
648
40
   z[7] = accum.extract();
649
40
   accum.mul_x2(x[0], x[8]);
650
40
   accum.mul_x2(x[1], x[7]);
651
40
   accum.mul_x2(x[2], x[6]);
652
40
   accum.mul_x2(x[3], x[5]);
653
40
   accum.mul(x[4], x[4]);
654
40
   z[8] = accum.extract();
655
40
   accum.mul_x2(x[0], x[9]);
656
40
   accum.mul_x2(x[1], x[8]);
657
40
   accum.mul_x2(x[2], x[7]);
658
40
   accum.mul_x2(x[3], x[6]);
659
40
   accum.mul_x2(x[4], x[5]);
660
40
   z[9] = accum.extract();
661
40
   accum.mul_x2(x[0], x[10]);
662
40
   accum.mul_x2(x[1], x[9]);
663
40
   accum.mul_x2(x[2], x[8]);
664
40
   accum.mul_x2(x[3], x[7]);
665
40
   accum.mul_x2(x[4], x[6]);
666
40
   accum.mul(x[5], x[5]);
667
40
   z[10] = accum.extract();
668
40
   accum.mul_x2(x[0], x[11]);
669
40
   accum.mul_x2(x[1], x[10]);
670
40
   accum.mul_x2(x[2], x[9]);
671
40
   accum.mul_x2(x[3], x[8]);
672
40
   accum.mul_x2(x[4], x[7]);
673
40
   accum.mul_x2(x[5], x[6]);
674
40
   z[11] = accum.extract();
675
40
   accum.mul_x2(x[0], x[12]);
676
40
   accum.mul_x2(x[1], x[11]);
677
40
   accum.mul_x2(x[2], x[10]);
678
40
   accum.mul_x2(x[3], x[9]);
679
40
   accum.mul_x2(x[4], x[8]);
680
40
   accum.mul_x2(x[5], x[7]);
681
40
   accum.mul(x[6], x[6]);
682
40
   z[12] = accum.extract();
683
40
   accum.mul_x2(x[0], x[13]);
684
40
   accum.mul_x2(x[1], x[12]);
685
40
   accum.mul_x2(x[2], x[11]);
686
40
   accum.mul_x2(x[3], x[10]);
687
40
   accum.mul_x2(x[4], x[9]);
688
40
   accum.mul_x2(x[5], x[8]);
689
40
   accum.mul_x2(x[6], x[7]);
690
40
   z[13] = accum.extract();
691
40
   accum.mul_x2(x[0], x[14]);
692
40
   accum.mul_x2(x[1], x[13]);
693
40
   accum.mul_x2(x[2], x[12]);
694
40
   accum.mul_x2(x[3], x[11]);
695
40
   accum.mul_x2(x[4], x[10]);
696
40
   accum.mul_x2(x[5], x[9]);
697
40
   accum.mul_x2(x[6], x[8]);
698
40
   accum.mul(x[7], x[7]);
699
40
   z[14] = accum.extract();
700
40
   accum.mul_x2(x[0], x[15]);
701
40
   accum.mul_x2(x[1], x[14]);
702
40
   accum.mul_x2(x[2], x[13]);
703
40
   accum.mul_x2(x[3], x[12]);
704
40
   accum.mul_x2(x[4], x[11]);
705
40
   accum.mul_x2(x[5], x[10]);
706
40
   accum.mul_x2(x[6], x[9]);
707
40
   accum.mul_x2(x[7], x[8]);
708
40
   z[15] = accum.extract();
709
40
   accum.mul_x2(x[1], x[15]);
710
40
   accum.mul_x2(x[2], x[14]);
711
40
   accum.mul_x2(x[3], x[13]);
712
40
   accum.mul_x2(x[4], x[12]);
713
40
   accum.mul_x2(x[5], x[11]);
714
40
   accum.mul_x2(x[6], x[10]);
715
40
   accum.mul_x2(x[7], x[9]);
716
40
   accum.mul(x[8], x[8]);
717
40
   z[16] = accum.extract();
718
40
   accum.mul_x2(x[2], x[15]);
719
40
   accum.mul_x2(x[3], x[14]);
720
40
   accum.mul_x2(x[4], x[13]);
721
40
   accum.mul_x2(x[5], x[12]);
722
40
   accum.mul_x2(x[6], x[11]);
723
40
   accum.mul_x2(x[7], x[10]);
724
40
   accum.mul_x2(x[8], x[9]);
725
40
   z[17] = accum.extract();
726
40
   accum.mul_x2(x[3], x[15]);
727
40
   accum.mul_x2(x[4], x[14]);
728
40
   accum.mul_x2(x[5], x[13]);
729
40
   accum.mul_x2(x[6], x[12]);
730
40
   accum.mul_x2(x[7], x[11]);
731
40
   accum.mul_x2(x[8], x[10]);
732
40
   accum.mul(x[9], x[9]);
733
40
   z[18] = accum.extract();
734
40
   accum.mul_x2(x[4], x[15]);
735
40
   accum.mul_x2(x[5], x[14]);
736
40
   accum.mul_x2(x[6], x[13]);
737
40
   accum.mul_x2(x[7], x[12]);
738
40
   accum.mul_x2(x[8], x[11]);
739
40
   accum.mul_x2(x[9], x[10]);
740
40
   z[19] = accum.extract();
741
40
   accum.mul_x2(x[5], x[15]);
742
40
   accum.mul_x2(x[6], x[14]);
743
40
   accum.mul_x2(x[7], x[13]);
744
40
   accum.mul_x2(x[8], x[12]);
745
40
   accum.mul_x2(x[9], x[11]);
746
40
   accum.mul(x[10], x[10]);
747
40
   z[20] = accum.extract();
748
40
   accum.mul_x2(x[6], x[15]);
749
40
   accum.mul_x2(x[7], x[14]);
750
40
   accum.mul_x2(x[8], x[13]);
751
40
   accum.mul_x2(x[9], x[12]);
752
40
   accum.mul_x2(x[10], x[11]);
753
40
   z[21] = accum.extract();
754
40
   accum.mul_x2(x[7], x[15]);
755
40
   accum.mul_x2(x[8], x[14]);
756
40
   accum.mul_x2(x[9], x[13]);
757
40
   accum.mul_x2(x[10], x[12]);
758
40
   accum.mul(x[11], x[11]);
759
40
   z[22] = accum.extract();
760
40
   accum.mul_x2(x[8], x[15]);
761
40
   accum.mul_x2(x[9], x[14]);
762
40
   accum.mul_x2(x[10], x[13]);
763
40
   accum.mul_x2(x[11], x[12]);
764
40
   z[23] = accum.extract();
765
40
   accum.mul_x2(x[9], x[15]);
766
40
   accum.mul_x2(x[10], x[14]);
767
40
   accum.mul_x2(x[11], x[13]);
768
40
   accum.mul(x[12], x[12]);
769
40
   z[24] = accum.extract();
770
40
   accum.mul_x2(x[10], x[15]);
771
40
   accum.mul_x2(x[11], x[14]);
772
40
   accum.mul_x2(x[12], x[13]);
773
40
   z[25] = accum.extract();
774
40
   accum.mul_x2(x[11], x[15]);
775
40
   accum.mul_x2(x[12], x[14]);
776
40
   accum.mul(x[13], x[13]);
777
40
   z[26] = accum.extract();
778
40
   accum.mul_x2(x[12], x[15]);
779
40
   accum.mul_x2(x[13], x[14]);
780
40
   z[27] = accum.extract();
781
40
   accum.mul_x2(x[13], x[15]);
782
40
   accum.mul(x[14], x[14]);
783
40
   z[28] = accum.extract();
784
40
   accum.mul_x2(x[14], x[15]);
785
40
   z[29] = accum.extract();
786
40
   accum.mul(x[15], x[15]);
787
40
   z[30] = accum.extract();
788
40
   z[31] = accum.extract();
789
40
}
790
791
/*
792
* Comba 16x16 Multiplication
793
*/
794
41
void bigint_comba_mul16(word z[32], const word x[16], const word y[16]) {
795
41
   word3<word> accum;
796
797
41
   accum.mul(x[0], y[0]);
798
41
   z[0] = accum.extract();
799
41
   accum.mul(x[0], y[1]);
800
41
   accum.mul(x[1], y[0]);
801
41
   z[1] = accum.extract();
802
41
   accum.mul(x[0], y[2]);
803
41
   accum.mul(x[1], y[1]);
804
41
   accum.mul(x[2], y[0]);
805
41
   z[2] = accum.extract();
806
41
   accum.mul(x[0], y[3]);
807
41
   accum.mul(x[1], y[2]);
808
41
   accum.mul(x[2], y[1]);
809
41
   accum.mul(x[3], y[0]);
810
41
   z[3] = accum.extract();
811
41
   accum.mul(x[0], y[4]);
812
41
   accum.mul(x[1], y[3]);
813
41
   accum.mul(x[2], y[2]);
814
41
   accum.mul(x[3], y[1]);
815
41
   accum.mul(x[4], y[0]);
816
41
   z[4] = accum.extract();
817
41
   accum.mul(x[0], y[5]);
818
41
   accum.mul(x[1], y[4]);
819
41
   accum.mul(x[2], y[3]);
820
41
   accum.mul(x[3], y[2]);
821
41
   accum.mul(x[4], y[1]);
822
41
   accum.mul(x[5], y[0]);
823
41
   z[5] = accum.extract();
824
41
   accum.mul(x[0], y[6]);
825
41
   accum.mul(x[1], y[5]);
826
41
   accum.mul(x[2], y[4]);
827
41
   accum.mul(x[3], y[3]);
828
41
   accum.mul(x[4], y[2]);
829
41
   accum.mul(x[5], y[1]);
830
41
   accum.mul(x[6], y[0]);
831
41
   z[6] = accum.extract();
832
41
   accum.mul(x[0], y[7]);
833
41
   accum.mul(x[1], y[6]);
834
41
   accum.mul(x[2], y[5]);
835
41
   accum.mul(x[3], y[4]);
836
41
   accum.mul(x[4], y[3]);
837
41
   accum.mul(x[5], y[2]);
838
41
   accum.mul(x[6], y[1]);
839
41
   accum.mul(x[7], y[0]);
840
41
   z[7] = accum.extract();
841
41
   accum.mul(x[0], y[8]);
842
41
   accum.mul(x[1], y[7]);
843
41
   accum.mul(x[2], y[6]);
844
41
   accum.mul(x[3], y[5]);
845
41
   accum.mul(x[4], y[4]);
846
41
   accum.mul(x[5], y[3]);
847
41
   accum.mul(x[6], y[2]);
848
41
   accum.mul(x[7], y[1]);
849
41
   accum.mul(x[8], y[0]);
850
41
   z[8] = accum.extract();
851
41
   accum.mul(x[0], y[9]);
852
41
   accum.mul(x[1], y[8]);
853
41
   accum.mul(x[2], y[7]);
854
41
   accum.mul(x[3], y[6]);
855
41
   accum.mul(x[4], y[5]);
856
41
   accum.mul(x[5], y[4]);
857
41
   accum.mul(x[6], y[3]);
858
41
   accum.mul(x[7], y[2]);
859
41
   accum.mul(x[8], y[1]);
860
41
   accum.mul(x[9], y[0]);
861
41
   z[9] = accum.extract();
862
41
   accum.mul(x[0], y[10]);
863
41
   accum.mul(x[1], y[9]);
864
41
   accum.mul(x[2], y[8]);
865
41
   accum.mul(x[3], y[7]);
866
41
   accum.mul(x[4], y[6]);
867
41
   accum.mul(x[5], y[5]);
868
41
   accum.mul(x[6], y[4]);
869
41
   accum.mul(x[7], y[3]);
870
41
   accum.mul(x[8], y[2]);
871
41
   accum.mul(x[9], y[1]);
872
41
   accum.mul(x[10], y[0]);
873
41
   z[10] = accum.extract();
874
41
   accum.mul(x[0], y[11]);
875
41
   accum.mul(x[1], y[10]);
876
41
   accum.mul(x[2], y[9]);
877
41
   accum.mul(x[3], y[8]);
878
41
   accum.mul(x[4], y[7]);
879
41
   accum.mul(x[5], y[6]);
880
41
   accum.mul(x[6], y[5]);
881
41
   accum.mul(x[7], y[4]);
882
41
   accum.mul(x[8], y[3]);
883
41
   accum.mul(x[9], y[2]);
884
41
   accum.mul(x[10], y[1]);
885
41
   accum.mul(x[11], y[0]);
886
41
   z[11] = accum.extract();
887
41
   accum.mul(x[0], y[12]);
888
41
   accum.mul(x[1], y[11]);
889
41
   accum.mul(x[2], y[10]);
890
41
   accum.mul(x[3], y[9]);
891
41
   accum.mul(x[4], y[8]);
892
41
   accum.mul(x[5], y[7]);
893
41
   accum.mul(x[6], y[6]);
894
41
   accum.mul(x[7], y[5]);
895
41
   accum.mul(x[8], y[4]);
896
41
   accum.mul(x[9], y[3]);
897
41
   accum.mul(x[10], y[2]);
898
41
   accum.mul(x[11], y[1]);
899
41
   accum.mul(x[12], y[0]);
900
41
   z[12] = accum.extract();
901
41
   accum.mul(x[0], y[13]);
902
41
   accum.mul(x[1], y[12]);
903
41
   accum.mul(x[2], y[11]);
904
41
   accum.mul(x[3], y[10]);
905
41
   accum.mul(x[4], y[9]);
906
41
   accum.mul(x[5], y[8]);
907
41
   accum.mul(x[6], y[7]);
908
41
   accum.mul(x[7], y[6]);
909
41
   accum.mul(x[8], y[5]);
910
41
   accum.mul(x[9], y[4]);
911
41
   accum.mul(x[10], y[3]);
912
41
   accum.mul(x[11], y[2]);
913
41
   accum.mul(x[12], y[1]);
914
41
   accum.mul(x[13], y[0]);
915
41
   z[13] = accum.extract();
916
41
   accum.mul(x[0], y[14]);
917
41
   accum.mul(x[1], y[13]);
918
41
   accum.mul(x[2], y[12]);
919
41
   accum.mul(x[3], y[11]);
920
41
   accum.mul(x[4], y[10]);
921
41
   accum.mul(x[5], y[9]);
922
41
   accum.mul(x[6], y[8]);
923
41
   accum.mul(x[7], y[7]);
924
41
   accum.mul(x[8], y[6]);
925
41
   accum.mul(x[9], y[5]);
926
41
   accum.mul(x[10], y[4]);
927
41
   accum.mul(x[11], y[3]);
928
41
   accum.mul(x[12], y[2]);
929
41
   accum.mul(x[13], y[1]);
930
41
   accum.mul(x[14], y[0]);
931
41
   z[14] = accum.extract();
932
41
   accum.mul(x[0], y[15]);
933
41
   accum.mul(x[1], y[14]);
934
41
   accum.mul(x[2], y[13]);
935
41
   accum.mul(x[3], y[12]);
936
41
   accum.mul(x[4], y[11]);
937
41
   accum.mul(x[5], y[10]);
938
41
   accum.mul(x[6], y[9]);
939
41
   accum.mul(x[7], y[8]);
940
41
   accum.mul(x[8], y[7]);
941
41
   accum.mul(x[9], y[6]);
942
41
   accum.mul(x[10], y[5]);
943
41
   accum.mul(x[11], y[4]);
944
41
   accum.mul(x[12], y[3]);
945
41
   accum.mul(x[13], y[2]);
946
41
   accum.mul(x[14], y[1]);
947
41
   accum.mul(x[15], y[0]);
948
41
   z[15] = accum.extract();
949
41
   accum.mul(x[1], y[15]);
950
41
   accum.mul(x[2], y[14]);
951
41
   accum.mul(x[3], y[13]);
952
41
   accum.mul(x[4], y[12]);
953
41
   accum.mul(x[5], y[11]);
954
41
   accum.mul(x[6], y[10]);
955
41
   accum.mul(x[7], y[9]);
956
41
   accum.mul(x[8], y[8]);
957
41
   accum.mul(x[9], y[7]);
958
41
   accum.mul(x[10], y[6]);
959
41
   accum.mul(x[11], y[5]);
960
41
   accum.mul(x[12], y[4]);
961
41
   accum.mul(x[13], y[3]);
962
41
   accum.mul(x[14], y[2]);
963
41
   accum.mul(x[15], y[1]);
964
41
   z[16] = accum.extract();
965
41
   accum.mul(x[2], y[15]);
966
41
   accum.mul(x[3], y[14]);
967
41
   accum.mul(x[4], y[13]);
968
41
   accum.mul(x[5], y[12]);
969
41
   accum.mul(x[6], y[11]);
970
41
   accum.mul(x[7], y[10]);
971
41
   accum.mul(x[8], y[9]);
972
41
   accum.mul(x[9], y[8]);
973
41
   accum.mul(x[10], y[7]);
974
41
   accum.mul(x[11], y[6]);
975
41
   accum.mul(x[12], y[5]);
976
41
   accum.mul(x[13], y[4]);
977
41
   accum.mul(x[14], y[3]);
978
41
   accum.mul(x[15], y[2]);
979
41
   z[17] = accum.extract();
980
41
   accum.mul(x[3], y[15]);
981
41
   accum.mul(x[4], y[14]);
982
41
   accum.mul(x[5], y[13]);
983
41
   accum.mul(x[6], y[12]);
984
41
   accum.mul(x[7], y[11]);
985
41
   accum.mul(x[8], y[10]);
986
41
   accum.mul(x[9], y[9]);
987
41
   accum.mul(x[10], y[8]);
988
41
   accum.mul(x[11], y[7]);
989
41
   accum.mul(x[12], y[6]);
990
41
   accum.mul(x[13], y[5]);
991
41
   accum.mul(x[14], y[4]);
992
41
   accum.mul(x[15], y[3]);
993
41
   z[18] = accum.extract();
994
41
   accum.mul(x[4], y[15]);
995
41
   accum.mul(x[5], y[14]);
996
41
   accum.mul(x[6], y[13]);
997
41
   accum.mul(x[7], y[12]);
998
41
   accum.mul(x[8], y[11]);
999
41
   accum.mul(x[9], y[10]);
1000
41
   accum.mul(x[10], y[9]);
1001
41
   accum.mul(x[11], y[8]);
1002
41
   accum.mul(x[12], y[7]);
1003
41
   accum.mul(x[13], y[6]);
1004
41
   accum.mul(x[14], y[5]);
1005
41
   accum.mul(x[15], y[4]);
1006
41
   z[19] = accum.extract();
1007
41
   accum.mul(x[5], y[15]);
1008
41
   accum.mul(x[6], y[14]);
1009
41
   accum.mul(x[7], y[13]);
1010
41
   accum.mul(x[8], y[12]);
1011
41
   accum.mul(x[9], y[11]);
1012
41
   accum.mul(x[10], y[10]);
1013
41
   accum.mul(x[11], y[9]);
1014
41
   accum.mul(x[12], y[8]);
1015
41
   accum.mul(x[13], y[7]);
1016
41
   accum.mul(x[14], y[6]);
1017
41
   accum.mul(x[15], y[5]);
1018
41
   z[20] = accum.extract();
1019
41
   accum.mul(x[6], y[15]);
1020
41
   accum.mul(x[7], y[14]);
1021
41
   accum.mul(x[8], y[13]);
1022
41
   accum.mul(x[9], y[12]);
1023
41
   accum.mul(x[10], y[11]);
1024
41
   accum.mul(x[11], y[10]);
1025
41
   accum.mul(x[12], y[9]);
1026
41
   accum.mul(x[13], y[8]);
1027
41
   accum.mul(x[14], y[7]);
1028
41
   accum.mul(x[15], y[6]);
1029
41
   z[21] = accum.extract();
1030
41
   accum.mul(x[7], y[15]);
1031
41
   accum.mul(x[8], y[14]);
1032
41
   accum.mul(x[9], y[13]);
1033
41
   accum.mul(x[10], y[12]);
1034
41
   accum.mul(x[11], y[11]);
1035
41
   accum.mul(x[12], y[10]);
1036
41
   accum.mul(x[13], y[9]);
1037
41
   accum.mul(x[14], y[8]);
1038
41
   accum.mul(x[15], y[7]);
1039
41
   z[22] = accum.extract();
1040
41
   accum.mul(x[8], y[15]);
1041
41
   accum.mul(x[9], y[14]);
1042
41
   accum.mul(x[10], y[13]);
1043
41
   accum.mul(x[11], y[12]);
1044
41
   accum.mul(x[12], y[11]);
1045
41
   accum.mul(x[13], y[10]);
1046
41
   accum.mul(x[14], y[9]);
1047
41
   accum.mul(x[15], y[8]);
1048
41
   z[23] = accum.extract();
1049
41
   accum.mul(x[9], y[15]);
1050
41
   accum.mul(x[10], y[14]);
1051
41
   accum.mul(x[11], y[13]);
1052
41
   accum.mul(x[12], y[12]);
1053
41
   accum.mul(x[13], y[11]);
1054
41
   accum.mul(x[14], y[10]);
1055
41
   accum.mul(x[15], y[9]);
1056
41
   z[24] = accum.extract();
1057
41
   accum.mul(x[10], y[15]);
1058
41
   accum.mul(x[11], y[14]);
1059
41
   accum.mul(x[12], y[13]);
1060
41
   accum.mul(x[13], y[12]);
1061
41
   accum.mul(x[14], y[11]);
1062
41
   accum.mul(x[15], y[10]);
1063
41
   z[25] = accum.extract();
1064
41
   accum.mul(x[11], y[15]);
1065
41
   accum.mul(x[12], y[14]);
1066
41
   accum.mul(x[13], y[13]);
1067
41
   accum.mul(x[14], y[12]);
1068
41
   accum.mul(x[15], y[11]);
1069
41
   z[26] = accum.extract();
1070
41
   accum.mul(x[12], y[15]);
1071
41
   accum.mul(x[13], y[14]);
1072
41
   accum.mul(x[14], y[13]);
1073
41
   accum.mul(x[15], y[12]);
1074
41
   z[27] = accum.extract();
1075
41
   accum.mul(x[13], y[15]);
1076
41
   accum.mul(x[14], y[14]);
1077
41
   accum.mul(x[15], y[13]);
1078
41
   z[28] = accum.extract();
1079
41
   accum.mul(x[14], y[15]);
1080
41
   accum.mul(x[15], y[14]);
1081
41
   z[29] = accum.extract();
1082
41
   accum.mul(x[15], y[15]);
1083
41
   z[30] = accum.extract();
1084
41
   z[31] = accum.extract();
1085
41
}
1086
1087
/*
1088
* Comba 24x24 Squaring
1089
*/
1090
49
void bigint_comba_sqr24(word z[48], const word x[24]) {
1091
49
   word3<word> accum;
1092
1093
49
   accum.mul(x[0], x[0]);
1094
49
   z[0] = accum.extract();
1095
49
   accum.mul_x2(x[0], x[1]);
1096
49
   z[1] = accum.extract();
1097
49
   accum.mul_x2(x[0], x[2]);
1098
49
   accum.mul(x[1], x[1]);
1099
49
   z[2] = accum.extract();
1100
49
   accum.mul_x2(x[0], x[3]);
1101
49
   accum.mul_x2(x[1], x[2]);
1102
49
   z[3] = accum.extract();
1103
49
   accum.mul_x2(x[0], x[4]);
1104
49
   accum.mul_x2(x[1], x[3]);
1105
49
   accum.mul(x[2], x[2]);
1106
49
   z[4] = accum.extract();
1107
49
   accum.mul_x2(x[0], x[5]);
1108
49
   accum.mul_x2(x[1], x[4]);
1109
49
   accum.mul_x2(x[2], x[3]);
1110
49
   z[5] = accum.extract();
1111
49
   accum.mul_x2(x[0], x[6]);
1112
49
   accum.mul_x2(x[1], x[5]);
1113
49
   accum.mul_x2(x[2], x[4]);
1114
49
   accum.mul(x[3], x[3]);
1115
49
   z[6] = accum.extract();
1116
49
   accum.mul_x2(x[0], x[7]);
1117
49
   accum.mul_x2(x[1], x[6]);
1118
49
   accum.mul_x2(x[2], x[5]);
1119
49
   accum.mul_x2(x[3], x[4]);
1120
49
   z[7] = accum.extract();
1121
49
   accum.mul_x2(x[0], x[8]);
1122
49
   accum.mul_x2(x[1], x[7]);
1123
49
   accum.mul_x2(x[2], x[6]);
1124
49
   accum.mul_x2(x[3], x[5]);
1125
49
   accum.mul(x[4], x[4]);
1126
49
   z[8] = accum.extract();
1127
49
   accum.mul_x2(x[0], x[9]);
1128
49
   accum.mul_x2(x[1], x[8]);
1129
49
   accum.mul_x2(x[2], x[7]);
1130
49
   accum.mul_x2(x[3], x[6]);
1131
49
   accum.mul_x2(x[4], x[5]);
1132
49
   z[9] = accum.extract();
1133
49
   accum.mul_x2(x[0], x[10]);
1134
49
   accum.mul_x2(x[1], x[9]);
1135
49
   accum.mul_x2(x[2], x[8]);
1136
49
   accum.mul_x2(x[3], x[7]);
1137
49
   accum.mul_x2(x[4], x[6]);
1138
49
   accum.mul(x[5], x[5]);
1139
49
   z[10] = accum.extract();
1140
49
   accum.mul_x2(x[0], x[11]);
1141
49
   accum.mul_x2(x[1], x[10]);
1142
49
   accum.mul_x2(x[2], x[9]);
1143
49
   accum.mul_x2(x[3], x[8]);
1144
49
   accum.mul_x2(x[4], x[7]);
1145
49
   accum.mul_x2(x[5], x[6]);
1146
49
   z[11] = accum.extract();
1147
49
   accum.mul_x2(x[0], x[12]);
1148
49
   accum.mul_x2(x[1], x[11]);
1149
49
   accum.mul_x2(x[2], x[10]);
1150
49
   accum.mul_x2(x[3], x[9]);
1151
49
   accum.mul_x2(x[4], x[8]);
1152
49
   accum.mul_x2(x[5], x[7]);
1153
49
   accum.mul(x[6], x[6]);
1154
49
   z[12] = accum.extract();
1155
49
   accum.mul_x2(x[0], x[13]);
1156
49
   accum.mul_x2(x[1], x[12]);
1157
49
   accum.mul_x2(x[2], x[11]);
1158
49
   accum.mul_x2(x[3], x[10]);
1159
49
   accum.mul_x2(x[4], x[9]);
1160
49
   accum.mul_x2(x[5], x[8]);
1161
49
   accum.mul_x2(x[6], x[7]);
1162
49
   z[13] = accum.extract();
1163
49
   accum.mul_x2(x[0], x[14]);
1164
49
   accum.mul_x2(x[1], x[13]);
1165
49
   accum.mul_x2(x[2], x[12]);
1166
49
   accum.mul_x2(x[3], x[11]);
1167
49
   accum.mul_x2(x[4], x[10]);
1168
49
   accum.mul_x2(x[5], x[9]);
1169
49
   accum.mul_x2(x[6], x[8]);
1170
49
   accum.mul(x[7], x[7]);
1171
49
   z[14] = accum.extract();
1172
49
   accum.mul_x2(x[0], x[15]);
1173
49
   accum.mul_x2(x[1], x[14]);
1174
49
   accum.mul_x2(x[2], x[13]);
1175
49
   accum.mul_x2(x[3], x[12]);
1176
49
   accum.mul_x2(x[4], x[11]);
1177
49
   accum.mul_x2(x[5], x[10]);
1178
49
   accum.mul_x2(x[6], x[9]);
1179
49
   accum.mul_x2(x[7], x[8]);
1180
49
   z[15] = accum.extract();
1181
49
   accum.mul_x2(x[0], x[16]);
1182
49
   accum.mul_x2(x[1], x[15]);
1183
49
   accum.mul_x2(x[2], x[14]);
1184
49
   accum.mul_x2(x[3], x[13]);
1185
49
   accum.mul_x2(x[4], x[12]);
1186
49
   accum.mul_x2(x[5], x[11]);
1187
49
   accum.mul_x2(x[6], x[10]);
1188
49
   accum.mul_x2(x[7], x[9]);
1189
49
   accum.mul(x[8], x[8]);
1190
49
   z[16] = accum.extract();
1191
49
   accum.mul_x2(x[0], x[17]);
1192
49
   accum.mul_x2(x[1], x[16]);
1193
49
   accum.mul_x2(x[2], x[15]);
1194
49
   accum.mul_x2(x[3], x[14]);
1195
49
   accum.mul_x2(x[4], x[13]);
1196
49
   accum.mul_x2(x[5], x[12]);
1197
49
   accum.mul_x2(x[6], x[11]);
1198
49
   accum.mul_x2(x[7], x[10]);
1199
49
   accum.mul_x2(x[8], x[9]);
1200
49
   z[17] = accum.extract();
1201
49
   accum.mul_x2(x[0], x[18]);
1202
49
   accum.mul_x2(x[1], x[17]);
1203
49
   accum.mul_x2(x[2], x[16]);
1204
49
   accum.mul_x2(x[3], x[15]);
1205
49
   accum.mul_x2(x[4], x[14]);
1206
49
   accum.mul_x2(x[5], x[13]);
1207
49
   accum.mul_x2(x[6], x[12]);
1208
49
   accum.mul_x2(x[7], x[11]);
1209
49
   accum.mul_x2(x[8], x[10]);
1210
49
   accum.mul(x[9], x[9]);
1211
49
   z[18] = accum.extract();
1212
49
   accum.mul_x2(x[0], x[19]);
1213
49
   accum.mul_x2(x[1], x[18]);
1214
49
   accum.mul_x2(x[2], x[17]);
1215
49
   accum.mul_x2(x[3], x[16]);
1216
49
   accum.mul_x2(x[4], x[15]);
1217
49
   accum.mul_x2(x[5], x[14]);
1218
49
   accum.mul_x2(x[6], x[13]);
1219
49
   accum.mul_x2(x[7], x[12]);
1220
49
   accum.mul_x2(x[8], x[11]);
1221
49
   accum.mul_x2(x[9], x[10]);
1222
49
   z[19] = accum.extract();
1223
49
   accum.mul_x2(x[0], x[20]);
1224
49
   accum.mul_x2(x[1], x[19]);
1225
49
   accum.mul_x2(x[2], x[18]);
1226
49
   accum.mul_x2(x[3], x[17]);
1227
49
   accum.mul_x2(x[4], x[16]);
1228
49
   accum.mul_x2(x[5], x[15]);
1229
49
   accum.mul_x2(x[6], x[14]);
1230
49
   accum.mul_x2(x[7], x[13]);
1231
49
   accum.mul_x2(x[8], x[12]);
1232
49
   accum.mul_x2(x[9], x[11]);
1233
49
   accum.mul(x[10], x[10]);
1234
49
   z[20] = accum.extract();
1235
49
   accum.mul_x2(x[0], x[21]);
1236
49
   accum.mul_x2(x[1], x[20]);
1237
49
   accum.mul_x2(x[2], x[19]);
1238
49
   accum.mul_x2(x[3], x[18]);
1239
49
   accum.mul_x2(x[4], x[17]);
1240
49
   accum.mul_x2(x[5], x[16]);
1241
49
   accum.mul_x2(x[6], x[15]);
1242
49
   accum.mul_x2(x[7], x[14]);
1243
49
   accum.mul_x2(x[8], x[13]);
1244
49
   accum.mul_x2(x[9], x[12]);
1245
49
   accum.mul_x2(x[10], x[11]);
1246
49
   z[21] = accum.extract();
1247
49
   accum.mul_x2(x[0], x[22]);
1248
49
   accum.mul_x2(x[1], x[21]);
1249
49
   accum.mul_x2(x[2], x[20]);
1250
49
   accum.mul_x2(x[3], x[19]);
1251
49
   accum.mul_x2(x[4], x[18]);
1252
49
   accum.mul_x2(x[5], x[17]);
1253
49
   accum.mul_x2(x[6], x[16]);
1254
49
   accum.mul_x2(x[7], x[15]);
1255
49
   accum.mul_x2(x[8], x[14]);
1256
49
   accum.mul_x2(x[9], x[13]);
1257
49
   accum.mul_x2(x[10], x[12]);
1258
49
   accum.mul(x[11], x[11]);
1259
49
   z[22] = accum.extract();
1260
49
   accum.mul_x2(x[0], x[23]);
1261
49
   accum.mul_x2(x[1], x[22]);
1262
49
   accum.mul_x2(x[2], x[21]);
1263
49
   accum.mul_x2(x[3], x[20]);
1264
49
   accum.mul_x2(x[4], x[19]);
1265
49
   accum.mul_x2(x[5], x[18]);
1266
49
   accum.mul_x2(x[6], x[17]);
1267
49
   accum.mul_x2(x[7], x[16]);
1268
49
   accum.mul_x2(x[8], x[15]);
1269
49
   accum.mul_x2(x[9], x[14]);
1270
49
   accum.mul_x2(x[10], x[13]);
1271
49
   accum.mul_x2(x[11], x[12]);
1272
49
   z[23] = accum.extract();
1273
49
   accum.mul_x2(x[1], x[23]);
1274
49
   accum.mul_x2(x[2], x[22]);
1275
49
   accum.mul_x2(x[3], x[21]);
1276
49
   accum.mul_x2(x[4], x[20]);
1277
49
   accum.mul_x2(x[5], x[19]);
1278
49
   accum.mul_x2(x[6], x[18]);
1279
49
   accum.mul_x2(x[7], x[17]);
1280
49
   accum.mul_x2(x[8], x[16]);
1281
49
   accum.mul_x2(x[9], x[15]);
1282
49
   accum.mul_x2(x[10], x[14]);
1283
49
   accum.mul_x2(x[11], x[13]);
1284
49
   accum.mul(x[12], x[12]);
1285
49
   z[24] = accum.extract();
1286
49
   accum.mul_x2(x[2], x[23]);
1287
49
   accum.mul_x2(x[3], x[22]);
1288
49
   accum.mul_x2(x[4], x[21]);
1289
49
   accum.mul_x2(x[5], x[20]);
1290
49
   accum.mul_x2(x[6], x[19]);
1291
49
   accum.mul_x2(x[7], x[18]);
1292
49
   accum.mul_x2(x[8], x[17]);
1293
49
   accum.mul_x2(x[9], x[16]);
1294
49
   accum.mul_x2(x[10], x[15]);
1295
49
   accum.mul_x2(x[11], x[14]);
1296
49
   accum.mul_x2(x[12], x[13]);
1297
49
   z[25] = accum.extract();
1298
49
   accum.mul_x2(x[3], x[23]);
1299
49
   accum.mul_x2(x[4], x[22]);
1300
49
   accum.mul_x2(x[5], x[21]);
1301
49
   accum.mul_x2(x[6], x[20]);
1302
49
   accum.mul_x2(x[7], x[19]);
1303
49
   accum.mul_x2(x[8], x[18]);
1304
49
   accum.mul_x2(x[9], x[17]);
1305
49
   accum.mul_x2(x[10], x[16]);
1306
49
   accum.mul_x2(x[11], x[15]);
1307
49
   accum.mul_x2(x[12], x[14]);
1308
49
   accum.mul(x[13], x[13]);
1309
49
   z[26] = accum.extract();
1310
49
   accum.mul_x2(x[4], x[23]);
1311
49
   accum.mul_x2(x[5], x[22]);
1312
49
   accum.mul_x2(x[6], x[21]);
1313
49
   accum.mul_x2(x[7], x[20]);
1314
49
   accum.mul_x2(x[8], x[19]);
1315
49
   accum.mul_x2(x[9], x[18]);
1316
49
   accum.mul_x2(x[10], x[17]);
1317
49
   accum.mul_x2(x[11], x[16]);
1318
49
   accum.mul_x2(x[12], x[15]);
1319
49
   accum.mul_x2(x[13], x[14]);
1320
49
   z[27] = accum.extract();
1321
49
   accum.mul_x2(x[5], x[23]);
1322
49
   accum.mul_x2(x[6], x[22]);
1323
49
   accum.mul_x2(x[7], x[21]);
1324
49
   accum.mul_x2(x[8], x[20]);
1325
49
   accum.mul_x2(x[9], x[19]);
1326
49
   accum.mul_x2(x[10], x[18]);
1327
49
   accum.mul_x2(x[11], x[17]);
1328
49
   accum.mul_x2(x[12], x[16]);
1329
49
   accum.mul_x2(x[13], x[15]);
1330
49
   accum.mul(x[14], x[14]);
1331
49
   z[28] = accum.extract();
1332
49
   accum.mul_x2(x[6], x[23]);
1333
49
   accum.mul_x2(x[7], x[22]);
1334
49
   accum.mul_x2(x[8], x[21]);
1335
49
   accum.mul_x2(x[9], x[20]);
1336
49
   accum.mul_x2(x[10], x[19]);
1337
49
   accum.mul_x2(x[11], x[18]);
1338
49
   accum.mul_x2(x[12], x[17]);
1339
49
   accum.mul_x2(x[13], x[16]);
1340
49
   accum.mul_x2(x[14], x[15]);
1341
49
   z[29] = accum.extract();
1342
49
   accum.mul_x2(x[7], x[23]);
1343
49
   accum.mul_x2(x[8], x[22]);
1344
49
   accum.mul_x2(x[9], x[21]);
1345
49
   accum.mul_x2(x[10], x[20]);
1346
49
   accum.mul_x2(x[11], x[19]);
1347
49
   accum.mul_x2(x[12], x[18]);
1348
49
   accum.mul_x2(x[13], x[17]);
1349
49
   accum.mul_x2(x[14], x[16]);
1350
49
   accum.mul(x[15], x[15]);
1351
49
   z[30] = accum.extract();
1352
49
   accum.mul_x2(x[8], x[23]);
1353
49
   accum.mul_x2(x[9], x[22]);
1354
49
   accum.mul_x2(x[10], x[21]);
1355
49
   accum.mul_x2(x[11], x[20]);
1356
49
   accum.mul_x2(x[12], x[19]);
1357
49
   accum.mul_x2(x[13], x[18]);
1358
49
   accum.mul_x2(x[14], x[17]);
1359
49
   accum.mul_x2(x[15], x[16]);
1360
49
   z[31] = accum.extract();
1361
49
   accum.mul_x2(x[9], x[23]);
1362
49
   accum.mul_x2(x[10], x[22]);
1363
49
   accum.mul_x2(x[11], x[21]);
1364
49
   accum.mul_x2(x[12], x[20]);
1365
49
   accum.mul_x2(x[13], x[19]);
1366
49
   accum.mul_x2(x[14], x[18]);
1367
49
   accum.mul_x2(x[15], x[17]);
1368
49
   accum.mul(x[16], x[16]);
1369
49
   z[32] = accum.extract();
1370
49
   accum.mul_x2(x[10], x[23]);
1371
49
   accum.mul_x2(x[11], x[22]);
1372
49
   accum.mul_x2(x[12], x[21]);
1373
49
   accum.mul_x2(x[13], x[20]);
1374
49
   accum.mul_x2(x[14], x[19]);
1375
49
   accum.mul_x2(x[15], x[18]);
1376
49
   accum.mul_x2(x[16], x[17]);
1377
49
   z[33] = accum.extract();
1378
49
   accum.mul_x2(x[11], x[23]);
1379
49
   accum.mul_x2(x[12], x[22]);
1380
49
   accum.mul_x2(x[13], x[21]);
1381
49
   accum.mul_x2(x[14], x[20]);
1382
49
   accum.mul_x2(x[15], x[19]);
1383
49
   accum.mul_x2(x[16], x[18]);
1384
49
   accum.mul(x[17], x[17]);
1385
49
   z[34] = accum.extract();
1386
49
   accum.mul_x2(x[12], x[23]);
1387
49
   accum.mul_x2(x[13], x[22]);
1388
49
   accum.mul_x2(x[14], x[21]);
1389
49
   accum.mul_x2(x[15], x[20]);
1390
49
   accum.mul_x2(x[16], x[19]);
1391
49
   accum.mul_x2(x[17], x[18]);
1392
49
   z[35] = accum.extract();
1393
49
   accum.mul_x2(x[13], x[23]);
1394
49
   accum.mul_x2(x[14], x[22]);
1395
49
   accum.mul_x2(x[15], x[21]);
1396
49
   accum.mul_x2(x[16], x[20]);
1397
49
   accum.mul_x2(x[17], x[19]);
1398
49
   accum.mul(x[18], x[18]);
1399
49
   z[36] = accum.extract();
1400
49
   accum.mul_x2(x[14], x[23]);
1401
49
   accum.mul_x2(x[15], x[22]);
1402
49
   accum.mul_x2(x[16], x[21]);
1403
49
   accum.mul_x2(x[17], x[20]);
1404
49
   accum.mul_x2(x[18], x[19]);
1405
49
   z[37] = accum.extract();
1406
49
   accum.mul_x2(x[15], x[23]);
1407
49
   accum.mul_x2(x[16], x[22]);
1408
49
   accum.mul_x2(x[17], x[21]);
1409
49
   accum.mul_x2(x[18], x[20]);
1410
49
   accum.mul(x[19], x[19]);
1411
49
   z[38] = accum.extract();
1412
49
   accum.mul_x2(x[16], x[23]);
1413
49
   accum.mul_x2(x[17], x[22]);
1414
49
   accum.mul_x2(x[18], x[21]);
1415
49
   accum.mul_x2(x[19], x[20]);
1416
49
   z[39] = accum.extract();
1417
49
   accum.mul_x2(x[17], x[23]);
1418
49
   accum.mul_x2(x[18], x[22]);
1419
49
   accum.mul_x2(x[19], x[21]);
1420
49
   accum.mul(x[20], x[20]);
1421
49
   z[40] = accum.extract();
1422
49
   accum.mul_x2(x[18], x[23]);
1423
49
   accum.mul_x2(x[19], x[22]);
1424
49
   accum.mul_x2(x[20], x[21]);
1425
49
   z[41] = accum.extract();
1426
49
   accum.mul_x2(x[19], x[23]);
1427
49
   accum.mul_x2(x[20], x[22]);
1428
49
   accum.mul(x[21], x[21]);
1429
49
   z[42] = accum.extract();
1430
49
   accum.mul_x2(x[20], x[23]);
1431
49
   accum.mul_x2(x[21], x[22]);
1432
49
   z[43] = accum.extract();
1433
49
   accum.mul_x2(x[21], x[23]);
1434
49
   accum.mul(x[22], x[22]);
1435
49
   z[44] = accum.extract();
1436
49
   accum.mul_x2(x[22], x[23]);
1437
49
   z[45] = accum.extract();
1438
49
   accum.mul(x[23], x[23]);
1439
49
   z[46] = accum.extract();
1440
49
   z[47] = accum.extract();
1441
49
}
1442
1443
/*
1444
* Comba 24x24 Multiplication
1445
*/
1446
33
void bigint_comba_mul24(word z[48], const word x[24], const word y[24]) {
1447
33
   word3<word> accum;
1448
1449
33
   accum.mul(x[0], y[0]);
1450
33
   z[0] = accum.extract();
1451
33
   accum.mul(x[0], y[1]);
1452
33
   accum.mul(x[1], y[0]);
1453
33
   z[1] = accum.extract();
1454
33
   accum.mul(x[0], y[2]);
1455
33
   accum.mul(x[1], y[1]);
1456
33
   accum.mul(x[2], y[0]);
1457
33
   z[2] = accum.extract();
1458
33
   accum.mul(x[0], y[3]);
1459
33
   accum.mul(x[1], y[2]);
1460
33
   accum.mul(x[2], y[1]);
1461
33
   accum.mul(x[3], y[0]);
1462
33
   z[3] = accum.extract();
1463
33
   accum.mul(x[0], y[4]);
1464
33
   accum.mul(x[1], y[3]);
1465
33
   accum.mul(x[2], y[2]);
1466
33
   accum.mul(x[3], y[1]);
1467
33
   accum.mul(x[4], y[0]);
1468
33
   z[4] = accum.extract();
1469
33
   accum.mul(x[0], y[5]);
1470
33
   accum.mul(x[1], y[4]);
1471
33
   accum.mul(x[2], y[3]);
1472
33
   accum.mul(x[3], y[2]);
1473
33
   accum.mul(x[4], y[1]);
1474
33
   accum.mul(x[5], y[0]);
1475
33
   z[5] = accum.extract();
1476
33
   accum.mul(x[0], y[6]);
1477
33
   accum.mul(x[1], y[5]);
1478
33
   accum.mul(x[2], y[4]);
1479
33
   accum.mul(x[3], y[3]);
1480
33
   accum.mul(x[4], y[2]);
1481
33
   accum.mul(x[5], y[1]);
1482
33
   accum.mul(x[6], y[0]);
1483
33
   z[6] = accum.extract();
1484
33
   accum.mul(x[0], y[7]);
1485
33
   accum.mul(x[1], y[6]);
1486
33
   accum.mul(x[2], y[5]);
1487
33
   accum.mul(x[3], y[4]);
1488
33
   accum.mul(x[4], y[3]);
1489
33
   accum.mul(x[5], y[2]);
1490
33
   accum.mul(x[6], y[1]);
1491
33
   accum.mul(x[7], y[0]);
1492
33
   z[7] = accum.extract();
1493
33
   accum.mul(x[0], y[8]);
1494
33
   accum.mul(x[1], y[7]);
1495
33
   accum.mul(x[2], y[6]);
1496
33
   accum.mul(x[3], y[5]);
1497
33
   accum.mul(x[4], y[4]);
1498
33
   accum.mul(x[5], y[3]);
1499
33
   accum.mul(x[6], y[2]);
1500
33
   accum.mul(x[7], y[1]);
1501
33
   accum.mul(x[8], y[0]);
1502
33
   z[8] = accum.extract();
1503
33
   accum.mul(x[0], y[9]);
1504
33
   accum.mul(x[1], y[8]);
1505
33
   accum.mul(x[2], y[7]);
1506
33
   accum.mul(x[3], y[6]);
1507
33
   accum.mul(x[4], y[5]);
1508
33
   accum.mul(x[5], y[4]);
1509
33
   accum.mul(x[6], y[3]);
1510
33
   accum.mul(x[7], y[2]);
1511
33
   accum.mul(x[8], y[1]);
1512
33
   accum.mul(x[9], y[0]);
1513
33
   z[9] = accum.extract();
1514
33
   accum.mul(x[0], y[10]);
1515
33
   accum.mul(x[1], y[9]);
1516
33
   accum.mul(x[2], y[8]);
1517
33
   accum.mul(x[3], y[7]);
1518
33
   accum.mul(x[4], y[6]);
1519
33
   accum.mul(x[5], y[5]);
1520
33
   accum.mul(x[6], y[4]);
1521
33
   accum.mul(x[7], y[3]);
1522
33
   accum.mul(x[8], y[2]);
1523
33
   accum.mul(x[9], y[1]);
1524
33
   accum.mul(x[10], y[0]);
1525
33
   z[10] = accum.extract();
1526
33
   accum.mul(x[0], y[11]);
1527
33
   accum.mul(x[1], y[10]);
1528
33
   accum.mul(x[2], y[9]);
1529
33
   accum.mul(x[3], y[8]);
1530
33
   accum.mul(x[4], y[7]);
1531
33
   accum.mul(x[5], y[6]);
1532
33
   accum.mul(x[6], y[5]);
1533
33
   accum.mul(x[7], y[4]);
1534
33
   accum.mul(x[8], y[3]);
1535
33
   accum.mul(x[9], y[2]);
1536
33
   accum.mul(x[10], y[1]);
1537
33
   accum.mul(x[11], y[0]);
1538
33
   z[11] = accum.extract();
1539
33
   accum.mul(x[0], y[12]);
1540
33
   accum.mul(x[1], y[11]);
1541
33
   accum.mul(x[2], y[10]);
1542
33
   accum.mul(x[3], y[9]);
1543
33
   accum.mul(x[4], y[8]);
1544
33
   accum.mul(x[5], y[7]);
1545
33
   accum.mul(x[6], y[6]);
1546
33
   accum.mul(x[7], y[5]);
1547
33
   accum.mul(x[8], y[4]);
1548
33
   accum.mul(x[9], y[3]);
1549
33
   accum.mul(x[10], y[2]);
1550
33
   accum.mul(x[11], y[1]);
1551
33
   accum.mul(x[12], y[0]);
1552
33
   z[12] = accum.extract();
1553
33
   accum.mul(x[0], y[13]);
1554
33
   accum.mul(x[1], y[12]);
1555
33
   accum.mul(x[2], y[11]);
1556
33
   accum.mul(x[3], y[10]);
1557
33
   accum.mul(x[4], y[9]);
1558
33
   accum.mul(x[5], y[8]);
1559
33
   accum.mul(x[6], y[7]);
1560
33
   accum.mul(x[7], y[6]);
1561
33
   accum.mul(x[8], y[5]);
1562
33
   accum.mul(x[9], y[4]);
1563
33
   accum.mul(x[10], y[3]);
1564
33
   accum.mul(x[11], y[2]);
1565
33
   accum.mul(x[12], y[1]);
1566
33
   accum.mul(x[13], y[0]);
1567
33
   z[13] = accum.extract();
1568
33
   accum.mul(x[0], y[14]);
1569
33
   accum.mul(x[1], y[13]);
1570
33
   accum.mul(x[2], y[12]);
1571
33
   accum.mul(x[3], y[11]);
1572
33
   accum.mul(x[4], y[10]);
1573
33
   accum.mul(x[5], y[9]);
1574
33
   accum.mul(x[6], y[8]);
1575
33
   accum.mul(x[7], y[7]);
1576
33
   accum.mul(x[8], y[6]);
1577
33
   accum.mul(x[9], y[5]);
1578
33
   accum.mul(x[10], y[4]);
1579
33
   accum.mul(x[11], y[3]);
1580
33
   accum.mul(x[12], y[2]);
1581
33
   accum.mul(x[13], y[1]);
1582
33
   accum.mul(x[14], y[0]);
1583
33
   z[14] = accum.extract();
1584
33
   accum.mul(x[0], y[15]);
1585
33
   accum.mul(x[1], y[14]);
1586
33
   accum.mul(x[2], y[13]);
1587
33
   accum.mul(x[3], y[12]);
1588
33
   accum.mul(x[4], y[11]);
1589
33
   accum.mul(x[5], y[10]);
1590
33
   accum.mul(x[6], y[9]);
1591
33
   accum.mul(x[7], y[8]);
1592
33
   accum.mul(x[8], y[7]);
1593
33
   accum.mul(x[9], y[6]);
1594
33
   accum.mul(x[10], y[5]);
1595
33
   accum.mul(x[11], y[4]);
1596
33
   accum.mul(x[12], y[3]);
1597
33
   accum.mul(x[13], y[2]);
1598
33
   accum.mul(x[14], y[1]);
1599
33
   accum.mul(x[15], y[0]);
1600
33
   z[15] = accum.extract();
1601
33
   accum.mul(x[0], y[16]);
1602
33
   accum.mul(x[1], y[15]);
1603
33
   accum.mul(x[2], y[14]);
1604
33
   accum.mul(x[3], y[13]);
1605
33
   accum.mul(x[4], y[12]);
1606
33
   accum.mul(x[5], y[11]);
1607
33
   accum.mul(x[6], y[10]);
1608
33
   accum.mul(x[7], y[9]);
1609
33
   accum.mul(x[8], y[8]);
1610
33
   accum.mul(x[9], y[7]);
1611
33
   accum.mul(x[10], y[6]);
1612
33
   accum.mul(x[11], y[5]);
1613
33
   accum.mul(x[12], y[4]);
1614
33
   accum.mul(x[13], y[3]);
1615
33
   accum.mul(x[14], y[2]);
1616
33
   accum.mul(x[15], y[1]);
1617
33
   accum.mul(x[16], y[0]);
1618
33
   z[16] = accum.extract();
1619
33
   accum.mul(x[0], y[17]);
1620
33
   accum.mul(x[1], y[16]);
1621
33
   accum.mul(x[2], y[15]);
1622
33
   accum.mul(x[3], y[14]);
1623
33
   accum.mul(x[4], y[13]);
1624
33
   accum.mul(x[5], y[12]);
1625
33
   accum.mul(x[6], y[11]);
1626
33
   accum.mul(x[7], y[10]);
1627
33
   accum.mul(x[8], y[9]);
1628
33
   accum.mul(x[9], y[8]);
1629
33
   accum.mul(x[10], y[7]);
1630
33
   accum.mul(x[11], y[6]);
1631
33
   accum.mul(x[12], y[5]);
1632
33
   accum.mul(x[13], y[4]);
1633
33
   accum.mul(x[14], y[3]);
1634
33
   accum.mul(x[15], y[2]);
1635
33
   accum.mul(x[16], y[1]);
1636
33
   accum.mul(x[17], y[0]);
1637
33
   z[17] = accum.extract();
1638
33
   accum.mul(x[0], y[18]);
1639
33
   accum.mul(x[1], y[17]);
1640
33
   accum.mul(x[2], y[16]);
1641
33
   accum.mul(x[3], y[15]);
1642
33
   accum.mul(x[4], y[14]);
1643
33
   accum.mul(x[5], y[13]);
1644
33
   accum.mul(x[6], y[12]);
1645
33
   accum.mul(x[7], y[11]);
1646
33
   accum.mul(x[8], y[10]);
1647
33
   accum.mul(x[9], y[9]);
1648
33
   accum.mul(x[10], y[8]);
1649
33
   accum.mul(x[11], y[7]);
1650
33
   accum.mul(x[12], y[6]);
1651
33
   accum.mul(x[13], y[5]);
1652
33
   accum.mul(x[14], y[4]);
1653
33
   accum.mul(x[15], y[3]);
1654
33
   accum.mul(x[16], y[2]);
1655
33
   accum.mul(x[17], y[1]);
1656
33
   accum.mul(x[18], y[0]);
1657
33
   z[18] = accum.extract();
1658
33
   accum.mul(x[0], y[19]);
1659
33
   accum.mul(x[1], y[18]);
1660
33
   accum.mul(x[2], y[17]);
1661
33
   accum.mul(x[3], y[16]);
1662
33
   accum.mul(x[4], y[15]);
1663
33
   accum.mul(x[5], y[14]);
1664
33
   accum.mul(x[6], y[13]);
1665
33
   accum.mul(x[7], y[12]);
1666
33
   accum.mul(x[8], y[11]);
1667
33
   accum.mul(x[9], y[10]);
1668
33
   accum.mul(x[10], y[9]);
1669
33
   accum.mul(x[11], y[8]);
1670
33
   accum.mul(x[12], y[7]);
1671
33
   accum.mul(x[13], y[6]);
1672
33
   accum.mul(x[14], y[5]);
1673
33
   accum.mul(x[15], y[4]);
1674
33
   accum.mul(x[16], y[3]);
1675
33
   accum.mul(x[17], y[2]);
1676
33
   accum.mul(x[18], y[1]);
1677
33
   accum.mul(x[19], y[0]);
1678
33
   z[19] = accum.extract();
1679
33
   accum.mul(x[0], y[20]);
1680
33
   accum.mul(x[1], y[19]);
1681
33
   accum.mul(x[2], y[18]);
1682
33
   accum.mul(x[3], y[17]);
1683
33
   accum.mul(x[4], y[16]);
1684
33
   accum.mul(x[5], y[15]);
1685
33
   accum.mul(x[6], y[14]);
1686
33
   accum.mul(x[7], y[13]);
1687
33
   accum.mul(x[8], y[12]);
1688
33
   accum.mul(x[9], y[11]);
1689
33
   accum.mul(x[10], y[10]);
1690
33
   accum.mul(x[11], y[9]);
1691
33
   accum.mul(x[12], y[8]);
1692
33
   accum.mul(x[13], y[7]);
1693
33
   accum.mul(x[14], y[6]);
1694
33
   accum.mul(x[15], y[5]);
1695
33
   accum.mul(x[16], y[4]);
1696
33
   accum.mul(x[17], y[3]);
1697
33
   accum.mul(x[18], y[2]);
1698
33
   accum.mul(x[19], y[1]);
1699
33
   accum.mul(x[20], y[0]);
1700
33
   z[20] = accum.extract();
1701
33
   accum.mul(x[0], y[21]);
1702
33
   accum.mul(x[1], y[20]);
1703
33
   accum.mul(x[2], y[19]);
1704
33
   accum.mul(x[3], y[18]);
1705
33
   accum.mul(x[4], y[17]);
1706
33
   accum.mul(x[5], y[16]);
1707
33
   accum.mul(x[6], y[15]);
1708
33
   accum.mul(x[7], y[14]);
1709
33
   accum.mul(x[8], y[13]);
1710
33
   accum.mul(x[9], y[12]);
1711
33
   accum.mul(x[10], y[11]);
1712
33
   accum.mul(x[11], y[10]);
1713
33
   accum.mul(x[12], y[9]);
1714
33
   accum.mul(x[13], y[8]);
1715
33
   accum.mul(x[14], y[7]);
1716
33
   accum.mul(x[15], y[6]);
1717
33
   accum.mul(x[16], y[5]);
1718
33
   accum.mul(x[17], y[4]);
1719
33
   accum.mul(x[18], y[3]);
1720
33
   accum.mul(x[19], y[2]);
1721
33
   accum.mul(x[20], y[1]);
1722
33
   accum.mul(x[21], y[0]);
1723
33
   z[21] = accum.extract();
1724
33
   accum.mul(x[0], y[22]);
1725
33
   accum.mul(x[1], y[21]);
1726
33
   accum.mul(x[2], y[20]);
1727
33
   accum.mul(x[3], y[19]);
1728
33
   accum.mul(x[4], y[18]);
1729
33
   accum.mul(x[5], y[17]);
1730
33
   accum.mul(x[6], y[16]);
1731
33
   accum.mul(x[7], y[15]);
1732
33
   accum.mul(x[8], y[14]);
1733
33
   accum.mul(x[9], y[13]);
1734
33
   accum.mul(x[10], y[12]);
1735
33
   accum.mul(x[11], y[11]);
1736
33
   accum.mul(x[12], y[10]);
1737
33
   accum.mul(x[13], y[9]);
1738
33
   accum.mul(x[14], y[8]);
1739
33
   accum.mul(x[15], y[7]);
1740
33
   accum.mul(x[16], y[6]);
1741
33
   accum.mul(x[17], y[5]);
1742
33
   accum.mul(x[18], y[4]);
1743
33
   accum.mul(x[19], y[3]);
1744
33
   accum.mul(x[20], y[2]);
1745
33
   accum.mul(x[21], y[1]);
1746
33
   accum.mul(x[22], y[0]);
1747
33
   z[22] = accum.extract();
1748
33
   accum.mul(x[0], y[23]);
1749
33
   accum.mul(x[1], y[22]);
1750
33
   accum.mul(x[2], y[21]);
1751
33
   accum.mul(x[3], y[20]);
1752
33
   accum.mul(x[4], y[19]);
1753
33
   accum.mul(x[5], y[18]);
1754
33
   accum.mul(x[6], y[17]);
1755
33
   accum.mul(x[7], y[16]);
1756
33
   accum.mul(x[8], y[15]);
1757
33
   accum.mul(x[9], y[14]);
1758
33
   accum.mul(x[10], y[13]);
1759
33
   accum.mul(x[11], y[12]);
1760
33
   accum.mul(x[12], y[11]);
1761
33
   accum.mul(x[13], y[10]);
1762
33
   accum.mul(x[14], y[9]);
1763
33
   accum.mul(x[15], y[8]);
1764
33
   accum.mul(x[16], y[7]);
1765
33
   accum.mul(x[17], y[6]);
1766
33
   accum.mul(x[18], y[5]);
1767
33
   accum.mul(x[19], y[4]);
1768
33
   accum.mul(x[20], y[3]);
1769
33
   accum.mul(x[21], y[2]);
1770
33
   accum.mul(x[22], y[1]);
1771
33
   accum.mul(x[23], y[0]);
1772
33
   z[23] = accum.extract();
1773
33
   accum.mul(x[1], y[23]);
1774
33
   accum.mul(x[2], y[22]);
1775
33
   accum.mul(x[3], y[21]);
1776
33
   accum.mul(x[4], y[20]);
1777
33
   accum.mul(x[5], y[19]);
1778
33
   accum.mul(x[6], y[18]);
1779
33
   accum.mul(x[7], y[17]);
1780
33
   accum.mul(x[8], y[16]);
1781
33
   accum.mul(x[9], y[15]);
1782
33
   accum.mul(x[10], y[14]);
1783
33
   accum.mul(x[11], y[13]);
1784
33
   accum.mul(x[12], y[12]);
1785
33
   accum.mul(x[13], y[11]);
1786
33
   accum.mul(x[14], y[10]);
1787
33
   accum.mul(x[15], y[9]);
1788
33
   accum.mul(x[16], y[8]);
1789
33
   accum.mul(x[17], y[7]);
1790
33
   accum.mul(x[18], y[6]);
1791
33
   accum.mul(x[19], y[5]);
1792
33
   accum.mul(x[20], y[4]);
1793
33
   accum.mul(x[21], y[3]);
1794
33
   accum.mul(x[22], y[2]);
1795
33
   accum.mul(x[23], y[1]);
1796
33
   z[24] = accum.extract();
1797
33
   accum.mul(x[2], y[23]);
1798
33
   accum.mul(x[3], y[22]);
1799
33
   accum.mul(x[4], y[21]);
1800
33
   accum.mul(x[5], y[20]);
1801
33
   accum.mul(x[6], y[19]);
1802
33
   accum.mul(x[7], y[18]);
1803
33
   accum.mul(x[8], y[17]);
1804
33
   accum.mul(x[9], y[16]);
1805
33
   accum.mul(x[10], y[15]);
1806
33
   accum.mul(x[11], y[14]);
1807
33
   accum.mul(x[12], y[13]);
1808
33
   accum.mul(x[13], y[12]);
1809
33
   accum.mul(x[14], y[11]);
1810
33
   accum.mul(x[15], y[10]);
1811
33
   accum.mul(x[16], y[9]);
1812
33
   accum.mul(x[17], y[8]);
1813
33
   accum.mul(x[18], y[7]);
1814
33
   accum.mul(x[19], y[6]);
1815
33
   accum.mul(x[20], y[5]);
1816
33
   accum.mul(x[21], y[4]);
1817
33
   accum.mul(x[22], y[3]);
1818
33
   accum.mul(x[23], y[2]);
1819
33
   z[25] = accum.extract();
1820
33
   accum.mul(x[3], y[23]);
1821
33
   accum.mul(x[4], y[22]);
1822
33
   accum.mul(x[5], y[21]);
1823
33
   accum.mul(x[6], y[20]);
1824
33
   accum.mul(x[7], y[19]);
1825
33
   accum.mul(x[8], y[18]);
1826
33
   accum.mul(x[9], y[17]);
1827
33
   accum.mul(x[10], y[16]);
1828
33
   accum.mul(x[11], y[15]);
1829
33
   accum.mul(x[12], y[14]);
1830
33
   accum.mul(x[13], y[13]);
1831
33
   accum.mul(x[14], y[12]);
1832
33
   accum.mul(x[15], y[11]);
1833
33
   accum.mul(x[16], y[10]);
1834
33
   accum.mul(x[17], y[9]);
1835
33
   accum.mul(x[18], y[8]);
1836
33
   accum.mul(x[19], y[7]);
1837
33
   accum.mul(x[20], y[6]);
1838
33
   accum.mul(x[21], y[5]);
1839
33
   accum.mul(x[22], y[4]);
1840
33
   accum.mul(x[23], y[3]);
1841
33
   z[26] = accum.extract();
1842
33
   accum.mul(x[4], y[23]);
1843
33
   accum.mul(x[5], y[22]);
1844
33
   accum.mul(x[6], y[21]);
1845
33
   accum.mul(x[7], y[20]);
1846
33
   accum.mul(x[8], y[19]);
1847
33
   accum.mul(x[9], y[18]);
1848
33
   accum.mul(x[10], y[17]);
1849
33
   accum.mul(x[11], y[16]);
1850
33
   accum.mul(x[12], y[15]);
1851
33
   accum.mul(x[13], y[14]);
1852
33
   accum.mul(x[14], y[13]);
1853
33
   accum.mul(x[15], y[12]);
1854
33
   accum.mul(x[16], y[11]);
1855
33
   accum.mul(x[17], y[10]);
1856
33
   accum.mul(x[18], y[9]);
1857
33
   accum.mul(x[19], y[8]);
1858
33
   accum.mul(x[20], y[7]);
1859
33
   accum.mul(x[21], y[6]);
1860
33
   accum.mul(x[22], y[5]);
1861
33
   accum.mul(x[23], y[4]);
1862
33
   z[27] = accum.extract();
1863
33
   accum.mul(x[5], y[23]);
1864
33
   accum.mul(x[6], y[22]);
1865
33
   accum.mul(x[7], y[21]);
1866
33
   accum.mul(x[8], y[20]);
1867
33
   accum.mul(x[9], y[19]);
1868
33
   accum.mul(x[10], y[18]);
1869
33
   accum.mul(x[11], y[17]);
1870
33
   accum.mul(x[12], y[16]);
1871
33
   accum.mul(x[13], y[15]);
1872
33
   accum.mul(x[14], y[14]);
1873
33
   accum.mul(x[15], y[13]);
1874
33
   accum.mul(x[16], y[12]);
1875
33
   accum.mul(x[17], y[11]);
1876
33
   accum.mul(x[18], y[10]);
1877
33
   accum.mul(x[19], y[9]);
1878
33
   accum.mul(x[20], y[8]);
1879
33
   accum.mul(x[21], y[7]);
1880
33
   accum.mul(x[22], y[6]);
1881
33
   accum.mul(x[23], y[5]);
1882
33
   z[28] = accum.extract();
1883
33
   accum.mul(x[6], y[23]);
1884
33
   accum.mul(x[7], y[22]);
1885
33
   accum.mul(x[8], y[21]);
1886
33
   accum.mul(x[9], y[20]);
1887
33
   accum.mul(x[10], y[19]);
1888
33
   accum.mul(x[11], y[18]);
1889
33
   accum.mul(x[12], y[17]);
1890
33
   accum.mul(x[13], y[16]);
1891
33
   accum.mul(x[14], y[15]);
1892
33
   accum.mul(x[15], y[14]);
1893
33
   accum.mul(x[16], y[13]);
1894
33
   accum.mul(x[17], y[12]);
1895
33
   accum.mul(x[18], y[11]);
1896
33
   accum.mul(x[19], y[10]);
1897
33
   accum.mul(x[20], y[9]);
1898
33
   accum.mul(x[21], y[8]);
1899
33
   accum.mul(x[22], y[7]);
1900
33
   accum.mul(x[23], y[6]);
1901
33
   z[29] = accum.extract();
1902
33
   accum.mul(x[7], y[23]);
1903
33
   accum.mul(x[8], y[22]);
1904
33
   accum.mul(x[9], y[21]);
1905
33
   accum.mul(x[10], y[20]);
1906
33
   accum.mul(x[11], y[19]);
1907
33
   accum.mul(x[12], y[18]);
1908
33
   accum.mul(x[13], y[17]);
1909
33
   accum.mul(x[14], y[16]);
1910
33
   accum.mul(x[15], y[15]);
1911
33
   accum.mul(x[16], y[14]);
1912
33
   accum.mul(x[17], y[13]);
1913
33
   accum.mul(x[18], y[12]);
1914
33
   accum.mul(x[19], y[11]);
1915
33
   accum.mul(x[20], y[10]);
1916
33
   accum.mul(x[21], y[9]);
1917
33
   accum.mul(x[22], y[8]);
1918
33
   accum.mul(x[23], y[7]);
1919
33
   z[30] = accum.extract();
1920
33
   accum.mul(x[8], y[23]);
1921
33
   accum.mul(x[9], y[22]);
1922
33
   accum.mul(x[10], y[21]);
1923
33
   accum.mul(x[11], y[20]);
1924
33
   accum.mul(x[12], y[19]);
1925
33
   accum.mul(x[13], y[18]);
1926
33
   accum.mul(x[14], y[17]);
1927
33
   accum.mul(x[15], y[16]);
1928
33
   accum.mul(x[16], y[15]);
1929
33
   accum.mul(x[17], y[14]);
1930
33
   accum.mul(x[18], y[13]);
1931
33
   accum.mul(x[19], y[12]);
1932
33
   accum.mul(x[20], y[11]);
1933
33
   accum.mul(x[21], y[10]);
1934
33
   accum.mul(x[22], y[9]);
1935
33
   accum.mul(x[23], y[8]);
1936
33
   z[31] = accum.extract();
1937
33
   accum.mul(x[9], y[23]);
1938
33
   accum.mul(x[10], y[22]);
1939
33
   accum.mul(x[11], y[21]);
1940
33
   accum.mul(x[12], y[20]);
1941
33
   accum.mul(x[13], y[19]);
1942
33
   accum.mul(x[14], y[18]);
1943
33
   accum.mul(x[15], y[17]);
1944
33
   accum.mul(x[16], y[16]);
1945
33
   accum.mul(x[17], y[15]);
1946
33
   accum.mul(x[18], y[14]);
1947
33
   accum.mul(x[19], y[13]);
1948
33
   accum.mul(x[20], y[12]);
1949
33
   accum.mul(x[21], y[11]);
1950
33
   accum.mul(x[22], y[10]);
1951
33
   accum.mul(x[23], y[9]);
1952
33
   z[32] = accum.extract();
1953
33
   accum.mul(x[10], y[23]);
1954
33
   accum.mul(x[11], y[22]);
1955
33
   accum.mul(x[12], y[21]);
1956
33
   accum.mul(x[13], y[20]);
1957
33
   accum.mul(x[14], y[19]);
1958
33
   accum.mul(x[15], y[18]);
1959
33
   accum.mul(x[16], y[17]);
1960
33
   accum.mul(x[17], y[16]);
1961
33
   accum.mul(x[18], y[15]);
1962
33
   accum.mul(x[19], y[14]);
1963
33
   accum.mul(x[20], y[13]);
1964
33
   accum.mul(x[21], y[12]);
1965
33
   accum.mul(x[22], y[11]);
1966
33
   accum.mul(x[23], y[10]);
1967
33
   z[33] = accum.extract();
1968
33
   accum.mul(x[11], y[23]);
1969
33
   accum.mul(x[12], y[22]);
1970
33
   accum.mul(x[13], y[21]);
1971
33
   accum.mul(x[14], y[20]);
1972
33
   accum.mul(x[15], y[19]);
1973
33
   accum.mul(x[16], y[18]);
1974
33
   accum.mul(x[17], y[17]);
1975
33
   accum.mul(x[18], y[16]);
1976
33
   accum.mul(x[19], y[15]);
1977
33
   accum.mul(x[20], y[14]);
1978
33
   accum.mul(x[21], y[13]);
1979
33
   accum.mul(x[22], y[12]);
1980
33
   accum.mul(x[23], y[11]);
1981
33
   z[34] = accum.extract();
1982
33
   accum.mul(x[12], y[23]);
1983
33
   accum.mul(x[13], y[22]);
1984
33
   accum.mul(x[14], y[21]);
1985
33
   accum.mul(x[15], y[20]);
1986
33
   accum.mul(x[16], y[19]);
1987
33
   accum.mul(x[17], y[18]);
1988
33
   accum.mul(x[18], y[17]);
1989
33
   accum.mul(x[19], y[16]);
1990
33
   accum.mul(x[20], y[15]);
1991
33
   accum.mul(x[21], y[14]);
1992
33
   accum.mul(x[22], y[13]);
1993
33
   accum.mul(x[23], y[12]);
1994
33
   z[35] = accum.extract();
1995
33
   accum.mul(x[13], y[23]);
1996
33
   accum.mul(x[14], y[22]);
1997
33
   accum.mul(x[15], y[21]);
1998
33
   accum.mul(x[16], y[20]);
1999
33
   accum.mul(x[17], y[19]);
2000
33
   accum.mul(x[18], y[18]);
2001
33
   accum.mul(x[19], y[17]);
2002
33
   accum.mul(x[20], y[16]);
2003
33
   accum.mul(x[21], y[15]);
2004
33
   accum.mul(x[22], y[14]);
2005
33
   accum.mul(x[23], y[13]);
2006
33
   z[36] = accum.extract();
2007
33
   accum.mul(x[14], y[23]);
2008
33
   accum.mul(x[15], y[22]);
2009
33
   accum.mul(x[16], y[21]);
2010
33
   accum.mul(x[17], y[20]);
2011
33
   accum.mul(x[18], y[19]);
2012
33
   accum.mul(x[19], y[18]);
2013
33
   accum.mul(x[20], y[17]);
2014
33
   accum.mul(x[21], y[16]);
2015
33
   accum.mul(x[22], y[15]);
2016
33
   accum.mul(x[23], y[14]);
2017
33
   z[37] = accum.extract();
2018
33
   accum.mul(x[15], y[23]);
2019
33
   accum.mul(x[16], y[22]);
2020
33
   accum.mul(x[17], y[21]);
2021
33
   accum.mul(x[18], y[20]);
2022
33
   accum.mul(x[19], y[19]);
2023
33
   accum.mul(x[20], y[18]);
2024
33
   accum.mul(x[21], y[17]);
2025
33
   accum.mul(x[22], y[16]);
2026
33
   accum.mul(x[23], y[15]);
2027
33
   z[38] = accum.extract();
2028
33
   accum.mul(x[16], y[23]);
2029
33
   accum.mul(x[17], y[22]);
2030
33
   accum.mul(x[18], y[21]);
2031
33
   accum.mul(x[19], y[20]);
2032
33
   accum.mul(x[20], y[19]);
2033
33
   accum.mul(x[21], y[18]);
2034
33
   accum.mul(x[22], y[17]);
2035
33
   accum.mul(x[23], y[16]);
2036
33
   z[39] = accum.extract();
2037
33
   accum.mul(x[17], y[23]);
2038
33
   accum.mul(x[18], y[22]);
2039
33
   accum.mul(x[19], y[21]);
2040
33
   accum.mul(x[20], y[20]);
2041
33
   accum.mul(x[21], y[19]);
2042
33
   accum.mul(x[22], y[18]);
2043
33
   accum.mul(x[23], y[17]);
2044
33
   z[40] = accum.extract();
2045
33
   accum.mul(x[18], y[23]);
2046
33
   accum.mul(x[19], y[22]);
2047
33
   accum.mul(x[20], y[21]);
2048
33
   accum.mul(x[21], y[20]);
2049
33
   accum.mul(x[22], y[19]);
2050
33
   accum.mul(x[23], y[18]);
2051
33
   z[41] = accum.extract();
2052
33
   accum.mul(x[19], y[23]);
2053
33
   accum.mul(x[20], y[22]);
2054
33
   accum.mul(x[21], y[21]);
2055
33
   accum.mul(x[22], y[20]);
2056
33
   accum.mul(x[23], y[19]);
2057
33
   z[42] = accum.extract();
2058
33
   accum.mul(x[20], y[23]);
2059
33
   accum.mul(x[21], y[22]);
2060
33
   accum.mul(x[22], y[21]);
2061
33
   accum.mul(x[23], y[20]);
2062
33
   z[43] = accum.extract();
2063
33
   accum.mul(x[21], y[23]);
2064
33
   accum.mul(x[22], y[22]);
2065
33
   accum.mul(x[23], y[21]);
2066
33
   z[44] = accum.extract();
2067
33
   accum.mul(x[22], y[23]);
2068
33
   accum.mul(x[23], y[22]);
2069
33
   z[45] = accum.extract();
2070
33
   accum.mul(x[23], y[23]);
2071
33
   z[46] = accum.extract();
2072
33
   z[47] = accum.extract();
2073
33
}
2074
2075
}  // namespace Botan