Coverage Report

Created: 2026-03-31 07:01

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