Coverage Report

Created: 2026-09-28 06:36

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
198k
void bigint_comba_sqr4(word z[8], const word x[4]) {
17
198k
   word3<word> accum;
18
19
198k
   accum.mul(x[0], x[0]);
20
198k
   z[0] = accum.extract();
21
198k
   accum.mul_x2(x[0], x[1]);
22
198k
   z[1] = accum.extract();
23
198k
   accum.mul_x2(x[0], x[2]);
24
198k
   accum.mul(x[1], x[1]);
25
198k
   z[2] = accum.extract();
26
198k
   accum.mul_x2(x[0], x[3]);
27
198k
   accum.mul_x2(x[1], x[2]);
28
198k
   z[3] = accum.extract();
29
198k
   accum.mul_x2(x[1], x[3]);
30
198k
   accum.mul(x[2], x[2]);
31
198k
   z[4] = accum.extract();
32
198k
   accum.mul_x2(x[2], x[3]);
33
198k
   z[5] = accum.extract();
34
198k
   accum.mul(x[3], x[3]);
35
198k
   z[6] = accum.extract();
36
198k
   z[7] = accum.extract();
37
198k
}
38
39
/*
40
* Comba 4x4 Multiplication
41
*/
42
127k
void bigint_comba_mul4(word z[8], const word x[4], const word y[4]) {
43
127k
   word3<word> accum;
44
45
127k
   accum.mul(x[0], y[0]);
46
127k
   z[0] = accum.extract();
47
127k
   accum.mul(x[0], y[1]);
48
127k
   accum.mul(x[1], y[0]);
49
127k
   z[1] = accum.extract();
50
127k
   accum.mul(x[0], y[2]);
51
127k
   accum.mul(x[1], y[1]);
52
127k
   accum.mul(x[2], y[0]);
53
127k
   z[2] = accum.extract();
54
127k
   accum.mul(x[0], y[3]);
55
127k
   accum.mul(x[1], y[2]);
56
127k
   accum.mul(x[2], y[1]);
57
127k
   accum.mul(x[3], y[0]);
58
127k
   z[3] = accum.extract();
59
127k
   accum.mul(x[1], y[3]);
60
127k
   accum.mul(x[2], y[2]);
61
127k
   accum.mul(x[3], y[1]);
62
127k
   z[4] = accum.extract();
63
127k
   accum.mul(x[2], y[3]);
64
127k
   accum.mul(x[3], y[2]);
65
127k
   z[5] = accum.extract();
66
127k
   accum.mul(x[3], y[3]);
67
127k
   z[6] = accum.extract();
68
127k
   z[7] = accum.extract();
69
127k
}
70
71
/*
72
* Comba 6x6 Squaring
73
*/
74
749k
void bigint_comba_sqr6(word z[12], const word x[6]) {
75
749k
   word3<word> accum;
76
77
749k
   accum.mul(x[0], x[0]);
78
749k
   z[0] = accum.extract();
79
749k
   accum.mul_x2(x[0], x[1]);
80
749k
   z[1] = accum.extract();
81
749k
   accum.mul_x2(x[0], x[2]);
82
749k
   accum.mul(x[1], x[1]);
83
749k
   z[2] = accum.extract();
84
749k
   accum.mul_x2(x[0], x[3]);
85
749k
   accum.mul_x2(x[1], x[2]);
86
749k
   z[3] = accum.extract();
87
749k
   accum.mul_x2(x[0], x[4]);
88
749k
   accum.mul_x2(x[1], x[3]);
89
749k
   accum.mul(x[2], x[2]);
90
749k
   z[4] = accum.extract();
91
749k
   accum.mul_x2(x[0], x[5]);
92
749k
   accum.mul_x2(x[1], x[4]);
93
749k
   accum.mul_x2(x[2], x[3]);
94
749k
   z[5] = accum.extract();
95
749k
   accum.mul_x2(x[1], x[5]);
96
749k
   accum.mul_x2(x[2], x[4]);
97
749k
   accum.mul(x[3], x[3]);
98
749k
   z[6] = accum.extract();
99
749k
   accum.mul_x2(x[2], x[5]);
100
749k
   accum.mul_x2(x[3], x[4]);
101
749k
   z[7] = accum.extract();
102
749k
   accum.mul_x2(x[3], x[5]);
103
749k
   accum.mul(x[4], x[4]);
104
749k
   z[8] = accum.extract();
105
749k
   accum.mul_x2(x[4], x[5]);
106
749k
   z[9] = accum.extract();
107
749k
   accum.mul(x[5], x[5]);
108
749k
   z[10] = accum.extract();
109
749k
   z[11] = accum.extract();
110
749k
}
111
112
/*
113
* Comba 6x6 Multiplication
114
*/
115
856k
void bigint_comba_mul6(word z[12], const word x[6], const word y[6]) {
116
856k
   word3<word> accum;
117
118
856k
   accum.mul(x[0], y[0]);
119
856k
   z[0] = accum.extract();
120
856k
   accum.mul(x[0], y[1]);
121
856k
   accum.mul(x[1], y[0]);
122
856k
   z[1] = accum.extract();
123
856k
   accum.mul(x[0], y[2]);
124
856k
   accum.mul(x[1], y[1]);
125
856k
   accum.mul(x[2], y[0]);
126
856k
   z[2] = accum.extract();
127
856k
   accum.mul(x[0], y[3]);
128
856k
   accum.mul(x[1], y[2]);
129
856k
   accum.mul(x[2], y[1]);
130
856k
   accum.mul(x[3], y[0]);
131
856k
   z[3] = accum.extract();
132
856k
   accum.mul(x[0], y[4]);
133
856k
   accum.mul(x[1], y[3]);
134
856k
   accum.mul(x[2], y[2]);
135
856k
   accum.mul(x[3], y[1]);
136
856k
   accum.mul(x[4], y[0]);
137
856k
   z[4] = accum.extract();
138
856k
   accum.mul(x[0], y[5]);
139
856k
   accum.mul(x[1], y[4]);
140
856k
   accum.mul(x[2], y[3]);
141
856k
   accum.mul(x[3], y[2]);
142
856k
   accum.mul(x[4], y[1]);
143
856k
   accum.mul(x[5], y[0]);
144
856k
   z[5] = accum.extract();
145
856k
   accum.mul(x[1], y[5]);
146
856k
   accum.mul(x[2], y[4]);
147
856k
   accum.mul(x[3], y[3]);
148
856k
   accum.mul(x[4], y[2]);
149
856k
   accum.mul(x[5], y[1]);
150
856k
   z[6] = accum.extract();
151
856k
   accum.mul(x[2], y[5]);
152
856k
   accum.mul(x[3], y[4]);
153
856k
   accum.mul(x[4], y[3]);
154
856k
   accum.mul(x[5], y[2]);
155
856k
   z[7] = accum.extract();
156
856k
   accum.mul(x[3], y[5]);
157
856k
   accum.mul(x[4], y[4]);
158
856k
   accum.mul(x[5], y[3]);
159
856k
   z[8] = accum.extract();
160
856k
   accum.mul(x[4], y[5]);
161
856k
   accum.mul(x[5], y[4]);
162
856k
   z[9] = accum.extract();
163
856k
   accum.mul(x[5], y[5]);
164
856k
   z[10] = accum.extract();
165
856k
   z[11] = accum.extract();
166
856k
}
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
2
void bigint_comba_sqr8(word z[16], const word x[8]) {
293
2
   word3<word> accum;
294
295
2
   accum.mul(x[0], x[0]);
296
2
   z[0] = accum.extract();
297
2
   accum.mul_x2(x[0], x[1]);
298
2
   z[1] = accum.extract();
299
2
   accum.mul_x2(x[0], x[2]);
300
2
   accum.mul(x[1], x[1]);
301
2
   z[2] = accum.extract();
302
2
   accum.mul_x2(x[0], x[3]);
303
2
   accum.mul_x2(x[1], x[2]);
304
2
   z[3] = accum.extract();
305
2
   accum.mul_x2(x[0], x[4]);
306
2
   accum.mul_x2(x[1], x[3]);
307
2
   accum.mul(x[2], x[2]);
308
2
   z[4] = accum.extract();
309
2
   accum.mul_x2(x[0], x[5]);
310
2
   accum.mul_x2(x[1], x[4]);
311
2
   accum.mul_x2(x[2], x[3]);
312
2
   z[5] = accum.extract();
313
2
   accum.mul_x2(x[0], x[6]);
314
2
   accum.mul_x2(x[1], x[5]);
315
2
   accum.mul_x2(x[2], x[4]);
316
2
   accum.mul(x[3], x[3]);
317
2
   z[6] = accum.extract();
318
2
   accum.mul_x2(x[0], x[7]);
319
2
   accum.mul_x2(x[1], x[6]);
320
2
   accum.mul_x2(x[2], x[5]);
321
2
   accum.mul_x2(x[3], x[4]);
322
2
   z[7] = accum.extract();
323
2
   accum.mul_x2(x[1], x[7]);
324
2
   accum.mul_x2(x[2], x[6]);
325
2
   accum.mul_x2(x[3], x[5]);
326
2
   accum.mul(x[4], x[4]);
327
2
   z[8] = accum.extract();
328
2
   accum.mul_x2(x[2], x[7]);
329
2
   accum.mul_x2(x[3], x[6]);
330
2
   accum.mul_x2(x[4], x[5]);
331
2
   z[9] = accum.extract();
332
2
   accum.mul_x2(x[3], x[7]);
333
2
   accum.mul_x2(x[4], x[6]);
334
2
   accum.mul(x[5], x[5]);
335
2
   z[10] = accum.extract();
336
2
   accum.mul_x2(x[4], x[7]);
337
2
   accum.mul_x2(x[5], x[6]);
338
2
   z[11] = accum.extract();
339
2
   accum.mul_x2(x[5], x[7]);
340
2
   accum.mul(x[6], x[6]);
341
2
   z[12] = accum.extract();
342
2
   accum.mul_x2(x[6], x[7]);
343
2
   z[13] = accum.extract();
344
2
   accum.mul(x[7], x[7]);
345
2
   z[14] = accum.extract();
346
2
   z[15] = accum.extract();
347
2
}
348
349
/*
350
* Comba 8x8 Multiplication
351
*/
352
862
void bigint_comba_mul8(word z[16], const word x[8], const word y[8]) {
353
862
   word3<word> accum;
354
355
862
   accum.mul(x[0], y[0]);
356
862
   z[0] = accum.extract();
357
862
   accum.mul(x[0], y[1]);
358
862
   accum.mul(x[1], y[0]);
359
862
   z[1] = accum.extract();
360
862
   accum.mul(x[0], y[2]);
361
862
   accum.mul(x[1], y[1]);
362
862
   accum.mul(x[2], y[0]);
363
862
   z[2] = accum.extract();
364
862
   accum.mul(x[0], y[3]);
365
862
   accum.mul(x[1], y[2]);
366
862
   accum.mul(x[2], y[1]);
367
862
   accum.mul(x[3], y[0]);
368
862
   z[3] = accum.extract();
369
862
   accum.mul(x[0], y[4]);
370
862
   accum.mul(x[1], y[3]);
371
862
   accum.mul(x[2], y[2]);
372
862
   accum.mul(x[3], y[1]);
373
862
   accum.mul(x[4], y[0]);
374
862
   z[4] = accum.extract();
375
862
   accum.mul(x[0], y[5]);
376
862
   accum.mul(x[1], y[4]);
377
862
   accum.mul(x[2], y[3]);
378
862
   accum.mul(x[3], y[2]);
379
862
   accum.mul(x[4], y[1]);
380
862
   accum.mul(x[5], y[0]);
381
862
   z[5] = accum.extract();
382
862
   accum.mul(x[0], y[6]);
383
862
   accum.mul(x[1], y[5]);
384
862
   accum.mul(x[2], y[4]);
385
862
   accum.mul(x[3], y[3]);
386
862
   accum.mul(x[4], y[2]);
387
862
   accum.mul(x[5], y[1]);
388
862
   accum.mul(x[6], y[0]);
389
862
   z[6] = accum.extract();
390
862
   accum.mul(x[0], y[7]);
391
862
   accum.mul(x[1], y[6]);
392
862
   accum.mul(x[2], y[5]);
393
862
   accum.mul(x[3], y[4]);
394
862
   accum.mul(x[4], y[3]);
395
862
   accum.mul(x[5], y[2]);
396
862
   accum.mul(x[6], y[1]);
397
862
   accum.mul(x[7], y[0]);
398
862
   z[7] = accum.extract();
399
862
   accum.mul(x[1], y[7]);
400
862
   accum.mul(x[2], y[6]);
401
862
   accum.mul(x[3], y[5]);
402
862
   accum.mul(x[4], y[4]);
403
862
   accum.mul(x[5], y[3]);
404
862
   accum.mul(x[6], y[2]);
405
862
   accum.mul(x[7], y[1]);
406
862
   z[8] = accum.extract();
407
862
   accum.mul(x[2], y[7]);
408
862
   accum.mul(x[3], y[6]);
409
862
   accum.mul(x[4], y[5]);
410
862
   accum.mul(x[5], y[4]);
411
862
   accum.mul(x[6], y[3]);
412
862
   accum.mul(x[7], y[2]);
413
862
   z[9] = accum.extract();
414
862
   accum.mul(x[3], y[7]);
415
862
   accum.mul(x[4], y[6]);
416
862
   accum.mul(x[5], y[5]);
417
862
   accum.mul(x[6], y[4]);
418
862
   accum.mul(x[7], y[3]);
419
862
   z[10] = accum.extract();
420
862
   accum.mul(x[4], y[7]);
421
862
   accum.mul(x[5], y[6]);
422
862
   accum.mul(x[6], y[5]);
423
862
   accum.mul(x[7], y[4]);
424
862
   z[11] = accum.extract();
425
862
   accum.mul(x[5], y[7]);
426
862
   accum.mul(x[6], y[6]);
427
862
   accum.mul(x[7], y[5]);
428
862
   z[12] = accum.extract();
429
862
   accum.mul(x[6], y[7]);
430
862
   accum.mul(x[7], y[6]);
431
862
   z[13] = accum.extract();
432
862
   accum.mul(x[7], y[7]);
433
862
   z[14] = accum.extract();
434
862
   z[15] = accum.extract();
435
862
}
436
437
/*
438
* Comba 9x9 Squaring
439
*/
440
2
void bigint_comba_sqr9(word z[18], const word x[9]) {
441
2
   word3<word> accum;
442
443
2
   accum.mul(x[0], x[0]);
444
2
   z[0] = accum.extract();
445
2
   accum.mul_x2(x[0], x[1]);
446
2
   z[1] = accum.extract();
447
2
   accum.mul_x2(x[0], x[2]);
448
2
   accum.mul(x[1], x[1]);
449
2
   z[2] = accum.extract();
450
2
   accum.mul_x2(x[0], x[3]);
451
2
   accum.mul_x2(x[1], x[2]);
452
2
   z[3] = accum.extract();
453
2
   accum.mul_x2(x[0], x[4]);
454
2
   accum.mul_x2(x[1], x[3]);
455
2
   accum.mul(x[2], x[2]);
456
2
   z[4] = accum.extract();
457
2
   accum.mul_x2(x[0], x[5]);
458
2
   accum.mul_x2(x[1], x[4]);
459
2
   accum.mul_x2(x[2], x[3]);
460
2
   z[5] = accum.extract();
461
2
   accum.mul_x2(x[0], x[6]);
462
2
   accum.mul_x2(x[1], x[5]);
463
2
   accum.mul_x2(x[2], x[4]);
464
2
   accum.mul(x[3], x[3]);
465
2
   z[6] = accum.extract();
466
2
   accum.mul_x2(x[0], x[7]);
467
2
   accum.mul_x2(x[1], x[6]);
468
2
   accum.mul_x2(x[2], x[5]);
469
2
   accum.mul_x2(x[3], x[4]);
470
2
   z[7] = accum.extract();
471
2
   accum.mul_x2(x[0], x[8]);
472
2
   accum.mul_x2(x[1], x[7]);
473
2
   accum.mul_x2(x[2], x[6]);
474
2
   accum.mul_x2(x[3], x[5]);
475
2
   accum.mul(x[4], x[4]);
476
2
   z[8] = accum.extract();
477
2
   accum.mul_x2(x[1], x[8]);
478
2
   accum.mul_x2(x[2], x[7]);
479
2
   accum.mul_x2(x[3], x[6]);
480
2
   accum.mul_x2(x[4], x[5]);
481
2
   z[9] = accum.extract();
482
2
   accum.mul_x2(x[2], x[8]);
483
2
   accum.mul_x2(x[3], x[7]);
484
2
   accum.mul_x2(x[4], x[6]);
485
2
   accum.mul(x[5], x[5]);
486
2
   z[10] = accum.extract();
487
2
   accum.mul_x2(x[3], x[8]);
488
2
   accum.mul_x2(x[4], x[7]);
489
2
   accum.mul_x2(x[5], x[6]);
490
2
   z[11] = accum.extract();
491
2
   accum.mul_x2(x[4], x[8]);
492
2
   accum.mul_x2(x[5], x[7]);
493
2
   accum.mul(x[6], x[6]);
494
2
   z[12] = accum.extract();
495
2
   accum.mul_x2(x[5], x[8]);
496
2
   accum.mul_x2(x[6], x[7]);
497
2
   z[13] = accum.extract();
498
2
   accum.mul_x2(x[6], x[8]);
499
2
   accum.mul(x[7], x[7]);
500
2
   z[14] = accum.extract();
501
2
   accum.mul_x2(x[7], x[8]);
502
2
   z[15] = accum.extract();
503
2
   accum.mul(x[8], x[8]);
504
2
   z[16] = accum.extract();
505
2
   z[17] = accum.extract();
506
2
}
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
40
void bigint_comba_mul16(word z[32], const word x[16], const word y[16]) {
795
40
   word3<word> accum;
796
797
40
   accum.mul(x[0], y[0]);
798
40
   z[0] = accum.extract();
799
40
   accum.mul(x[0], y[1]);
800
40
   accum.mul(x[1], y[0]);
801
40
   z[1] = accum.extract();
802
40
   accum.mul(x[0], y[2]);
803
40
   accum.mul(x[1], y[1]);
804
40
   accum.mul(x[2], y[0]);
805
40
   z[2] = accum.extract();
806
40
   accum.mul(x[0], y[3]);
807
40
   accum.mul(x[1], y[2]);
808
40
   accum.mul(x[2], y[1]);
809
40
   accum.mul(x[3], y[0]);
810
40
   z[3] = accum.extract();
811
40
   accum.mul(x[0], y[4]);
812
40
   accum.mul(x[1], y[3]);
813
40
   accum.mul(x[2], y[2]);
814
40
   accum.mul(x[3], y[1]);
815
40
   accum.mul(x[4], y[0]);
816
40
   z[4] = accum.extract();
817
40
   accum.mul(x[0], y[5]);
818
40
   accum.mul(x[1], y[4]);
819
40
   accum.mul(x[2], y[3]);
820
40
   accum.mul(x[3], y[2]);
821
40
   accum.mul(x[4], y[1]);
822
40
   accum.mul(x[5], y[0]);
823
40
   z[5] = accum.extract();
824
40
   accum.mul(x[0], y[6]);
825
40
   accum.mul(x[1], y[5]);
826
40
   accum.mul(x[2], y[4]);
827
40
   accum.mul(x[3], y[3]);
828
40
   accum.mul(x[4], y[2]);
829
40
   accum.mul(x[5], y[1]);
830
40
   accum.mul(x[6], y[0]);
831
40
   z[6] = accum.extract();
832
40
   accum.mul(x[0], y[7]);
833
40
   accum.mul(x[1], y[6]);
834
40
   accum.mul(x[2], y[5]);
835
40
   accum.mul(x[3], y[4]);
836
40
   accum.mul(x[4], y[3]);
837
40
   accum.mul(x[5], y[2]);
838
40
   accum.mul(x[6], y[1]);
839
40
   accum.mul(x[7], y[0]);
840
40
   z[7] = accum.extract();
841
40
   accum.mul(x[0], y[8]);
842
40
   accum.mul(x[1], y[7]);
843
40
   accum.mul(x[2], y[6]);
844
40
   accum.mul(x[3], y[5]);
845
40
   accum.mul(x[4], y[4]);
846
40
   accum.mul(x[5], y[3]);
847
40
   accum.mul(x[6], y[2]);
848
40
   accum.mul(x[7], y[1]);
849
40
   accum.mul(x[8], y[0]);
850
40
   z[8] = accum.extract();
851
40
   accum.mul(x[0], y[9]);
852
40
   accum.mul(x[1], y[8]);
853
40
   accum.mul(x[2], y[7]);
854
40
   accum.mul(x[3], y[6]);
855
40
   accum.mul(x[4], y[5]);
856
40
   accum.mul(x[5], y[4]);
857
40
   accum.mul(x[6], y[3]);
858
40
   accum.mul(x[7], y[2]);
859
40
   accum.mul(x[8], y[1]);
860
40
   accum.mul(x[9], y[0]);
861
40
   z[9] = accum.extract();
862
40
   accum.mul(x[0], y[10]);
863
40
   accum.mul(x[1], y[9]);
864
40
   accum.mul(x[2], y[8]);
865
40
   accum.mul(x[3], y[7]);
866
40
   accum.mul(x[4], y[6]);
867
40
   accum.mul(x[5], y[5]);
868
40
   accum.mul(x[6], y[4]);
869
40
   accum.mul(x[7], y[3]);
870
40
   accum.mul(x[8], y[2]);
871
40
   accum.mul(x[9], y[1]);
872
40
   accum.mul(x[10], y[0]);
873
40
   z[10] = accum.extract();
874
40
   accum.mul(x[0], y[11]);
875
40
   accum.mul(x[1], y[10]);
876
40
   accum.mul(x[2], y[9]);
877
40
   accum.mul(x[3], y[8]);
878
40
   accum.mul(x[4], y[7]);
879
40
   accum.mul(x[5], y[6]);
880
40
   accum.mul(x[6], y[5]);
881
40
   accum.mul(x[7], y[4]);
882
40
   accum.mul(x[8], y[3]);
883
40
   accum.mul(x[9], y[2]);
884
40
   accum.mul(x[10], y[1]);
885
40
   accum.mul(x[11], y[0]);
886
40
   z[11] = accum.extract();
887
40
   accum.mul(x[0], y[12]);
888
40
   accum.mul(x[1], y[11]);
889
40
   accum.mul(x[2], y[10]);
890
40
   accum.mul(x[3], y[9]);
891
40
   accum.mul(x[4], y[8]);
892
40
   accum.mul(x[5], y[7]);
893
40
   accum.mul(x[6], y[6]);
894
40
   accum.mul(x[7], y[5]);
895
40
   accum.mul(x[8], y[4]);
896
40
   accum.mul(x[9], y[3]);
897
40
   accum.mul(x[10], y[2]);
898
40
   accum.mul(x[11], y[1]);
899
40
   accum.mul(x[12], y[0]);
900
40
   z[12] = accum.extract();
901
40
   accum.mul(x[0], y[13]);
902
40
   accum.mul(x[1], y[12]);
903
40
   accum.mul(x[2], y[11]);
904
40
   accum.mul(x[3], y[10]);
905
40
   accum.mul(x[4], y[9]);
906
40
   accum.mul(x[5], y[8]);
907
40
   accum.mul(x[6], y[7]);
908
40
   accum.mul(x[7], y[6]);
909
40
   accum.mul(x[8], y[5]);
910
40
   accum.mul(x[9], y[4]);
911
40
   accum.mul(x[10], y[3]);
912
40
   accum.mul(x[11], y[2]);
913
40
   accum.mul(x[12], y[1]);
914
40
   accum.mul(x[13], y[0]);
915
40
   z[13] = accum.extract();
916
40
   accum.mul(x[0], y[14]);
917
40
   accum.mul(x[1], y[13]);
918
40
   accum.mul(x[2], y[12]);
919
40
   accum.mul(x[3], y[11]);
920
40
   accum.mul(x[4], y[10]);
921
40
   accum.mul(x[5], y[9]);
922
40
   accum.mul(x[6], y[8]);
923
40
   accum.mul(x[7], y[7]);
924
40
   accum.mul(x[8], y[6]);
925
40
   accum.mul(x[9], y[5]);
926
40
   accum.mul(x[10], y[4]);
927
40
   accum.mul(x[11], y[3]);
928
40
   accum.mul(x[12], y[2]);
929
40
   accum.mul(x[13], y[1]);
930
40
   accum.mul(x[14], y[0]);
931
40
   z[14] = accum.extract();
932
40
   accum.mul(x[0], y[15]);
933
40
   accum.mul(x[1], y[14]);
934
40
   accum.mul(x[2], y[13]);
935
40
   accum.mul(x[3], y[12]);
936
40
   accum.mul(x[4], y[11]);
937
40
   accum.mul(x[5], y[10]);
938
40
   accum.mul(x[6], y[9]);
939
40
   accum.mul(x[7], y[8]);
940
40
   accum.mul(x[8], y[7]);
941
40
   accum.mul(x[9], y[6]);
942
40
   accum.mul(x[10], y[5]);
943
40
   accum.mul(x[11], y[4]);
944
40
   accum.mul(x[12], y[3]);
945
40
   accum.mul(x[13], y[2]);
946
40
   accum.mul(x[14], y[1]);
947
40
   accum.mul(x[15], y[0]);
948
40
   z[15] = accum.extract();
949
40
   accum.mul(x[1], y[15]);
950
40
   accum.mul(x[2], y[14]);
951
40
   accum.mul(x[3], y[13]);
952
40
   accum.mul(x[4], y[12]);
953
40
   accum.mul(x[5], y[11]);
954
40
   accum.mul(x[6], y[10]);
955
40
   accum.mul(x[7], y[9]);
956
40
   accum.mul(x[8], y[8]);
957
40
   accum.mul(x[9], y[7]);
958
40
   accum.mul(x[10], y[6]);
959
40
   accum.mul(x[11], y[5]);
960
40
   accum.mul(x[12], y[4]);
961
40
   accum.mul(x[13], y[3]);
962
40
   accum.mul(x[14], y[2]);
963
40
   accum.mul(x[15], y[1]);
964
40
   z[16] = accum.extract();
965
40
   accum.mul(x[2], y[15]);
966
40
   accum.mul(x[3], y[14]);
967
40
   accum.mul(x[4], y[13]);
968
40
   accum.mul(x[5], y[12]);
969
40
   accum.mul(x[6], y[11]);
970
40
   accum.mul(x[7], y[10]);
971
40
   accum.mul(x[8], y[9]);
972
40
   accum.mul(x[9], y[8]);
973
40
   accum.mul(x[10], y[7]);
974
40
   accum.mul(x[11], y[6]);
975
40
   accum.mul(x[12], y[5]);
976
40
   accum.mul(x[13], y[4]);
977
40
   accum.mul(x[14], y[3]);
978
40
   accum.mul(x[15], y[2]);
979
40
   z[17] = accum.extract();
980
40
   accum.mul(x[3], y[15]);
981
40
   accum.mul(x[4], y[14]);
982
40
   accum.mul(x[5], y[13]);
983
40
   accum.mul(x[6], y[12]);
984
40
   accum.mul(x[7], y[11]);
985
40
   accum.mul(x[8], y[10]);
986
40
   accum.mul(x[9], y[9]);
987
40
   accum.mul(x[10], y[8]);
988
40
   accum.mul(x[11], y[7]);
989
40
   accum.mul(x[12], y[6]);
990
40
   accum.mul(x[13], y[5]);
991
40
   accum.mul(x[14], y[4]);
992
40
   accum.mul(x[15], y[3]);
993
40
   z[18] = accum.extract();
994
40
   accum.mul(x[4], y[15]);
995
40
   accum.mul(x[5], y[14]);
996
40
   accum.mul(x[6], y[13]);
997
40
   accum.mul(x[7], y[12]);
998
40
   accum.mul(x[8], y[11]);
999
40
   accum.mul(x[9], y[10]);
1000
40
   accum.mul(x[10], y[9]);
1001
40
   accum.mul(x[11], y[8]);
1002
40
   accum.mul(x[12], y[7]);
1003
40
   accum.mul(x[13], y[6]);
1004
40
   accum.mul(x[14], y[5]);
1005
40
   accum.mul(x[15], y[4]);
1006
40
   z[19] = accum.extract();
1007
40
   accum.mul(x[5], y[15]);
1008
40
   accum.mul(x[6], y[14]);
1009
40
   accum.mul(x[7], y[13]);
1010
40
   accum.mul(x[8], y[12]);
1011
40
   accum.mul(x[9], y[11]);
1012
40
   accum.mul(x[10], y[10]);
1013
40
   accum.mul(x[11], y[9]);
1014
40
   accum.mul(x[12], y[8]);
1015
40
   accum.mul(x[13], y[7]);
1016
40
   accum.mul(x[14], y[6]);
1017
40
   accum.mul(x[15], y[5]);
1018
40
   z[20] = accum.extract();
1019
40
   accum.mul(x[6], y[15]);
1020
40
   accum.mul(x[7], y[14]);
1021
40
   accum.mul(x[8], y[13]);
1022
40
   accum.mul(x[9], y[12]);
1023
40
   accum.mul(x[10], y[11]);
1024
40
   accum.mul(x[11], y[10]);
1025
40
   accum.mul(x[12], y[9]);
1026
40
   accum.mul(x[13], y[8]);
1027
40
   accum.mul(x[14], y[7]);
1028
40
   accum.mul(x[15], y[6]);
1029
40
   z[21] = accum.extract();
1030
40
   accum.mul(x[7], y[15]);
1031
40
   accum.mul(x[8], y[14]);
1032
40
   accum.mul(x[9], y[13]);
1033
40
   accum.mul(x[10], y[12]);
1034
40
   accum.mul(x[11], y[11]);
1035
40
   accum.mul(x[12], y[10]);
1036
40
   accum.mul(x[13], y[9]);
1037
40
   accum.mul(x[14], y[8]);
1038
40
   accum.mul(x[15], y[7]);
1039
40
   z[22] = accum.extract();
1040
40
   accum.mul(x[8], y[15]);
1041
40
   accum.mul(x[9], y[14]);
1042
40
   accum.mul(x[10], y[13]);
1043
40
   accum.mul(x[11], y[12]);
1044
40
   accum.mul(x[12], y[11]);
1045
40
   accum.mul(x[13], y[10]);
1046
40
   accum.mul(x[14], y[9]);
1047
40
   accum.mul(x[15], y[8]);
1048
40
   z[23] = accum.extract();
1049
40
   accum.mul(x[9], y[15]);
1050
40
   accum.mul(x[10], y[14]);
1051
40
   accum.mul(x[11], y[13]);
1052
40
   accum.mul(x[12], y[12]);
1053
40
   accum.mul(x[13], y[11]);
1054
40
   accum.mul(x[14], y[10]);
1055
40
   accum.mul(x[15], y[9]);
1056
40
   z[24] = accum.extract();
1057
40
   accum.mul(x[10], y[15]);
1058
40
   accum.mul(x[11], y[14]);
1059
40
   accum.mul(x[12], y[13]);
1060
40
   accum.mul(x[13], y[12]);
1061
40
   accum.mul(x[14], y[11]);
1062
40
   accum.mul(x[15], y[10]);
1063
40
   z[25] = accum.extract();
1064
40
   accum.mul(x[11], y[15]);
1065
40
   accum.mul(x[12], y[14]);
1066
40
   accum.mul(x[13], y[13]);
1067
40
   accum.mul(x[14], y[12]);
1068
40
   accum.mul(x[15], y[11]);
1069
40
   z[26] = accum.extract();
1070
40
   accum.mul(x[12], y[15]);
1071
40
   accum.mul(x[13], y[14]);
1072
40
   accum.mul(x[14], y[13]);
1073
40
   accum.mul(x[15], y[12]);
1074
40
   z[27] = accum.extract();
1075
40
   accum.mul(x[13], y[15]);
1076
40
   accum.mul(x[14], y[14]);
1077
40
   accum.mul(x[15], y[13]);
1078
40
   z[28] = accum.extract();
1079
40
   accum.mul(x[14], y[15]);
1080
40
   accum.mul(x[15], y[14]);
1081
40
   z[29] = accum.extract();
1082
40
   accum.mul(x[15], y[15]);
1083
40
   z[30] = accum.extract();
1084
40
   z[31] = accum.extract();
1085
40
}
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
38
void bigint_comba_mul24(word z[48], const word x[24], const word y[24]) {
1447
38
   word3<word> accum;
1448
1449
38
   accum.mul(x[0], y[0]);
1450
38
   z[0] = accum.extract();
1451
38
   accum.mul(x[0], y[1]);
1452
38
   accum.mul(x[1], y[0]);
1453
38
   z[1] = accum.extract();
1454
38
   accum.mul(x[0], y[2]);
1455
38
   accum.mul(x[1], y[1]);
1456
38
   accum.mul(x[2], y[0]);
1457
38
   z[2] = accum.extract();
1458
38
   accum.mul(x[0], y[3]);
1459
38
   accum.mul(x[1], y[2]);
1460
38
   accum.mul(x[2], y[1]);
1461
38
   accum.mul(x[3], y[0]);
1462
38
   z[3] = accum.extract();
1463
38
   accum.mul(x[0], y[4]);
1464
38
   accum.mul(x[1], y[3]);
1465
38
   accum.mul(x[2], y[2]);
1466
38
   accum.mul(x[3], y[1]);
1467
38
   accum.mul(x[4], y[0]);
1468
38
   z[4] = accum.extract();
1469
38
   accum.mul(x[0], y[5]);
1470
38
   accum.mul(x[1], y[4]);
1471
38
   accum.mul(x[2], y[3]);
1472
38
   accum.mul(x[3], y[2]);
1473
38
   accum.mul(x[4], y[1]);
1474
38
   accum.mul(x[5], y[0]);
1475
38
   z[5] = accum.extract();
1476
38
   accum.mul(x[0], y[6]);
1477
38
   accum.mul(x[1], y[5]);
1478
38
   accum.mul(x[2], y[4]);
1479
38
   accum.mul(x[3], y[3]);
1480
38
   accum.mul(x[4], y[2]);
1481
38
   accum.mul(x[5], y[1]);
1482
38
   accum.mul(x[6], y[0]);
1483
38
   z[6] = accum.extract();
1484
38
   accum.mul(x[0], y[7]);
1485
38
   accum.mul(x[1], y[6]);
1486
38
   accum.mul(x[2], y[5]);
1487
38
   accum.mul(x[3], y[4]);
1488
38
   accum.mul(x[4], y[3]);
1489
38
   accum.mul(x[5], y[2]);
1490
38
   accum.mul(x[6], y[1]);
1491
38
   accum.mul(x[7], y[0]);
1492
38
   z[7] = accum.extract();
1493
38
   accum.mul(x[0], y[8]);
1494
38
   accum.mul(x[1], y[7]);
1495
38
   accum.mul(x[2], y[6]);
1496
38
   accum.mul(x[3], y[5]);
1497
38
   accum.mul(x[4], y[4]);
1498
38
   accum.mul(x[5], y[3]);
1499
38
   accum.mul(x[6], y[2]);
1500
38
   accum.mul(x[7], y[1]);
1501
38
   accum.mul(x[8], y[0]);
1502
38
   z[8] = accum.extract();
1503
38
   accum.mul(x[0], y[9]);
1504
38
   accum.mul(x[1], y[8]);
1505
38
   accum.mul(x[2], y[7]);
1506
38
   accum.mul(x[3], y[6]);
1507
38
   accum.mul(x[4], y[5]);
1508
38
   accum.mul(x[5], y[4]);
1509
38
   accum.mul(x[6], y[3]);
1510
38
   accum.mul(x[7], y[2]);
1511
38
   accum.mul(x[8], y[1]);
1512
38
   accum.mul(x[9], y[0]);
1513
38
   z[9] = accum.extract();
1514
38
   accum.mul(x[0], y[10]);
1515
38
   accum.mul(x[1], y[9]);
1516
38
   accum.mul(x[2], y[8]);
1517
38
   accum.mul(x[3], y[7]);
1518
38
   accum.mul(x[4], y[6]);
1519
38
   accum.mul(x[5], y[5]);
1520
38
   accum.mul(x[6], y[4]);
1521
38
   accum.mul(x[7], y[3]);
1522
38
   accum.mul(x[8], y[2]);
1523
38
   accum.mul(x[9], y[1]);
1524
38
   accum.mul(x[10], y[0]);
1525
38
   z[10] = accum.extract();
1526
38
   accum.mul(x[0], y[11]);
1527
38
   accum.mul(x[1], y[10]);
1528
38
   accum.mul(x[2], y[9]);
1529
38
   accum.mul(x[3], y[8]);
1530
38
   accum.mul(x[4], y[7]);
1531
38
   accum.mul(x[5], y[6]);
1532
38
   accum.mul(x[6], y[5]);
1533
38
   accum.mul(x[7], y[4]);
1534
38
   accum.mul(x[8], y[3]);
1535
38
   accum.mul(x[9], y[2]);
1536
38
   accum.mul(x[10], y[1]);
1537
38
   accum.mul(x[11], y[0]);
1538
38
   z[11] = accum.extract();
1539
38
   accum.mul(x[0], y[12]);
1540
38
   accum.mul(x[1], y[11]);
1541
38
   accum.mul(x[2], y[10]);
1542
38
   accum.mul(x[3], y[9]);
1543
38
   accum.mul(x[4], y[8]);
1544
38
   accum.mul(x[5], y[7]);
1545
38
   accum.mul(x[6], y[6]);
1546
38
   accum.mul(x[7], y[5]);
1547
38
   accum.mul(x[8], y[4]);
1548
38
   accum.mul(x[9], y[3]);
1549
38
   accum.mul(x[10], y[2]);
1550
38
   accum.mul(x[11], y[1]);
1551
38
   accum.mul(x[12], y[0]);
1552
38
   z[12] = accum.extract();
1553
38
   accum.mul(x[0], y[13]);
1554
38
   accum.mul(x[1], y[12]);
1555
38
   accum.mul(x[2], y[11]);
1556
38
   accum.mul(x[3], y[10]);
1557
38
   accum.mul(x[4], y[9]);
1558
38
   accum.mul(x[5], y[8]);
1559
38
   accum.mul(x[6], y[7]);
1560
38
   accum.mul(x[7], y[6]);
1561
38
   accum.mul(x[8], y[5]);
1562
38
   accum.mul(x[9], y[4]);
1563
38
   accum.mul(x[10], y[3]);
1564
38
   accum.mul(x[11], y[2]);
1565
38
   accum.mul(x[12], y[1]);
1566
38
   accum.mul(x[13], y[0]);
1567
38
   z[13] = accum.extract();
1568
38
   accum.mul(x[0], y[14]);
1569
38
   accum.mul(x[1], y[13]);
1570
38
   accum.mul(x[2], y[12]);
1571
38
   accum.mul(x[3], y[11]);
1572
38
   accum.mul(x[4], y[10]);
1573
38
   accum.mul(x[5], y[9]);
1574
38
   accum.mul(x[6], y[8]);
1575
38
   accum.mul(x[7], y[7]);
1576
38
   accum.mul(x[8], y[6]);
1577
38
   accum.mul(x[9], y[5]);
1578
38
   accum.mul(x[10], y[4]);
1579
38
   accum.mul(x[11], y[3]);
1580
38
   accum.mul(x[12], y[2]);
1581
38
   accum.mul(x[13], y[1]);
1582
38
   accum.mul(x[14], y[0]);
1583
38
   z[14] = accum.extract();
1584
38
   accum.mul(x[0], y[15]);
1585
38
   accum.mul(x[1], y[14]);
1586
38
   accum.mul(x[2], y[13]);
1587
38
   accum.mul(x[3], y[12]);
1588
38
   accum.mul(x[4], y[11]);
1589
38
   accum.mul(x[5], y[10]);
1590
38
   accum.mul(x[6], y[9]);
1591
38
   accum.mul(x[7], y[8]);
1592
38
   accum.mul(x[8], y[7]);
1593
38
   accum.mul(x[9], y[6]);
1594
38
   accum.mul(x[10], y[5]);
1595
38
   accum.mul(x[11], y[4]);
1596
38
   accum.mul(x[12], y[3]);
1597
38
   accum.mul(x[13], y[2]);
1598
38
   accum.mul(x[14], y[1]);
1599
38
   accum.mul(x[15], y[0]);
1600
38
   z[15] = accum.extract();
1601
38
   accum.mul(x[0], y[16]);
1602
38
   accum.mul(x[1], y[15]);
1603
38
   accum.mul(x[2], y[14]);
1604
38
   accum.mul(x[3], y[13]);
1605
38
   accum.mul(x[4], y[12]);
1606
38
   accum.mul(x[5], y[11]);
1607
38
   accum.mul(x[6], y[10]);
1608
38
   accum.mul(x[7], y[9]);
1609
38
   accum.mul(x[8], y[8]);
1610
38
   accum.mul(x[9], y[7]);
1611
38
   accum.mul(x[10], y[6]);
1612
38
   accum.mul(x[11], y[5]);
1613
38
   accum.mul(x[12], y[4]);
1614
38
   accum.mul(x[13], y[3]);
1615
38
   accum.mul(x[14], y[2]);
1616
38
   accum.mul(x[15], y[1]);
1617
38
   accum.mul(x[16], y[0]);
1618
38
   z[16] = accum.extract();
1619
38
   accum.mul(x[0], y[17]);
1620
38
   accum.mul(x[1], y[16]);
1621
38
   accum.mul(x[2], y[15]);
1622
38
   accum.mul(x[3], y[14]);
1623
38
   accum.mul(x[4], y[13]);
1624
38
   accum.mul(x[5], y[12]);
1625
38
   accum.mul(x[6], y[11]);
1626
38
   accum.mul(x[7], y[10]);
1627
38
   accum.mul(x[8], y[9]);
1628
38
   accum.mul(x[9], y[8]);
1629
38
   accum.mul(x[10], y[7]);
1630
38
   accum.mul(x[11], y[6]);
1631
38
   accum.mul(x[12], y[5]);
1632
38
   accum.mul(x[13], y[4]);
1633
38
   accum.mul(x[14], y[3]);
1634
38
   accum.mul(x[15], y[2]);
1635
38
   accum.mul(x[16], y[1]);
1636
38
   accum.mul(x[17], y[0]);
1637
38
   z[17] = accum.extract();
1638
38
   accum.mul(x[0], y[18]);
1639
38
   accum.mul(x[1], y[17]);
1640
38
   accum.mul(x[2], y[16]);
1641
38
   accum.mul(x[3], y[15]);
1642
38
   accum.mul(x[4], y[14]);
1643
38
   accum.mul(x[5], y[13]);
1644
38
   accum.mul(x[6], y[12]);
1645
38
   accum.mul(x[7], y[11]);
1646
38
   accum.mul(x[8], y[10]);
1647
38
   accum.mul(x[9], y[9]);
1648
38
   accum.mul(x[10], y[8]);
1649
38
   accum.mul(x[11], y[7]);
1650
38
   accum.mul(x[12], y[6]);
1651
38
   accum.mul(x[13], y[5]);
1652
38
   accum.mul(x[14], y[4]);
1653
38
   accum.mul(x[15], y[3]);
1654
38
   accum.mul(x[16], y[2]);
1655
38
   accum.mul(x[17], y[1]);
1656
38
   accum.mul(x[18], y[0]);
1657
38
   z[18] = accum.extract();
1658
38
   accum.mul(x[0], y[19]);
1659
38
   accum.mul(x[1], y[18]);
1660
38
   accum.mul(x[2], y[17]);
1661
38
   accum.mul(x[3], y[16]);
1662
38
   accum.mul(x[4], y[15]);
1663
38
   accum.mul(x[5], y[14]);
1664
38
   accum.mul(x[6], y[13]);
1665
38
   accum.mul(x[7], y[12]);
1666
38
   accum.mul(x[8], y[11]);
1667
38
   accum.mul(x[9], y[10]);
1668
38
   accum.mul(x[10], y[9]);
1669
38
   accum.mul(x[11], y[8]);
1670
38
   accum.mul(x[12], y[7]);
1671
38
   accum.mul(x[13], y[6]);
1672
38
   accum.mul(x[14], y[5]);
1673
38
   accum.mul(x[15], y[4]);
1674
38
   accum.mul(x[16], y[3]);
1675
38
   accum.mul(x[17], y[2]);
1676
38
   accum.mul(x[18], y[1]);
1677
38
   accum.mul(x[19], y[0]);
1678
38
   z[19] = accum.extract();
1679
38
   accum.mul(x[0], y[20]);
1680
38
   accum.mul(x[1], y[19]);
1681
38
   accum.mul(x[2], y[18]);
1682
38
   accum.mul(x[3], y[17]);
1683
38
   accum.mul(x[4], y[16]);
1684
38
   accum.mul(x[5], y[15]);
1685
38
   accum.mul(x[6], y[14]);
1686
38
   accum.mul(x[7], y[13]);
1687
38
   accum.mul(x[8], y[12]);
1688
38
   accum.mul(x[9], y[11]);
1689
38
   accum.mul(x[10], y[10]);
1690
38
   accum.mul(x[11], y[9]);
1691
38
   accum.mul(x[12], y[8]);
1692
38
   accum.mul(x[13], y[7]);
1693
38
   accum.mul(x[14], y[6]);
1694
38
   accum.mul(x[15], y[5]);
1695
38
   accum.mul(x[16], y[4]);
1696
38
   accum.mul(x[17], y[3]);
1697
38
   accum.mul(x[18], y[2]);
1698
38
   accum.mul(x[19], y[1]);
1699
38
   accum.mul(x[20], y[0]);
1700
38
   z[20] = accum.extract();
1701
38
   accum.mul(x[0], y[21]);
1702
38
   accum.mul(x[1], y[20]);
1703
38
   accum.mul(x[2], y[19]);
1704
38
   accum.mul(x[3], y[18]);
1705
38
   accum.mul(x[4], y[17]);
1706
38
   accum.mul(x[5], y[16]);
1707
38
   accum.mul(x[6], y[15]);
1708
38
   accum.mul(x[7], y[14]);
1709
38
   accum.mul(x[8], y[13]);
1710
38
   accum.mul(x[9], y[12]);
1711
38
   accum.mul(x[10], y[11]);
1712
38
   accum.mul(x[11], y[10]);
1713
38
   accum.mul(x[12], y[9]);
1714
38
   accum.mul(x[13], y[8]);
1715
38
   accum.mul(x[14], y[7]);
1716
38
   accum.mul(x[15], y[6]);
1717
38
   accum.mul(x[16], y[5]);
1718
38
   accum.mul(x[17], y[4]);
1719
38
   accum.mul(x[18], y[3]);
1720
38
   accum.mul(x[19], y[2]);
1721
38
   accum.mul(x[20], y[1]);
1722
38
   accum.mul(x[21], y[0]);
1723
38
   z[21] = accum.extract();
1724
38
   accum.mul(x[0], y[22]);
1725
38
   accum.mul(x[1], y[21]);
1726
38
   accum.mul(x[2], y[20]);
1727
38
   accum.mul(x[3], y[19]);
1728
38
   accum.mul(x[4], y[18]);
1729
38
   accum.mul(x[5], y[17]);
1730
38
   accum.mul(x[6], y[16]);
1731
38
   accum.mul(x[7], y[15]);
1732
38
   accum.mul(x[8], y[14]);
1733
38
   accum.mul(x[9], y[13]);
1734
38
   accum.mul(x[10], y[12]);
1735
38
   accum.mul(x[11], y[11]);
1736
38
   accum.mul(x[12], y[10]);
1737
38
   accum.mul(x[13], y[9]);
1738
38
   accum.mul(x[14], y[8]);
1739
38
   accum.mul(x[15], y[7]);
1740
38
   accum.mul(x[16], y[6]);
1741
38
   accum.mul(x[17], y[5]);
1742
38
   accum.mul(x[18], y[4]);
1743
38
   accum.mul(x[19], y[3]);
1744
38
   accum.mul(x[20], y[2]);
1745
38
   accum.mul(x[21], y[1]);
1746
38
   accum.mul(x[22], y[0]);
1747
38
   z[22] = accum.extract();
1748
38
   accum.mul(x[0], y[23]);
1749
38
   accum.mul(x[1], y[22]);
1750
38
   accum.mul(x[2], y[21]);
1751
38
   accum.mul(x[3], y[20]);
1752
38
   accum.mul(x[4], y[19]);
1753
38
   accum.mul(x[5], y[18]);
1754
38
   accum.mul(x[6], y[17]);
1755
38
   accum.mul(x[7], y[16]);
1756
38
   accum.mul(x[8], y[15]);
1757
38
   accum.mul(x[9], y[14]);
1758
38
   accum.mul(x[10], y[13]);
1759
38
   accum.mul(x[11], y[12]);
1760
38
   accum.mul(x[12], y[11]);
1761
38
   accum.mul(x[13], y[10]);
1762
38
   accum.mul(x[14], y[9]);
1763
38
   accum.mul(x[15], y[8]);
1764
38
   accum.mul(x[16], y[7]);
1765
38
   accum.mul(x[17], y[6]);
1766
38
   accum.mul(x[18], y[5]);
1767
38
   accum.mul(x[19], y[4]);
1768
38
   accum.mul(x[20], y[3]);
1769
38
   accum.mul(x[21], y[2]);
1770
38
   accum.mul(x[22], y[1]);
1771
38
   accum.mul(x[23], y[0]);
1772
38
   z[23] = accum.extract();
1773
38
   accum.mul(x[1], y[23]);
1774
38
   accum.mul(x[2], y[22]);
1775
38
   accum.mul(x[3], y[21]);
1776
38
   accum.mul(x[4], y[20]);
1777
38
   accum.mul(x[5], y[19]);
1778
38
   accum.mul(x[6], y[18]);
1779
38
   accum.mul(x[7], y[17]);
1780
38
   accum.mul(x[8], y[16]);
1781
38
   accum.mul(x[9], y[15]);
1782
38
   accum.mul(x[10], y[14]);
1783
38
   accum.mul(x[11], y[13]);
1784
38
   accum.mul(x[12], y[12]);
1785
38
   accum.mul(x[13], y[11]);
1786
38
   accum.mul(x[14], y[10]);
1787
38
   accum.mul(x[15], y[9]);
1788
38
   accum.mul(x[16], y[8]);
1789
38
   accum.mul(x[17], y[7]);
1790
38
   accum.mul(x[18], y[6]);
1791
38
   accum.mul(x[19], y[5]);
1792
38
   accum.mul(x[20], y[4]);
1793
38
   accum.mul(x[21], y[3]);
1794
38
   accum.mul(x[22], y[2]);
1795
38
   accum.mul(x[23], y[1]);
1796
38
   z[24] = accum.extract();
1797
38
   accum.mul(x[2], y[23]);
1798
38
   accum.mul(x[3], y[22]);
1799
38
   accum.mul(x[4], y[21]);
1800
38
   accum.mul(x[5], y[20]);
1801
38
   accum.mul(x[6], y[19]);
1802
38
   accum.mul(x[7], y[18]);
1803
38
   accum.mul(x[8], y[17]);
1804
38
   accum.mul(x[9], y[16]);
1805
38
   accum.mul(x[10], y[15]);
1806
38
   accum.mul(x[11], y[14]);
1807
38
   accum.mul(x[12], y[13]);
1808
38
   accum.mul(x[13], y[12]);
1809
38
   accum.mul(x[14], y[11]);
1810
38
   accum.mul(x[15], y[10]);
1811
38
   accum.mul(x[16], y[9]);
1812
38
   accum.mul(x[17], y[8]);
1813
38
   accum.mul(x[18], y[7]);
1814
38
   accum.mul(x[19], y[6]);
1815
38
   accum.mul(x[20], y[5]);
1816
38
   accum.mul(x[21], y[4]);
1817
38
   accum.mul(x[22], y[3]);
1818
38
   accum.mul(x[23], y[2]);
1819
38
   z[25] = accum.extract();
1820
38
   accum.mul(x[3], y[23]);
1821
38
   accum.mul(x[4], y[22]);
1822
38
   accum.mul(x[5], y[21]);
1823
38
   accum.mul(x[6], y[20]);
1824
38
   accum.mul(x[7], y[19]);
1825
38
   accum.mul(x[8], y[18]);
1826
38
   accum.mul(x[9], y[17]);
1827
38
   accum.mul(x[10], y[16]);
1828
38
   accum.mul(x[11], y[15]);
1829
38
   accum.mul(x[12], y[14]);
1830
38
   accum.mul(x[13], y[13]);
1831
38
   accum.mul(x[14], y[12]);
1832
38
   accum.mul(x[15], y[11]);
1833
38
   accum.mul(x[16], y[10]);
1834
38
   accum.mul(x[17], y[9]);
1835
38
   accum.mul(x[18], y[8]);
1836
38
   accum.mul(x[19], y[7]);
1837
38
   accum.mul(x[20], y[6]);
1838
38
   accum.mul(x[21], y[5]);
1839
38
   accum.mul(x[22], y[4]);
1840
38
   accum.mul(x[23], y[3]);
1841
38
   z[26] = accum.extract();
1842
38
   accum.mul(x[4], y[23]);
1843
38
   accum.mul(x[5], y[22]);
1844
38
   accum.mul(x[6], y[21]);
1845
38
   accum.mul(x[7], y[20]);
1846
38
   accum.mul(x[8], y[19]);
1847
38
   accum.mul(x[9], y[18]);
1848
38
   accum.mul(x[10], y[17]);
1849
38
   accum.mul(x[11], y[16]);
1850
38
   accum.mul(x[12], y[15]);
1851
38
   accum.mul(x[13], y[14]);
1852
38
   accum.mul(x[14], y[13]);
1853
38
   accum.mul(x[15], y[12]);
1854
38
   accum.mul(x[16], y[11]);
1855
38
   accum.mul(x[17], y[10]);
1856
38
   accum.mul(x[18], y[9]);
1857
38
   accum.mul(x[19], y[8]);
1858
38
   accum.mul(x[20], y[7]);
1859
38
   accum.mul(x[21], y[6]);
1860
38
   accum.mul(x[22], y[5]);
1861
38
   accum.mul(x[23], y[4]);
1862
38
   z[27] = accum.extract();
1863
38
   accum.mul(x[5], y[23]);
1864
38
   accum.mul(x[6], y[22]);
1865
38
   accum.mul(x[7], y[21]);
1866
38
   accum.mul(x[8], y[20]);
1867
38
   accum.mul(x[9], y[19]);
1868
38
   accum.mul(x[10], y[18]);
1869
38
   accum.mul(x[11], y[17]);
1870
38
   accum.mul(x[12], y[16]);
1871
38
   accum.mul(x[13], y[15]);
1872
38
   accum.mul(x[14], y[14]);
1873
38
   accum.mul(x[15], y[13]);
1874
38
   accum.mul(x[16], y[12]);
1875
38
   accum.mul(x[17], y[11]);
1876
38
   accum.mul(x[18], y[10]);
1877
38
   accum.mul(x[19], y[9]);
1878
38
   accum.mul(x[20], y[8]);
1879
38
   accum.mul(x[21], y[7]);
1880
38
   accum.mul(x[22], y[6]);
1881
38
   accum.mul(x[23], y[5]);
1882
38
   z[28] = accum.extract();
1883
38
   accum.mul(x[6], y[23]);
1884
38
   accum.mul(x[7], y[22]);
1885
38
   accum.mul(x[8], y[21]);
1886
38
   accum.mul(x[9], y[20]);
1887
38
   accum.mul(x[10], y[19]);
1888
38
   accum.mul(x[11], y[18]);
1889
38
   accum.mul(x[12], y[17]);
1890
38
   accum.mul(x[13], y[16]);
1891
38
   accum.mul(x[14], y[15]);
1892
38
   accum.mul(x[15], y[14]);
1893
38
   accum.mul(x[16], y[13]);
1894
38
   accum.mul(x[17], y[12]);
1895
38
   accum.mul(x[18], y[11]);
1896
38
   accum.mul(x[19], y[10]);
1897
38
   accum.mul(x[20], y[9]);
1898
38
   accum.mul(x[21], y[8]);
1899
38
   accum.mul(x[22], y[7]);
1900
38
   accum.mul(x[23], y[6]);
1901
38
   z[29] = accum.extract();
1902
38
   accum.mul(x[7], y[23]);
1903
38
   accum.mul(x[8], y[22]);
1904
38
   accum.mul(x[9], y[21]);
1905
38
   accum.mul(x[10], y[20]);
1906
38
   accum.mul(x[11], y[19]);
1907
38
   accum.mul(x[12], y[18]);
1908
38
   accum.mul(x[13], y[17]);
1909
38
   accum.mul(x[14], y[16]);
1910
38
   accum.mul(x[15], y[15]);
1911
38
   accum.mul(x[16], y[14]);
1912
38
   accum.mul(x[17], y[13]);
1913
38
   accum.mul(x[18], y[12]);
1914
38
   accum.mul(x[19], y[11]);
1915
38
   accum.mul(x[20], y[10]);
1916
38
   accum.mul(x[21], y[9]);
1917
38
   accum.mul(x[22], y[8]);
1918
38
   accum.mul(x[23], y[7]);
1919
38
   z[30] = accum.extract();
1920
38
   accum.mul(x[8], y[23]);
1921
38
   accum.mul(x[9], y[22]);
1922
38
   accum.mul(x[10], y[21]);
1923
38
   accum.mul(x[11], y[20]);
1924
38
   accum.mul(x[12], y[19]);
1925
38
   accum.mul(x[13], y[18]);
1926
38
   accum.mul(x[14], y[17]);
1927
38
   accum.mul(x[15], y[16]);
1928
38
   accum.mul(x[16], y[15]);
1929
38
   accum.mul(x[17], y[14]);
1930
38
   accum.mul(x[18], y[13]);
1931
38
   accum.mul(x[19], y[12]);
1932
38
   accum.mul(x[20], y[11]);
1933
38
   accum.mul(x[21], y[10]);
1934
38
   accum.mul(x[22], y[9]);
1935
38
   accum.mul(x[23], y[8]);
1936
38
   z[31] = accum.extract();
1937
38
   accum.mul(x[9], y[23]);
1938
38
   accum.mul(x[10], y[22]);
1939
38
   accum.mul(x[11], y[21]);
1940
38
   accum.mul(x[12], y[20]);
1941
38
   accum.mul(x[13], y[19]);
1942
38
   accum.mul(x[14], y[18]);
1943
38
   accum.mul(x[15], y[17]);
1944
38
   accum.mul(x[16], y[16]);
1945
38
   accum.mul(x[17], y[15]);
1946
38
   accum.mul(x[18], y[14]);
1947
38
   accum.mul(x[19], y[13]);
1948
38
   accum.mul(x[20], y[12]);
1949
38
   accum.mul(x[21], y[11]);
1950
38
   accum.mul(x[22], y[10]);
1951
38
   accum.mul(x[23], y[9]);
1952
38
   z[32] = accum.extract();
1953
38
   accum.mul(x[10], y[23]);
1954
38
   accum.mul(x[11], y[22]);
1955
38
   accum.mul(x[12], y[21]);
1956
38
   accum.mul(x[13], y[20]);
1957
38
   accum.mul(x[14], y[19]);
1958
38
   accum.mul(x[15], y[18]);
1959
38
   accum.mul(x[16], y[17]);
1960
38
   accum.mul(x[17], y[16]);
1961
38
   accum.mul(x[18], y[15]);
1962
38
   accum.mul(x[19], y[14]);
1963
38
   accum.mul(x[20], y[13]);
1964
38
   accum.mul(x[21], y[12]);
1965
38
   accum.mul(x[22], y[11]);
1966
38
   accum.mul(x[23], y[10]);
1967
38
   z[33] = accum.extract();
1968
38
   accum.mul(x[11], y[23]);
1969
38
   accum.mul(x[12], y[22]);
1970
38
   accum.mul(x[13], y[21]);
1971
38
   accum.mul(x[14], y[20]);
1972
38
   accum.mul(x[15], y[19]);
1973
38
   accum.mul(x[16], y[18]);
1974
38
   accum.mul(x[17], y[17]);
1975
38
   accum.mul(x[18], y[16]);
1976
38
   accum.mul(x[19], y[15]);
1977
38
   accum.mul(x[20], y[14]);
1978
38
   accum.mul(x[21], y[13]);
1979
38
   accum.mul(x[22], y[12]);
1980
38
   accum.mul(x[23], y[11]);
1981
38
   z[34] = accum.extract();
1982
38
   accum.mul(x[12], y[23]);
1983
38
   accum.mul(x[13], y[22]);
1984
38
   accum.mul(x[14], y[21]);
1985
38
   accum.mul(x[15], y[20]);
1986
38
   accum.mul(x[16], y[19]);
1987
38
   accum.mul(x[17], y[18]);
1988
38
   accum.mul(x[18], y[17]);
1989
38
   accum.mul(x[19], y[16]);
1990
38
   accum.mul(x[20], y[15]);
1991
38
   accum.mul(x[21], y[14]);
1992
38
   accum.mul(x[22], y[13]);
1993
38
   accum.mul(x[23], y[12]);
1994
38
   z[35] = accum.extract();
1995
38
   accum.mul(x[13], y[23]);
1996
38
   accum.mul(x[14], y[22]);
1997
38
   accum.mul(x[15], y[21]);
1998
38
   accum.mul(x[16], y[20]);
1999
38
   accum.mul(x[17], y[19]);
2000
38
   accum.mul(x[18], y[18]);
2001
38
   accum.mul(x[19], y[17]);
2002
38
   accum.mul(x[20], y[16]);
2003
38
   accum.mul(x[21], y[15]);
2004
38
   accum.mul(x[22], y[14]);
2005
38
   accum.mul(x[23], y[13]);
2006
38
   z[36] = accum.extract();
2007
38
   accum.mul(x[14], y[23]);
2008
38
   accum.mul(x[15], y[22]);
2009
38
   accum.mul(x[16], y[21]);
2010
38
   accum.mul(x[17], y[20]);
2011
38
   accum.mul(x[18], y[19]);
2012
38
   accum.mul(x[19], y[18]);
2013
38
   accum.mul(x[20], y[17]);
2014
38
   accum.mul(x[21], y[16]);
2015
38
   accum.mul(x[22], y[15]);
2016
38
   accum.mul(x[23], y[14]);
2017
38
   z[37] = accum.extract();
2018
38
   accum.mul(x[15], y[23]);
2019
38
   accum.mul(x[16], y[22]);
2020
38
   accum.mul(x[17], y[21]);
2021
38
   accum.mul(x[18], y[20]);
2022
38
   accum.mul(x[19], y[19]);
2023
38
   accum.mul(x[20], y[18]);
2024
38
   accum.mul(x[21], y[17]);
2025
38
   accum.mul(x[22], y[16]);
2026
38
   accum.mul(x[23], y[15]);
2027
38
   z[38] = accum.extract();
2028
38
   accum.mul(x[16], y[23]);
2029
38
   accum.mul(x[17], y[22]);
2030
38
   accum.mul(x[18], y[21]);
2031
38
   accum.mul(x[19], y[20]);
2032
38
   accum.mul(x[20], y[19]);
2033
38
   accum.mul(x[21], y[18]);
2034
38
   accum.mul(x[22], y[17]);
2035
38
   accum.mul(x[23], y[16]);
2036
38
   z[39] = accum.extract();
2037
38
   accum.mul(x[17], y[23]);
2038
38
   accum.mul(x[18], y[22]);
2039
38
   accum.mul(x[19], y[21]);
2040
38
   accum.mul(x[20], y[20]);
2041
38
   accum.mul(x[21], y[19]);
2042
38
   accum.mul(x[22], y[18]);
2043
38
   accum.mul(x[23], y[17]);
2044
38
   z[40] = accum.extract();
2045
38
   accum.mul(x[18], y[23]);
2046
38
   accum.mul(x[19], y[22]);
2047
38
   accum.mul(x[20], y[21]);
2048
38
   accum.mul(x[21], y[20]);
2049
38
   accum.mul(x[22], y[19]);
2050
38
   accum.mul(x[23], y[18]);
2051
38
   z[41] = accum.extract();
2052
38
   accum.mul(x[19], y[23]);
2053
38
   accum.mul(x[20], y[22]);
2054
38
   accum.mul(x[21], y[21]);
2055
38
   accum.mul(x[22], y[20]);
2056
38
   accum.mul(x[23], y[19]);
2057
38
   z[42] = accum.extract();
2058
38
   accum.mul(x[20], y[23]);
2059
38
   accum.mul(x[21], y[22]);
2060
38
   accum.mul(x[22], y[21]);
2061
38
   accum.mul(x[23], y[20]);
2062
38
   z[43] = accum.extract();
2063
38
   accum.mul(x[21], y[23]);
2064
38
   accum.mul(x[22], y[22]);
2065
38
   accum.mul(x[23], y[21]);
2066
38
   z[44] = accum.extract();
2067
38
   accum.mul(x[22], y[23]);
2068
38
   accum.mul(x[23], y[22]);
2069
38
   z[45] = accum.extract();
2070
38
   accum.mul(x[23], y[23]);
2071
38
   z[46] = accum.extract();
2072
38
   z[47] = accum.extract();
2073
38
}
2074
2075
}  // namespace Botan