decmathlib-rs 0.4.0

Port of the Intel Decimal Floating-Point Math Library decimal128 type to Rust.
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
/* -------------------------------------------------------------------------------------------------- */
/* Port of the Intel Decimal Floating-Point Math Library decimal128 type to Rust.                     */
/* decmathlib-rs - Copyright (C) 2023-2024 Carlos Guzmán Álvarez                                      */
/* -------------------------------------------------------------------------------------------------- */
/* Licensed under the MIT license. See LICENSE file in the project root for full license information. */
/* -------------------------------------------------------------------------------------------------- */
/* Intel® Decimal Floating-Point Math Library - Copyright (c) 2018, Intel Corp.                       */
/* -------------------------------------------------------------------------------------------------- */

#![allow(dead_code)]

use crate::bid_internal::{BID_UINT32, BID_UINT64};

pub (crate) const BID_TWOTO60_M_10TO18: BID_UINT64 = 152921504606846976u64;
pub (crate) const BID_TWOTO60: BID_UINT64          = 0x1000000000000000u64;
pub (crate) const BID_INV_TENTO9: BID_UINT32       = 2305843009u32;	/* floor(2^61/10^9) */
pub (crate) const BID_TWOTO30_M_10TO9: BID_UINT32  = 73741824u32;
pub (crate) const BID_TENTO9: BID_UINT32           = 1000000000u32;
pub (crate) const BID_TENTO6: BID_UINT32           = 1000000u32;
pub (crate) const BID_TENTO3: BID_UINT32           = 1000u32;

pub (crate) const BID_MIDI_TBL: [&str; 1000] = [  // [1000][3] = {
    "000", "001", "002", "003", "004", "005", "006", "007", "008", "009",
    "010", "011", "012", "013", "014", "015", "016", "017", "018", "019",
    "020", "021", "022", "023", "024", "025", "026", "027", "028", "029",
    "030", "031", "032", "033", "034", "035", "036", "037", "038", "039",
    "040", "041", "042", "043", "044", "045", "046", "047", "048", "049",
    "050", "051", "052", "053", "054", "055", "056", "057", "058", "059",
    "060", "061", "062", "063", "064", "065", "066", "067", "068", "069",
    "070", "071", "072", "073", "074", "075", "076", "077", "078", "079",
    "080", "081", "082", "083", "084", "085", "086", "087", "088", "089",
    "090", "091", "092", "093", "094", "095", "096", "097", "098", "099",
    "100", "101", "102", "103", "104", "105", "106", "107", "108", "109",
    "110", "111", "112", "113", "114", "115", "116", "117", "118", "119",
    "120", "121", "122", "123", "124", "125", "126", "127", "128", "129",
    "130", "131", "132", "133", "134", "135", "136", "137", "138", "139",
    "140", "141", "142", "143", "144", "145", "146", "147", "148", "149",
    "150", "151", "152", "153", "154", "155", "156", "157", "158", "159",
    "160", "161", "162", "163", "164", "165", "166", "167", "168", "169",
    "170", "171", "172", "173", "174", "175", "176", "177", "178", "179",
    "180", "181", "182", "183", "184", "185", "186", "187", "188", "189",
    "190", "191", "192", "193", "194", "195", "196", "197", "198", "199",
    "200", "201", "202", "203", "204", "205", "206", "207", "208", "209",
    "210", "211", "212", "213", "214", "215", "216", "217", "218", "219",
    "220", "221", "222", "223", "224", "225", "226", "227", "228", "229",
    "230", "231", "232", "233", "234", "235", "236", "237", "238", "239",
    "240", "241", "242", "243", "244", "245", "246", "247", "248", "249",
    "250", "251", "252", "253", "254", "255", "256", "257", "258", "259",
    "260", "261", "262", "263", "264", "265", "266", "267", "268", "269",
    "270", "271", "272", "273", "274", "275", "276", "277", "278", "279",
    "280", "281", "282", "283", "284", "285", "286", "287", "288", "289",
    "290", "291", "292", "293", "294", "295", "296", "297", "298", "299",
    "300", "301", "302", "303", "304", "305", "306", "307", "308", "309",
    "310", "311", "312", "313", "314", "315", "316", "317", "318", "319",
    "320", "321", "322", "323", "324", "325", "326", "327", "328", "329",
    "330", "331", "332", "333", "334", "335", "336", "337", "338", "339",
    "340", "341", "342", "343", "344", "345", "346", "347", "348", "349",
    "350", "351", "352", "353", "354", "355", "356", "357", "358", "359",
    "360", "361", "362", "363", "364", "365", "366", "367", "368", "369",
    "370", "371", "372", "373", "374", "375", "376", "377", "378", "379",
    "380", "381", "382", "383", "384", "385", "386", "387", "388", "389",
    "390", "391", "392", "393", "394", "395", "396", "397", "398", "399",
    "400", "401", "402", "403", "404", "405", "406", "407", "408", "409",
    "410", "411", "412", "413", "414", "415", "416", "417", "418", "419",
    "420", "421", "422", "423", "424", "425", "426", "427", "428", "429",
    "430", "431", "432", "433", "434", "435", "436", "437", "438", "439",
    "440", "441", "442", "443", "444", "445", "446", "447", "448", "449",
    "450", "451", "452", "453", "454", "455", "456", "457", "458", "459",
    "460", "461", "462", "463", "464", "465", "466", "467", "468", "469",
    "470", "471", "472", "473", "474", "475", "476", "477", "478", "479",
    "480", "481", "482", "483", "484", "485", "486", "487", "488", "489",
    "490", "491", "492", "493", "494", "495", "496", "497", "498", "499",
    "500", "501", "502", "503", "504", "505", "506", "507", "508", "509",
    "510", "511", "512", "513", "514", "515", "516", "517", "518", "519",
    "520", "521", "522", "523", "524", "525", "526", "527", "528", "529",
    "530", "531", "532", "533", "534", "535", "536", "537", "538", "539",
    "540", "541", "542", "543", "544", "545", "546", "547", "548", "549",
    "550", "551", "552", "553", "554", "555", "556", "557", "558", "559",
    "560", "561", "562", "563", "564", "565", "566", "567", "568", "569",
    "570", "571", "572", "573", "574", "575", "576", "577", "578", "579",
    "580", "581", "582", "583", "584", "585", "586", "587", "588", "589",
    "590", "591", "592", "593", "594", "595", "596", "597", "598", "599",
    "600", "601", "602", "603", "604", "605", "606", "607", "608", "609",
    "610", "611", "612", "613", "614", "615", "616", "617", "618", "619",
    "620", "621", "622", "623", "624", "625", "626", "627", "628", "629",
    "630", "631", "632", "633", "634", "635", "636", "637", "638", "639",
    "640", "641", "642", "643", "644", "645", "646", "647", "648", "649",
    "650", "651", "652", "653", "654", "655", "656", "657", "658", "659",
    "660", "661", "662", "663", "664", "665", "666", "667", "668", "669",
    "670", "671", "672", "673", "674", "675", "676", "677", "678", "679",
    "680", "681", "682", "683", "684", "685", "686", "687", "688", "689",
    "690", "691", "692", "693", "694", "695", "696", "697", "698", "699",
    "700", "701", "702", "703", "704", "705", "706", "707", "708", "709",
    "710", "711", "712", "713", "714", "715", "716", "717", "718", "719",
    "720", "721", "722", "723", "724", "725", "726", "727", "728", "729",
    "730", "731", "732", "733", "734", "735", "736", "737", "738", "739",
    "740", "741", "742", "743", "744", "745", "746", "747", "748", "749",
    "750", "751", "752", "753", "754", "755", "756", "757", "758", "759",
    "760", "761", "762", "763", "764", "765", "766", "767", "768", "769",
    "770", "771", "772", "773", "774", "775", "776", "777", "778", "779",
    "780", "781", "782", "783", "784", "785", "786", "787", "788", "789",
    "790", "791", "792", "793", "794", "795", "796", "797", "798", "799",
    "800", "801", "802", "803", "804", "805", "806", "807", "808", "809",
    "810", "811", "812", "813", "814", "815", "816", "817", "818", "819",
    "820", "821", "822", "823", "824", "825", "826", "827", "828", "829",
    "830", "831", "832", "833", "834", "835", "836", "837", "838", "839",
    "840", "841", "842", "843", "844", "845", "846", "847", "848", "849",
    "850", "851", "852", "853", "854", "855", "856", "857", "858", "859",
    "860", "861", "862", "863", "864", "865", "866", "867", "868", "869",
    "870", "871", "872", "873", "874", "875", "876", "877", "878", "879",
    "880", "881", "882", "883", "884", "885", "886", "887", "888", "889",
    "890", "891", "892", "893", "894", "895", "896", "897", "898", "899",
    "900", "901", "902", "903", "904", "905", "906", "907", "908", "909",
    "910", "911", "912", "913", "914", "915", "916", "917", "918", "919",
    "920", "921", "922", "923", "924", "925", "926", "927", "928", "929",
    "930", "931", "932", "933", "934", "935", "936", "937", "938", "939",
    "940", "941", "942", "943", "944", "945", "946", "947", "948", "949",
    "950", "951", "952", "953", "954", "955", "956", "957", "958", "959",
    "960", "961", "962", "963", "964", "965", "966", "967", "968", "969",
    "970", "971", "972", "973", "974", "975", "976", "977", "978", "979",
    "980", "981", "982", "983", "984", "985", "986", "987", "988", "989",
    "990", "991", "992", "993", "994", "995", "996", "997", "998", "999"
];

pub (crate) const MOD10_18_TBL: [[u64; 128]; 9] = [
    // 2^59 = 576460752303423488, A and B breakdown, where data = A*10^18 + B
    [
        0u64, 0u64, 0u64, 576460752303423488u64,
        //  0*2^59,  1*2^59
        1u64, 152921504606846976u64, 1u64, 729382256910270464u64,
        //  2*2^59,  3*2^59
        2u64, 305843009213693952u64, 2u64, 882303761517117440u64,
        //  4*2^59,  5*2^59
        3u64, 458764513820540928u64, 4u64, 35225266123964416u64,
        //  6*2^59,  7*2^59
        4u64, 611686018427387904u64, 5u64, 188146770730811392u64,
        //  8*2^59,  9*2^59
        5u64, 764607523034234880u64, 6u64, 341068275337658368u64,
        // 10*2^59, 11*2^59
        6u64, 917529027641081856u64, 7u64, 493989779944505344u64,
        // 12*2^59, 13*2^59
        8u64, 70450532247928832u64, 8u64, 646911284551352320u64,
        // 14*2^59, 15*2^59
        9u64, 223372036854775808u64, 9u64, 799832789158199296u64,
        // 16*2^59, 17*2^59
        10u64, 376293541461622784u64, 10u64, 952754293765046272u64,
        // 18*2^59, 19*2^59
        11u64, 529215046068469760u64, 12u64, 105675798371893248u64,
        // 20*2^59, 21*2^59
        12u64, 682136550675316736u64, 13u64, 258597302978740224u64,
        // 22*2^59, 23*2^59
        13u64, 835058055282163712u64, 14u64, 411518807585587200u64,
        // 24*2^59, 25*2^59
        14u64, 987979559889010688u64, 15u64, 564440312192434176u64,
        // 26*2^59, 27*2^59
        16u64, 140901064495857664u64, 16u64, 717361816799281152u64,
        // 28*2^59, 29*2^59
        17u64, 293822569102704640u64, 17u64, 870283321406128128u64,
        // 30*2^59, 31*2^59
        18u64, 446744073709551616u64, 19u64, 23204826012975104u64,
        // 32*2^59, 33*2^59
        19u64, 599665578316398592u64, 20u64, 176126330619822080u64,
        // 34*2^59, 35*2^59
        20u64, 752587082923245568u64, 21u64, 329047835226669056u64,
        // 36*2^59, 37*2^59
        21u64, 905508587530092544u64, 22u64, 481969339833516032u64,
        // 38*2^59, 39*2^59
        23u64, 58430092136939520u64, 23u64, 634890844440363008u64,
        // 40*2^59, 41*2^59
        24u64, 211351596743786496u64, 24u64, 787812349047209984u64,
        // 42*2^59, 43*2^59
        25u64, 364273101350633472u64, 25u64, 940733853654056960u64,
        // 44*2^59, 45*2^59
        26u64, 517194605957480448u64, 27u64, 93655358260903936u64,
        // 46*2^59, 47*2^59
        27u64, 670116110564327424u64, 28u64, 246576862867750912u64,
        // 48*2^59, 49*2^59
        28u64, 823037615171174400u64, 29u64, 399498367474597888u64,
        // 50*2^59, 51*2^59
        29u64, 975959119778021376u64, 30u64, 552419872081444864u64,
        // 52*2^59, 53*2^59
        31u64, 128880624384868352u64, 31u64, 705341376688291840u64,
        // 54*2^59, 55*2^59
        32u64, 281802128991715328u64, 32u64, 858262881295138816u64,
        // 56*2^59, 57*2^59
        33u64, 434723633598562304u64, 34u64, 11184385901985792u64,
        // 58*2^59, 59*2^59
        34u64, 587645138205409280u64, 35u64, 164105890508832768u64,
        // 60*2^59, 61*2^59
        35u64, 740566642812256256u64, 36u64, 317027395115679744u64,
        // 62*2^59, 63*2^59
    ],
    [
        // 2^65 = 36*10^18 + 893488147419103232
        0u64, 0u64, 36u64, 893488147419103232u64,
        //  0*2^65,  1*2^65
        73u64, 786976294838206464u64, 110u64, 680464442257309696u64,
        //  2*2^65,  3*2^65
        147u64, 573952589676412928u64, 184u64, 467440737095516160u64,
        //  4*2^65,  5*2^65
        221u64, 360928884514619392u64, 258u64, 254417031933722624u64,
        //  6*2^65,  7*2^65
        295u64, 147905179352825856u64, 332u64, 41393326771929088u64,
        //  8*2^65,  9*2^65
        368u64, 934881474191032320u64, 405u64, 828369621610135552u64,
        //  0*2^65,  1*2^65
        442u64, 721857769029238784u64, 479u64, 615345916448342016u64,
        //  2*2^65,  3*2^65
        516u64, 508834063867445248u64, 553u64, 402322211286548480u64,
        //  4*2^65,  5*2^65
        590u64, 295810358705651712u64, 627u64, 189298506124754944u64,
        //  6*2^65,  7*2^65
        664u64, 82786653543858176u64, 700u64, 976274800962961408u64,
        //  8*2^65,  9*2^65
        737u64, 869762948382064640u64, 774u64, 763251095801167872u64,
        //  0*2^65,  1*2^65
        811u64, 656739243220271104u64, 848u64, 550227390639374336u64,
        //  2*2^65,  3*2^65
        885u64, 443715538058477568u64, 922u64, 337203685477580800u64,
        //  4*2^65,  5*2^65
        959u64, 230691832896684032u64, 996u64, 124179980315787264u64,
        //  6*2^65,  7*2^65
        1033u64, 17668127734890496u64, 1069u64, 911156275153993728u64,
        //  8*2^65,  9*2^65
        1106u64, 804644422573096960u64, 1143u64, 698132569992200192u64,
        //  0*2^65,  1*2^65
        1180u64, 591620717411303424u64, 1217u64, 485108864830406656u64,
        //  2*2^65,  3*2^65
        1254u64, 378597012249509888u64, 1291u64, 272085159668613120u64,
        //  4*2^65,  5*2^65
        1328u64, 165573307087716352u64, 1365u64, 59061454506819584u64,
        //  6*2^65,  7*2^65
        1401u64, 952549601925922816u64, 1438u64, 846037749345026048u64,
        //  8*2^65,  9*2^65
        1475u64, 739525896764129280u64, 1512u64, 633014044183232512u64,
        //  0*2^65,  1*2^65
        1549u64, 526502191602335744u64, 1586u64, 419990339021438976u64,
        //  2*2^65,  3*2^65
        1623u64, 313478486440542208u64, 1660u64, 206966633859645440u64,
        //  4*2^65,  5*2^65
        1697u64, 100454781278748672u64, 1733u64, 993942928697851904u64,
        //  6*2^65,  7*2^65
        1770u64, 887431076116955136u64, 1807u64, 780919223536058368u64,
        //  8*2^65,  9*2^65
        1844u64, 674407370955161600u64, 1881u64, 567895518374264832u64,
        //  0*2^65,  1*2^65
        1918u64, 461383665793368064u64, 1955u64, 354871813212471296u64,
        //  2*2^65,  3*2^65
        1992u64, 248359960631574528u64, 2029u64, 141848108050677760u64,
        //  4*2^65,  5*2^65
        2066u64, 35336255469780992u64, 2102u64, 928824402888884224u64,
        //  6*2^65,  7*2^65
        2139u64, 822312550307987456u64, 2176u64, 715800697727090688u64,
        //  8*2^65,  9*2^65
        2213u64, 609288845146193920u64, 2250u64, 502776992565297152u64,
        //  0*2^65,  1*2^65
        2287u64, 396265139984400384u64, 2324u64, 289753287403503616u64,
        //  2*2^65,  3*2^65
    ],
    [
        0u64, 0u64, 2361u64, 183241434822606848u64,
        4722u64, 366482869645213696u64, 7083u64, 549724304467820544u64,
        9444u64, 732965739290427392u64, 11805u64, 916207174113034240u64,
        14167u64, 99448608935641088u64, 16528u64, 282690043758247936u64,
        18889u64, 465931478580854784u64, 21250u64, 649172913403461632u64,
        23611u64, 832414348226068480u64, 25973u64, 15655783048675328u64,
        28334u64, 198897217871282176u64, 30695u64, 382138652693889024u64,
        33056u64, 565380087516495872u64, 35417u64, 748621522339102720u64,
        37778u64, 931862957161709568u64, 40140u64, 115104391984316416u64,
        42501u64, 298345826806923264u64, 44862u64, 481587261629530112u64,
        47223u64, 664828696452136960u64, 49584u64, 848070131274743808u64,
        51946u64, 31311566097350656u64, 54307u64, 214553000919957504u64,
        56668u64, 397794435742564352u64, 59029u64, 581035870565171200u64,
        61390u64, 764277305387778048u64, 63751u64, 947518740210384896u64,
        66113u64, 130760175032991744u64, 68474u64, 314001609855598592u64,
        70835u64, 497243044678205440u64, 73196u64, 680484479500812288u64,
        75557u64, 863725914323419136u64, 77919u64, 46967349146025984u64,
        80280u64, 230208783968632832u64, 82641u64, 413450218791239680u64,
        85002u64, 596691653613846528u64, 87363u64, 779933088436453376u64,
        89724u64, 963174523259060224u64, 92086u64, 146415958081667072u64,
        94447u64, 329657392904273920u64, 96808u64, 512898827726880768u64,
        99169u64, 696140262549487616u64, 101530u64, 879381697372094464u64,
        103892u64, 62623132194701312u64, 106253u64, 245864567017308160u64,
        108614u64, 429106001839915008u64, 110975u64, 612347436662521856u64,
        113336u64, 795588871485128704u64, 115697u64, 978830306307735552u64,
        118059u64, 162071741130342400u64, 120420u64, 345313175952949248u64,
        122781u64, 528554610775556096u64, 125142u64, 711796045598162944u64,
        127503u64, 895037480420769792u64, 129865u64, 78278915243376640u64,
        132226u64, 261520350065983488u64, 134587u64, 444761784888590336u64,
        136948u64, 628003219711197184u64, 139309u64, 811244654533804032u64,
        141670u64, 994486089356410880u64, 144032u64, 177727524179017728u64,
        146393u64, 360968959001624576u64, 148754u64, 544210393824231424u64,
    ],
    [
        0u64, 0u64, 151115u64, 727451828646838272u64,
        302231u64, 454903657293676544u64, 453347u64, 182355485940514816u64,
        604462u64, 909807314587353088u64, 755578u64, 637259143234191360u64,
        906694u64, 364710971881029632u64, 1057810u64, 92162800527867904u64,
        1208925u64, 819614629174706176u64, 1360041u64, 547066457821544448u64,
        1511157u64, 274518286468382720u64, 1662273u64, 1970115115220992u64,
        1813388u64, 729421943762059264u64, 1964504u64, 456873772408897536u64,
        2115620u64, 184325601055735808u64, 2266735u64, 911777429702574080u64,
        2417851u64, 639229258349412352u64, 2568967u64, 366681086996250624u64,
        2720083u64, 94132915643088896u64, 2871198u64, 821584744289927168u64,
        3022314u64, 549036572936765440u64, 3173430u64, 276488401583603712u64,
        3324546u64, 3940230230441984u64, 3475661u64, 731392058877280256u64,
        3626777u64, 458843887524118528u64, 3777893u64, 186295716170956800u64,
        3929008u64, 913747544817795072u64, 4080124u64, 641199373464633344u64,
        4231240u64, 368651202111471616u64, 4382356u64, 96103030758309888u64,
        4533471u64, 823554859405148160u64, 4684587u64, 551006688051986432u64,
        4835703u64, 278458516698824704u64, 4986819u64, 5910345345662976u64,
        5137934u64, 733362173992501248u64, 5289050u64, 460814002639339520u64,
        5440166u64, 188265831286177792u64, 5591281u64, 915717659933016064u64,
        5742397u64, 643169488579854336u64, 5893513u64, 370621317226692608u64,
        6044629u64, 98073145873530880u64, 6195744u64, 825524974520369152u64,
        6346860u64, 552976803167207424u64, 6497976u64, 280428631814045696u64,
        6649092u64, 7880460460883968u64, 6800207u64, 735332289107722240u64,
        6951323u64, 462784117754560512u64, 7102439u64, 190235946401398784u64,
        7253554u64, 917687775048237056u64, 7404670u64, 645139603695075328u64,
        7555786u64, 372591432341913600u64, 7706902u64, 100043260988751872u64,
        7858017u64, 827495089635590144u64, 8009133u64, 554946918282428416u64,
        8160249u64, 282398746929266688u64, 8311365u64, 9850575576104960u64,
        8462480u64, 737302404222943232u64, 8613596u64, 464754232869781504u64,
        8764712u64, 192206061516619776u64, 8915827u64, 919657890163458048u64,
        9066943u64, 647109718810296320u64, 9218059u64, 374561547457134592u64,
        9369175u64, 102013376103972864u64, 9520290u64, 829465204750811136u64,
    ],
    [
        0u64, 0u64, 9671406u64, 556917033397649408u64,
        19342813u64, 113834066795298816u64, 29014219u64, 670751100192948224u64,
        38685626u64, 227668133590597632u64, 48357032u64, 784585166988247040u64,
        58028439u64, 341502200385896448u64, 67699845u64, 898419233783545856u64,
        77371252u64, 455336267181195264u64, 87042659u64, 12253300578844672u64,
        96714065u64, 569170333976494080u64, 106385472u64, 126087367374143488u64,
        116056878u64, 683004400771792896u64, 125728285u64, 239921434169442304u64,
        135399691u64, 796838467567091712u64, 145071098u64, 353755500964741120u64,
        154742504u64, 910672534362390528u64, 164413911u64, 467589567760039936u64,
        174085318u64, 24506601157689344u64, 183756724u64, 581423634555338752u64,
        193428131u64, 138340667952988160u64, 203099537u64, 695257701350637568u64,
        212770944u64, 252174734748286976u64, 222442350u64, 809091768145936384u64,
        232113757u64, 366008801543585792u64, 241785163u64, 922925834941235200u64,
        251456570u64, 479842868338884608u64, 261127977u64, 36759901736534016u64,
        270799383u64, 593676935134183424u64, 280470790u64, 150593968531832832u64,
        290142196u64, 707511001929482240u64, 299813603u64, 264428035327131648u64,
        309485009u64, 821345068724781056u64, 319156416u64, 378262102122430464u64,
        328827822u64, 935179135520079872u64, 338499229u64, 492096168917729280u64,
        348170636u64, 49013202315378688u64, 357842042u64, 605930235713028096u64,
        367513449u64, 162847269110677504u64, 377184855u64, 719764302508326912u64,
        386856262u64, 276681335905976320u64, 396527668u64, 833598369303625728u64,
        406199075u64, 390515402701275136u64, 415870481u64, 947432436098924544u64,
        425541888u64, 504349469496573952u64, 435213295u64, 61266502894223360u64,
        444884701u64, 618183536291872768u64, 454556108u64, 175100569689522176u64,
        464227514u64, 732017603087171584u64, 473898921u64, 288934636484820992u64,
        483570327u64, 845851669882470400u64, 493241734u64, 402768703280119808u64,
        502913140u64, 959685736677769216u64, 512584547u64, 516602770075418624u64,
        522255954u64, 73519803473068032u64, 531927360u64, 630436836870717440u64,
        541598767u64, 187353870268366848u64, 551270173u64, 744270903666016256u64,
        560941580u64, 301187937063665664u64, 570612986u64, 858104970461315072u64,
        580284393u64, 415022003858964480u64, 589955799u64, 971939037256613888u64,
        599627206u64, 528856070654263296u64, 609298613u64, 85773104051912704u64,
    ],
    [
        0u64, 0u64, 618970019u64, 642690137449562112u64,
        1237940039u64, 285380274899124224u64, 1856910058u64,
        928070412348686336u64,
        2475880078u64, 570760549798248448u64, 3094850098u64,
        213450687247810560u64,
        3713820117u64, 856140824697372672u64, 4332790137u64,
        498830962146934784u64,
        4951760157u64, 141521099596496896u64, 5570730176u64,
        784211237046059008u64,
        6189700196u64, 426901374495621120u64, 6808670216u64,
        69591511945183232u64,
        7427640235u64, 712281649394745344u64, 8046610255u64,
        354971786844307456u64,
        8665580274u64, 997661924293869568u64, 9284550294u64,
        640352061743431680u64,
        9903520314u64, 283042199192993792u64, 10522490333u64,
        925732336642555904u64,
        11141460353u64, 568422474092118016u64, 11760430373u64,
        211112611541680128u64,
        12379400392u64, 853802748991242240u64, 12998370412u64,
        496492886440804352u64,
        13617340432u64, 139183023890366464u64, 14236310451u64,
        781873161339928576u64,
        14855280471u64, 424563298789490688u64, 15474250491u64,
        67253436239052800u64,
        16093220510u64, 709943573688614912u64, 16712190530u64,
        352633711138177024u64,
        17331160549u64, 995323848587739136u64, 17950130569u64,
        638013986037301248u64,
        18569100589u64, 280704123486863360u64, 19188070608u64,
        923394260936425472u64,
        19807040628u64, 566084398385987584u64, 20426010648u64,
        208774535835549696u64,
        21044980667u64, 851464673285111808u64, 21663950687u64,
        494154810734673920u64,
        22282920707u64, 136844948184236032u64, 22901890726u64,
        779535085633798144u64,
        23520860746u64, 422225223083360256u64, 24139830766u64,
        64915360532922368u64,
        24758800785u64, 707605497982484480u64, 25377770805u64,
        350295635432046592u64,
        25996740824u64, 992985772881608704u64, 26615710844u64,
        635675910331170816u64,
        27234680864u64, 278366047780732928u64, 27853650883u64,
        921056185230295040u64,
        28472620903u64, 563746322679857152u64, 29091590923u64,
        206436460129419264u64,
        29710560942u64, 849126597578981376u64, 30329530962u64,
        491816735028543488u64,
        30948500982u64, 134506872478105600u64, 31567471001u64,
        777197009927667712u64,
        32186441021u64, 419887147377229824u64, 32805411041u64,
        62577284826791936u64,
        33424381060u64, 705267422276354048u64, 34043351080u64,
        347957559725916160u64,
        34662321099u64, 990647697175478272u64, 35281291119u64,
        633337834625040384u64,
        35900261139u64, 276027972074602496u64, 36519231158u64,
        918718109524164608u64,
        37138201178u64, 561408246973726720u64, 37757171198u64,
        204098384423288832u64,
        38376141217u64, 846788521872850944u64, 38995111237u64,
        489478659322413056u64,
    ],
    [
        0u64, 0u64, 39614081257u64, 132168796771975168u64,
        79228162514u64, 264337593543950336u64, 118842243771u64,
        396506390315925504u64,
        158456325028u64, 528675187087900672u64, 198070406285u64,
        660843983859875840u64,
        237684487542u64, 793012780631851008u64, 277298568799u64,
        925181577403826176u64,
        316912650057u64, 57350374175801344u64, 356526731314u64,
        189519170947776512u64,
        396140812571u64, 321687967719751680u64, 435754893828u64,
        453856764491726848u64,
        475368975085u64, 586025561263702016u64, 514983056342u64,
        718194358035677184u64,
        554597137599u64, 850363154807652352u64, 594211218856u64,
        982531951579627520u64,
        633825300114u64, 114700748351602688u64, 673439381371u64,
        246869545123577856u64,
        713053462628u64, 379038341895553024u64, 752667543885u64,
        511207138667528192u64,
        792281625142u64, 643375935439503360u64, 831895706399u64,
        775544732211478528u64,
        871509787656u64, 907713528983453696u64, 911123868914u64,
        39882325755428864u64,
        950737950171u64, 172051122527404032u64, 990352031428u64,
        304219919299379200u64,
        1029966112685u64, 436388716071354368u64, 1069580193942u64,
        568557512843329536u64,
        1109194275199u64, 700726309615304704u64, 1148808356456u64,
        832895106387279872u64,
        1188422437713u64, 965063903159255040u64, 1228036518971u64,
        97232699931230208u64,
        1267650600228u64, 229401496703205376u64, 1307264681485u64,
        361570293475180544u64,
        1346878762742u64, 493739090247155712u64, 1386492843999u64,
        625907887019130880u64,
        1426106925256u64, 758076683791106048u64, 1465721006513u64,
        890245480563081216u64,
        1505335087771u64, 22414277335056384u64, 1544949169028u64,
        154583074107031552u64,
        1584563250285u64, 286751870879006720u64, 1624177331542u64,
        418920667650981888u64,
        1663791412799u64, 551089464422957056u64, 1703405494056u64,
        683258261194932224u64,
        1743019575313u64, 815427057966907392u64, 1782633656570u64,
        947595854738882560u64,
        1822247737828u64, 79764651510857728u64, 1861861819085u64,
        211933448282832896u64,
        1901475900342u64, 344102245054808064u64, 1941089981599u64,
        476271041826783232u64,
        1980704062856u64, 608439838598758400u64, 2020318144113u64,
        740608635370733568u64,
        2059932225370u64, 872777432142708736u64, 2099546306628u64,
        4946228914683904u64,
        2139160387885u64, 137115025686659072u64, 2178774469142u64,
        269283822458634240u64,
        2218388550399u64, 401452619230609408u64, 2258002631656u64,
        533621416002584576u64,
        2297616712913u64, 665790212774559744u64, 2337230794170u64,
        797959009546534912u64,
        2376844875427u64, 930127806318510080u64, 2416458956685u64,
        62296603090485248u64,
        2456073037942u64, 194465399862460416u64, 2495687119199u64,
        326634196634435584u64,
    ],
    [
        0u64, 0u64, 2535301200456u64, 458802993406410752u64,
        5070602400912u64, 917605986812821504u64, 7605903601369u64,
        376408980219232256u64,
        10141204801825u64, 835211973625643008u64, 12676506002282u64,
        294014967032053760u64,
        15211807202738u64, 752817960438464512u64, 17747108403195u64,
        211620953844875264u64,
        20282409603651u64, 670423947251286016u64, 22817710804108u64,
        129226940657696768u64,
        25353012004564u64, 588029934064107520u64, 27888313205021u64,
        46832927470518272u64,
        30423614405477u64, 505635920876929024u64, 32958915605933u64,
        964438914283339776u64,
        35494216806390u64, 423241907689750528u64, 38029518006846u64,
        882044901096161280u64,
        40564819207303u64, 340847894502572032u64, 43100120407759u64,
        799650887908982784u64,
        45635421608216u64, 258453881315393536u64, 48170722808672u64,
        717256874721804288u64,
        50706024009129u64, 176059868128215040u64, 53241325209585u64,
        634862861534625792u64,
        55776626410042u64, 93665854941036544u64, 58311927610498u64,
        552468848347447296u64,
        60847228810955u64, 11271841753858048u64, 63382530011411u64,
        470074835160268800u64,
        65917831211867u64, 928877828566679552u64, 68453132412324u64,
        387680821973090304u64,
        70988433612780u64, 846483815379501056u64, 73523734813237u64,
        305286808785911808u64,
        76059036013693u64, 764089802192322560u64, 78594337214150u64,
        222892795598733312u64,
        81129638414606u64, 681695789005144064u64, 83664939615063u64,
        140498782411554816u64,
        86200240815519u64, 599301775817965568u64, 88735542015976u64,
        58104769224376320u64,
        91270843216432u64, 516907762630787072u64, 93806144416888u64,
        975710756037197824u64,
        96341445617345u64, 434513749443608576u64, 98876746817801u64,
        893316742850019328u64,
        101412048018258u64, 352119736256430080u64, 103947349218714u64,
        810922729662840832u64,
        106482650419171u64, 269725723069251584u64, 109017951619627u64,
        728528716475662336u64,
        111553252820084u64, 187331709882073088u64, 114088554020540u64,
        646134703288483840u64,
        116623855220997u64, 104937696694894592u64, 119159156421453u64,
        563740690101305344u64,
        121694457621910u64, 22543683507716096u64, 124229758822366u64,
        481346676914126848u64,
        126765060022822u64, 940149670320537600u64, 129300361223279u64,
        398952663726948352u64,
        131835662423735u64, 857755657133359104u64, 134370963624192u64,
        316558650539769856u64,
        136906264824648u64, 775361643946180608u64, 139441566025105u64,
        234164637352591360u64,
        141976867225561u64, 692967630759002112u64, 144512168426018u64,
        151770624165412864u64,
        147047469626474u64, 610573617571823616u64, 149582770826931u64,
        69376610978234368u64,
        152118072027387u64, 528179604384645120u64, 154653373227843u64,
        986982597791055872u64,
        157188674428300u64, 445785591197466624u64, 159723975628756u64,
        904588584603877376u64,
    ],
    [
        0u64, 0u64, 162259276829213u64, 363391578010288128u64,
        324518553658426u64, 726783156020576256u64, 486777830487640u64,
        90174734030864384u64,
        649037107316853u64, 453566312041152512u64, 811296384146066u64,
        816957890051440640u64,
        973555660975280u64, 180349468061728768u64, 1135814937804493u64,
        543741046072016896u64,
        1298074214633706u64, 907132624082305024u64, 1460333491462920u64,
        270524202092593152u64,
        1622592768292133u64, 633915780102881280u64, 1784852045121346u64,
        997307358113169408u64,
        1947111321950560u64, 360698936123457536u64, 2109370598779773u64,
        724090514133745664u64,
        2271629875608987u64, 87482092144033792u64, 2433889152438200u64,
        450873670154321920u64,
        2596148429267413u64, 814265248164610048u64, 2758407706096627u64,
        177656826174898176u64,
        2920666982925840u64, 541048404185186304u64, 3082926259755053u64,
        904439982195474432u64,
        3245185536584267u64, 267831560205762560u64, 3407444813413480u64,
        631223138216050688u64,
        3569704090242693u64, 994614716226338816u64, 3731963367071907u64,
        358006294236626944u64,
        3894222643901120u64, 721397872246915072u64, 4056481920730334u64,
        84789450257203200u64,
        4218741197559547u64, 448181028267491328u64, 4381000474388760u64,
        811572606277779456u64,
        4543259751217974u64, 174964184288067584u64, 4705519028047187u64,
        538355762298355712u64,
        4867778304876400u64, 901747340308643840u64, 5030037581705614u64,
        265138918318931968u64,
        5192296858534827u64, 628530496329220096u64, 5354556135364040u64,
        991922074339508224u64,
        5516815412193254u64, 355313652349796352u64, 5679074689022467u64,
        718705230360084480u64,
        5841333965851681u64, 82096808370372608u64, 6003593242680894u64,
        445488386380660736u64,
        6165852519510107u64, 808879964390948864u64, 6328111796339321u64,
        172271542401236992u64,
        6490371073168534u64, 535663120411525120u64, 6652630349997747u64,
        899054698421813248u64,
        6814889626826961u64, 262446276432101376u64, 6977148903656174u64,
        625837854442389504u64,
        7139408180485387u64, 989229432452677632u64, 7301667457314601u64,
        352621010462965760u64,
        7463926734143814u64, 716012588473253888u64, 7626186010973028u64,
        79404166483542016u64,
        7788445287802241u64, 442795744493830144u64, 7950704564631454u64,
        806187322504118272u64,
        8112963841460668u64, 169578900514406400u64, 8275223118289881u64,
        532970478524694528u64,
        8437482395119094u64, 896362056534982656u64, 8599741671948308u64,
        259753634545270784u64,
        8762000948777521u64, 623145212555558912u64, 8924260225606734u64,
        986536790565847040u64,
        9086519502435948u64, 349928368576135168u64, 9248778779265161u64,
        713319946586423296u64,
        9411038056094375u64, 76711524596711424u64, 9573297332923588u64,
        440103102606999552u64,
        9735556609752801u64, 803494680617287680u64, 9897815886582015u64,
        166886258627575808u64,
        10060075163411228u64, 530277836637863936u64, 10222334440240441u64,
        893669414648152064u64
    ]
];