ldpc_toolbox/codes/
dvbs2.rs

1//! # DVB-S2 LDPC codes
2//!
3//! This module contains the LDPC codes used in DVB-S2
4//!
5//! The code definitions are handled as variants of the [`Code`] enum,
6//! which defines methods to work with the codes.
7//!
8//! ## References
9//! \[1\] ETSI EN 302 307-1 V1.4.1 (2014-11)
10use crate::sparse::SparseMatrix;
11use enum_iterator::Sequence;
12
13#[derive(Copy, Clone, Debug, Eq, PartialEq)]
14enum FrameLen {
15    Normal,
16    Short,
17}
18
19#[derive(Copy, Clone, Debug, Eq, PartialEq, Sequence)]
20/// DVB-S2 LDPC code types
21pub enum Code {
22    /// rate 1/4 normal FECFRAME
23    R1_4,
24    /// rate 1/3 normal FECFRAME
25    R1_3,
26    /// rate 2/5 normal FECFRAME
27    R2_5,
28    /// rate 1/2 normal FECFRAME
29    R1_2,
30    /// rate 3/5 normal FECFRAME
31    R3_5,
32    /// rate 2/3 normal FECFRAME
33    R2_3,
34    /// rate 3/4 normal FECFRAME
35    R3_4,
36    /// rate 4/5 normal FECFRAME
37    R4_5,
38    /// rate 5/6 normal FECFRAME
39    R5_6,
40    /// rate 8/9 normal FECFRAME
41    R8_9,
42    /// rate 9/10 normal FECFRAME
43    R9_10,
44    /// rate 1/4 short FECFRAME
45    /// (the LDPC rate is actually 1/5)
46    R1_4short,
47    /// rate 1/3 short FECFRAME
48    R1_3short,
49    /// rate 2/5 short FECFRAME
50    R2_5short,
51    /// rate 1/2 short FECFRAME
52    /// (the LDPC rate is actually 4/9)
53    R1_2short,
54    /// rate 3/5 short FECFRAME
55    R3_5short,
56    /// rate 2/3 short FECFRAME
57    R2_3short,
58    /// rate 3/4 short FECFRAME
59    /// (the LDPC rate is actually 11/15)
60    R3_4short,
61    /// rate 4/5 short FECFRAME
62    /// (the LDPC rate is actually 7/9)
63    R4_5short,
64    /// rate 5/6 short FECFRAME
65    /// (the LDPC rate is actually 37/45)
66    R5_6short,
67    /// rate 8/9 short FECFRAME
68    R8_9short,
69}
70
71impl Code {
72    /// Construct parity check matrix for the code
73    /// # Examples
74    /// ```
75    /// # use ldpc_toolbox::codes::dvbs2::Code;
76    /// let h = Code::R1_2.h();
77    /// print!("{}", h.alist());
78    /// ```
79    pub fn h(self) -> SparseMatrix {
80        // Algorithm from Section 5.3.2.1 in [1]
81        let mut h = SparseMatrix::new(self.m(), self.n());
82        // systematic bits
83        for j in 0..self.k() {
84            let w = j % 360;
85            let t = j / 360;
86            let a = self.addresses()[t]
87                .iter()
88                .map(|x| (x + w * self.q()) % self.m());
89            h.insert_col(j, a);
90        }
91        // parity bits
92        h.insert(0, self.k());
93        for j in 1..self.m() {
94            h.insert(j, j + self.k());
95            h.insert(j, j + self.k() - 1);
96        }
97        h
98    }
99
100    const fn len(self) -> FrameLen {
101        match self {
102            Code::R1_4 => FrameLen::Normal,
103            Code::R1_3 => FrameLen::Normal,
104            Code::R2_5 => FrameLen::Normal,
105            Code::R1_2 => FrameLen::Normal,
106            Code::R3_5 => FrameLen::Normal,
107            Code::R2_3 => FrameLen::Normal,
108            Code::R3_4 => FrameLen::Normal,
109            Code::R4_5 => FrameLen::Normal,
110            Code::R5_6 => FrameLen::Normal,
111            Code::R8_9 => FrameLen::Normal,
112            Code::R9_10 => FrameLen::Normal,
113            Code::R1_4short => FrameLen::Short,
114            Code::R1_3short => FrameLen::Short,
115            Code::R2_5short => FrameLen::Short,
116            Code::R1_2short => FrameLen::Short,
117            Code::R3_5short => FrameLen::Short,
118            Code::R2_3short => FrameLen::Short,
119            Code::R3_4short => FrameLen::Short,
120            Code::R4_5short => FrameLen::Short,
121            Code::R5_6short => FrameLen::Short,
122            Code::R8_9short => FrameLen::Short,
123        }
124    }
125
126    const fn n(self) -> usize {
127        match self.len() {
128            FrameLen::Normal => 64800,
129            FrameLen::Short => 16200,
130        }
131    }
132
133    const fn m(self) -> usize {
134        match self {
135            Code::R1_4 => self.n() * 3 / 4,
136            Code::R1_3 => self.n() * 2 / 3,
137            Code::R2_5 => self.n() * 3 / 5,
138            Code::R1_2 => self.n() / 2,
139            Code::R3_5 => self.n() * 2 / 5,
140            Code::R2_3 => self.n() / 3,
141            Code::R3_4 => self.n() / 4,
142            Code::R4_5 => self.n() / 5,
143            Code::R5_6 => self.n() / 6,
144            Code::R8_9 => self.n() / 9,
145            Code::R9_10 => self.n() / 10,
146            Code::R1_4short => self.n() * 4 / 5, // LDPC r=1/5
147            Code::R1_3short => self.n() * 2 / 3,
148            Code::R2_5short => self.n() * 3 / 5,
149            Code::R1_2short => self.n() * 5 / 9, // LDPC r=4/9
150            Code::R3_5short => self.n() * 2 / 5,
151            Code::R2_3short => self.n() / 3,
152            Code::R3_4short => self.n() * 14 / 15, // LDPC r=11/15
153            Code::R4_5short => self.n() * 2 / 9,   // LDPC r=7/9
154            Code::R5_6short => self.n() * 8 / 45,  // LDPC r=37/45
155            Code::R8_9short => self.n() / 9,
156        }
157    }
158
159    const fn k(self) -> usize {
160        self.n() - self.m()
161    }
162
163    const fn q(self) -> usize {
164        match self {
165            // Table 7a in [1]
166            Code::R1_4 => 135,
167            Code::R1_3 => 120,
168            Code::R2_5 => 108,
169            Code::R1_2 => 90,
170            Code::R3_5 => 72,
171            Code::R2_3 => 60,
172            Code::R3_4 => 45,
173            Code::R4_5 => 36,
174            Code::R5_6 => 30,
175            Code::R8_9 => 20,
176            Code::R9_10 => 18,
177            // Table 7b in [1]
178            Code::R1_4short => 36,
179            Code::R1_3short => 30,
180            Code::R2_5short => 27,
181            Code::R1_2short => 25,
182            Code::R3_5short => 18,
183            Code::R2_3short => 15,
184            Code::R3_4short => 12,
185            Code::R4_5short => 10,
186            Code::R5_6short => 8,
187            Code::R8_9short => 5,
188        }
189    }
190
191    const fn addresses(self) -> &'static [&'static [usize]] {
192        match self {
193            // Table B.1 in [1]
194            Code::R1_4 => &[
195                &[
196                    23606, 36098, 1140, 28859, 18148, 18510, 6226, 540, 42014, 20879, 23802, 47088,
197                ],
198                &[
199                    16419, 24928, 16609, 17248, 7693, 24997, 42587, 16858, 34921, 21042, 37024,
200                    20692,
201                ],
202                &[
203                    1874, 40094, 18704, 14474, 14004, 11519, 13106, 28826, 38669, 22363, 30255,
204                    31105,
205                ],
206                &[
207                    22254, 40564, 22645, 22532, 6134, 9176, 39998, 23892, 8937, 15608, 16854, 31009,
208                ],
209                &[
210                    8037, 40401, 13550, 19526, 41902, 28782, 13304, 32796, 24679, 27140, 45980,
211                    10021,
212                ],
213                &[
214                    40540, 44498, 13911, 22435, 32701, 18405, 39929, 25521, 12497, 9851, 39223,
215                    34823,
216                ],
217                &[
218                    15233, 45333, 5041, 44979, 45710, 42150, 19416, 1892, 23121, 15860, 8832, 10308,
219                ],
220                &[
221                    10468, 44296, 3611, 1480, 37581, 32254, 13817, 6883, 32892, 40258, 46538, 11940,
222                ],
223                &[
224                    6705, 21634, 28150, 43757, 895, 6547, 20970, 28914, 30117, 25736, 41734, 11392,
225                ],
226                &[
227                    22002, 5739, 27210, 27828, 34192, 37992, 10915, 6998, 3824, 42130, 4494, 35739,
228                ],
229                &[
230                    8515, 1191, 13642, 30950, 25943, 12673, 16726, 34261, 31828, 3340, 8747, 39225,
231                ],
232                &[
233                    18979, 17058, 43130, 4246, 4793, 44030, 19454, 29511, 47929, 15174, 24333,
234                    19354,
235                ],
236                &[
237                    16694, 8381, 29642, 46516, 32224, 26344, 9405, 18292, 12437, 27316, 35466,
238                    41992,
239                ],
240                &[
241                    15642, 5871, 46489, 26723, 23396, 7257, 8974, 3156, 37420, 44823, 35423, 13541,
242                ],
243                &[
244                    42858, 32008, 41282, 38773, 26570, 2702, 27260, 46974, 1469, 20887, 27426,
245                    38553,
246                ],
247                &[22152, 24261, 8297],
248                &[19347, 9978, 27802],
249                &[34991, 6354, 33561],
250                &[29782, 30875, 29523],
251                &[9278, 48512, 14349],
252                &[38061, 4165, 43878],
253                &[8548, 33172, 34410],
254                &[22535, 28811, 23950],
255                &[20439, 4027, 24186],
256                &[38618, 8187, 30947],
257                &[35538, 43880, 21459],
258                &[7091, 45616, 15063],
259                &[5505, 9315, 21908],
260                &[36046, 32914, 11836],
261                &[7304, 39782, 33721],
262                &[16905, 29962, 12980],
263                &[11171, 23709, 22460],
264                &[34541, 9937, 44500],
265                &[14035, 47316, 8815],
266                &[15057, 45482, 24461],
267                &[30518, 36877, 879],
268                &[7583, 13364, 24332],
269                &[448, 27056, 4682],
270                &[12083, 31378, 21670],
271                &[1159, 18031, 2221],
272                &[17028, 38715, 9350],
273                &[17343, 24530, 29574],
274                &[46128, 31039, 32818],
275                &[20373, 36967, 18345],
276                &[46685, 20622, 32806],
277            ],
278            // Table B.2 in [1]
279            Code::R1_3 => &[
280                &[
281                    34903, 20927, 32093, 1052, 25611, 16093, 16454, 5520, 506, 37399, 18518, 21120,
282                ],
283                &[
284                    11636, 14594, 22158, 14763, 15333, 6838, 22222, 37856, 14985, 31041, 18704,
285                    32910,
286                ],
287                &[
288                    17449, 1665, 35639, 16624, 12867, 12449, 10241, 11650, 25622, 34372, 19878,
289                    26894,
290                ],
291                &[
292                    29235, 19780, 36056, 20129, 20029, 5457, 8157, 35554, 21237, 7943, 13873, 14980,
293                ],
294                &[
295                    9912, 7143, 35911, 12043, 17360, 37253, 25588, 11827, 29152, 21936, 24125,
296                    40870,
297                ],
298                &[
299                    40701, 36035, 39556, 12366, 19946, 29072, 16365, 35495, 22686, 11106, 8756,
300                    34863,
301                ],
302                &[
303                    19165, 15702, 13536, 40238, 4465, 40034, 40590, 37540, 17162, 1712, 20577,
304                    14138,
305                ],
306                &[
307                    31338, 19342, 9301, 39375, 3211, 1316, 33409, 28670, 12282, 6118, 29236, 35787,
308                ],
309                &[
310                    11504, 30506, 19558, 5100, 24188, 24738, 30397, 33775, 9699, 6215, 3397, 37451,
311                ],
312                &[
313                    34689, 23126, 7571, 1058, 12127, 27518, 23064, 11265, 14867, 30451, 28289, 2966,
314                ],
315                &[
316                    11660, 15334, 16867, 15160, 38343, 3778, 4265, 39139, 17293, 26229, 42604,
317                    13486,
318                ],
319                &[
320                    31497, 1365, 14828, 7453, 26350, 41346, 28643, 23421, 8354, 16255, 11055, 24279,
321                ],
322                &[
323                    15687, 12467, 13906, 5215, 41328, 23755, 20800, 6447, 7970, 2803, 33262, 39843,
324                ],
325                &[
326                    5363, 22469, 38091, 28457, 36696, 34471, 23619, 2404, 24229, 41754, 1297, 18563,
327                ],
328                &[
329                    3673, 39070, 14480, 30279, 37483, 7580, 29519, 30519, 39831, 20252, 18132,
330                    20010,
331                ],
332                &[
333                    34386, 7252, 27526, 12950, 6875, 43020, 31566, 39069, 18985, 15541, 40020,
334                    16715,
335                ],
336                &[
337                    1721, 37332, 39953, 17430, 32134, 29162, 10490, 12971, 28581, 29331, 6489,
338                    35383,
339                ],
340                &[
341                    736, 7022, 42349, 8783, 6767, 11871, 21675, 10325, 11548, 25978, 431, 24085,
342                ],
343                &[
344                    1925, 10602, 28585, 12170, 15156, 34404, 8351, 13273, 20208, 5800, 15367, 21764,
345                ],
346                &[
347                    16279, 37832, 34792, 21250, 34192, 7406, 41488, 18346, 29227, 26127, 25493,
348                    7048,
349                ],
350                &[39948, 28229, 24899],
351                &[17408, 14274, 38993],
352                &[38774, 15968, 28459],
353                &[41404, 27249, 27425],
354                &[41229, 6082, 43114],
355                &[13957, 4979, 40654],
356                &[3093, 3438, 34992],
357                &[34082, 6172, 28760],
358                &[42210, 34141, 41021],
359                &[14705, 17783, 10134],
360                &[41755, 39884, 22773],
361                &[14615, 15593, 1642],
362                &[29111, 37061, 39860],
363                &[9579, 33552, 633],
364                &[12951, 21137, 39608],
365                &[38244, 27361, 29417],
366                &[2939, 10172, 36479],
367                &[29094, 5357, 19224],
368                &[9562, 24436, 28637],
369                &[40177, 2326, 13504],
370                &[6834, 21583, 42516],
371                &[40651, 42810, 25709],
372                &[31557, 32138, 38142],
373                &[18624, 41867, 39296],
374                &[37560, 14295, 16245],
375                &[6821, 21679, 31570],
376                &[25339, 25083, 22081],
377                &[8047, 697, 35268],
378                &[9884, 17073, 19995],
379                &[26848, 35245, 8390],
380                &[18658, 16134, 14807],
381                &[12201, 32944, 5035],
382                &[25236, 1216, 38986],
383                &[42994, 24782, 8681],
384                &[28321, 4932, 34249],
385                &[4107, 29382, 32124],
386                &[22157, 2624, 14468],
387                &[38788, 27081, 7936],
388                &[4368, 26148, 10578],
389                &[25353, 4122, 39751],
390            ],
391            // Table B.3 in [1]
392            Code::R2_5 => &[
393                &[
394                    31413, 18834, 28884, 947, 23050, 14484, 14809, 4968, 455, 33659, 16666, 19008,
395                ],
396                &[
397                    13172, 19939, 13354, 13719, 6132, 20086, 34040, 13442, 27958, 16813, 29619,
398                    16553,
399                ],
400                &[
401                    1499, 32075, 14962, 11578, 11204, 9217, 10485, 23062, 30936, 17892, 24204,
402                    24885,
403                ],
404                &[
405                    32490, 18086, 18007, 4957, 7285, 32073, 19038, 7152, 12486, 13483, 24808, 21759,
406                ],
407                &[
408                    32321, 10839, 15620, 33521, 23030, 10646, 26236, 19744, 21713, 36784, 8016,
409                    12869,
410                ],
411                &[
412                    35597, 11129, 17948, 26160, 14729, 31943, 20416, 10000, 7882, 31380, 27858,
413                    33356,
414                ],
415                &[
416                    14125, 12131, 36199, 4058, 35992, 36594, 33698, 15475, 1566, 18498, 12725, 7067,
417                ],
418                &[
419                    17406, 8372, 35437, 2888, 1184, 30068, 25802, 11056, 5507, 26313, 32205, 37232,
420                ],
421                &[
422                    15254, 5365, 17308, 22519, 35009, 718, 5240, 16778, 23131, 24092, 20587, 33385,
423                ],
424                &[
425                    27455, 17602, 4590, 21767, 22266, 27357, 30400, 8732, 5596, 3060, 33703, 3596,
426                ],
427                &[
428                    6882, 873, 10997, 24738, 20770, 10067, 13379, 27409, 25463, 2673, 6998, 31378,
429                ],
430                &[
431                    15181, 13645, 34501, 3393, 3840, 35227, 15562, 23615, 38342, 12139, 19471,
432                    15483,
433                ],
434                &[
435                    13350, 6707, 23709, 37204, 25778, 21082, 7511, 14588, 10010, 21854, 28375,
436                    33591,
437                ],
438                &[
439                    12514, 4695, 37190, 21379, 18723, 5802, 7182, 2529, 29936, 35860, 28338, 10835,
440                ],
441                &[
442                    34283, 25610, 33026, 31017, 21259, 2165, 21807, 37578, 1175, 16710, 21939,
443                    30841,
444                ],
445                &[
446                    27292, 33730, 6836, 26476, 27539, 35784, 18245, 16394, 17939, 23094, 19216,
447                    17432,
448                ],
449                &[
450                    11655, 6183, 38708, 28408, 35157, 17089, 13998, 36029, 15052, 16617, 5638,
451                    36464,
452                ],
453                &[
454                    15693, 28923, 26245, 9432, 11675, 25720, 26405, 5838, 31851, 26898, 8090, 37037,
455                ],
456                &[
457                    24418, 27583, 7959, 35562, 37771, 17784, 11382, 11156, 37855, 7073, 21685,
458                    34515,
459                ],
460                &[
461                    10977, 13633, 30969, 7516, 11943, 18199, 5231, 13825, 19589, 23661, 11150,
462                    35602,
463                ],
464                &[
465                    19124, 30774, 6670, 37344, 16510, 26317, 23518, 22957, 6348, 34069, 8845, 20175,
466                ],
467                &[
468                    34985, 14441, 25668, 4116, 3019, 21049, 37308, 24551, 24727, 20104, 24850,
469                    12114,
470                ],
471                &[
472                    38187, 28527, 13108, 13985, 1425, 21477, 30807, 8613, 26241, 33368, 35913,
473                    32477,
474                ],
475                &[
476                    5903, 34390, 24641, 26556, 23007, 27305, 38247, 2621, 9122, 32806, 21554, 18685,
477                ],
478                &[17287, 27292, 19033],
479                &[25796, 31795, 12152],
480                &[12184, 35088, 31226],
481                &[38263, 33386, 24892],
482                &[23114, 37995, 29796],
483                &[34336, 10551, 36245],
484                &[35407, 175, 7203],
485                &[14654, 38201, 22605],
486                &[28404, 6595, 1018],
487                &[19932, 3524, 29305],
488                &[31749, 20247, 8128],
489                &[18026, 36357, 26735],
490                &[7543, 29767, 13588],
491                &[13333, 25965, 8463],
492                &[14504, 36796, 19710],
493                &[4528, 25299, 7318],
494                &[35091, 25550, 14798],
495                &[7824, 215, 1248],
496                &[30848, 5362, 17291],
497                &[28932, 30249, 27073],
498                &[13062, 2103, 16206],
499                &[7129, 32062, 19612],
500                &[9512, 21936, 38833],
501                &[35849, 33754, 23450],
502                &[18705, 28656, 18111],
503                &[22749, 27456, 32187],
504                &[28229, 31684, 30160],
505                &[15293, 8483, 28002],
506                &[14880, 13334, 12584],
507                &[28646, 2558, 19687],
508                &[6259, 4499, 26336],
509                &[11952, 28386, 8405],
510                &[10609, 961, 7582],
511                &[10423, 13191, 26818],
512                &[15922, 36654, 21450],
513                &[10492, 1532, 1205],
514                &[30551, 36482, 22153],
515                &[5156, 11330, 34243],
516                &[28616, 35369, 13322],
517                &[8962, 1485, 21186],
518                &[23541, 17445, 35561],
519                &[33133, 11593, 19895],
520                &[33917, 7863, 33651],
521                &[20063, 28331, 10702],
522                &[13195, 21107, 21859],
523                &[4364, 31137, 4804],
524                &[5585, 2037, 4830],
525                &[30672, 16927, 14800],
526            ],
527            // Table B.4 in [1]
528            Code::R1_2 => &[
529                &[54, 9318, 14392, 27561, 26909, 10219, 2534, 8597],
530                &[55, 7263, 4635, 2530, 28130, 3033, 23830, 3651],
531                &[56, 24731, 23583, 26036, 17299, 5750, 792, 9169],
532                &[57, 5811, 26154, 18653, 11551, 15447, 13685, 16264],
533                &[58, 12610, 11347, 28768, 2792, 3174, 29371, 12997],
534                &[59, 16789, 16018, 21449, 6165, 21202, 15850, 3186],
535                &[60, 31016, 21449, 17618, 6213, 12166, 8334, 18212],
536                &[61, 22836, 14213, 11327, 5896, 718, 11727, 9308],
537                &[62, 2091, 24941, 29966, 23634, 9013, 15587, 5444],
538                &[63, 22207, 3983, 16904, 28534, 21415, 27524, 25912],
539                &[64, 25687, 4501, 22193, 14665, 14798, 16158, 5491],
540                &[65, 4520, 17094, 23397, 4264, 22370, 16941, 21526],
541                &[66, 10490, 6182, 32370, 9597, 30841, 25954, 2762],
542                &[67, 22120, 22865, 29870, 15147, 13668, 14955, 19235],
543                &[68, 6689, 18408, 18346, 9918, 25746, 5443, 20645],
544                &[69, 29982, 12529, 13858, 4746, 30370, 10023, 24828],
545                &[70, 1262, 28032, 29888, 13063, 24033, 21951, 7863],
546                &[71, 6594, 29642, 31451, 14831, 9509, 9335, 31552],
547                &[72, 1358, 6454, 16633, 20354, 24598, 624, 5265],
548                &[73, 19529, 295, 18011, 3080, 13364, 8032, 15323],
549                &[74, 11981, 1510, 7960, 21462, 9129, 11370, 25741],
550                &[75, 9276, 29656, 4543, 30699, 20646, 21921, 28050],
551                &[76, 15975, 25634, 5520, 31119, 13715, 21949, 19605],
552                &[77, 18688, 4608, 31755, 30165, 13103, 10706, 29224],
553                &[78, 21514, 23117, 12245, 26035, 31656, 25631, 30699],
554                &[79, 9674, 24966, 31285, 29908, 17042, 24588, 31857],
555                &[80, 21856, 27777, 29919, 27000, 14897, 11409, 7122],
556                &[81, 29773, 23310, 263, 4877, 28622, 20545, 22092],
557                &[82, 15605, 5651, 21864, 3967, 14419, 22757, 15896],
558                &[83, 30145, 1759, 10139, 29223, 26086, 10556, 5098],
559                &[84, 18815, 16575, 2936, 24457, 26738, 6030, 505],
560                &[85, 30326, 22298, 27562, 20131, 26390, 6247, 24791],
561                &[86, 928, 29246, 21246, 12400, 15311, 32309, 18608],
562                &[87, 20314, 6025, 26689, 16302, 2296, 3244, 19613],
563                &[88, 6237, 11943, 22851, 15642, 23857, 15112, 20947],
564                &[89, 26403, 25168, 19038, 18384, 8882, 12719, 7093],
565                &[0, 14567, 24965],
566                &[1, 3908, 100],
567                &[2, 10279, 240],
568                &[3, 24102, 764],
569                &[4, 12383, 4173],
570                &[5, 13861, 15918],
571                &[6, 21327, 1046],
572                &[7, 5288, 14579],
573                &[8, 28158, 8069],
574                &[9, 16583, 11098],
575                &[10, 16681, 28363],
576                &[11, 13980, 24725],
577                &[12, 32169, 17989],
578                &[13, 10907, 2767],
579                &[14, 21557, 3818],
580                &[15, 26676, 12422],
581                &[16, 7676, 8754],
582                &[17, 14905, 20232],
583                &[18, 15719, 24646],
584                &[19, 31942, 8589],
585                &[20, 19978, 27197],
586                &[21, 27060, 15071],
587                &[22, 6071, 26649],
588                &[23, 10393, 11176],
589                &[24, 9597, 13370],
590                &[25, 7081, 17677],
591                &[26, 1433, 19513],
592                &[27, 26925, 9014],
593                &[28, 19202, 8900],
594                &[29, 18152, 30647],
595                &[30, 20803, 1737],
596                &[31, 11804, 25221],
597                &[32, 31683, 17783],
598                &[33, 29694, 9345],
599                &[34, 12280, 26611],
600                &[35, 6526, 26122],
601                &[36, 26165, 11241],
602                &[37, 7666, 26962],
603                &[38, 16290, 8480],
604                &[39, 11774, 10120],
605                &[40, 30051, 30426],
606                &[41, 1335, 15424],
607                &[42, 6865, 17742],
608                &[43, 31779, 12489],
609                &[44, 32120, 21001],
610                &[45, 14508, 6996],
611                &[46, 979, 25024],
612                &[47, 4554, 21896],
613                &[48, 7989, 21777],
614                &[49, 4972, 20661],
615                &[50, 6612, 2730],
616                &[51, 12742, 4418],
617                &[52, 29194, 595],
618                &[53, 19267, 20113],
619            ],
620            // Table B.5 in [1]
621            Code::R3_5 => &[
622                &[
623                    22422, 10282, 11626, 19997, 11161, 2922, 3122, 99, 5625, 17064, 8270, 179,
624                ],
625                &[
626                    25087, 16218, 17015, 828, 20041, 25656, 4186, 11629, 22599, 17305, 22515, 6463,
627                ],
628                &[
629                    11049, 22853, 25706, 14388, 5500, 19245, 8732, 2177, 13555, 11346, 17265, 3069,
630                ],
631                &[
632                    16581, 22225, 12563, 19717, 23577, 11555, 25496, 6853, 25403, 5218, 15925,
633                    21766,
634                ],
635                &[
636                    16529, 14487, 7643, 10715, 17442, 11119, 5679, 14155, 24213, 21000, 1116, 15620,
637                ],
638                &[
639                    5340, 8636, 16693, 1434, 5635, 6516, 9482, 20189, 1066, 15013, 25361, 14243,
640                ],
641                &[
642                    18506, 22236, 20912, 8952, 5421, 15691, 6126, 21595, 500, 6904, 13059, 6802,
643                ],
644                &[
645                    8433, 4694, 5524, 14216, 3685, 19721, 25420, 9937, 23813, 9047, 25651, 16826,
646                ],
647                &[
648                    21500, 24814, 6344, 17382, 7064, 13929, 4004, 16552, 12818, 8720, 5286, 2206,
649                ],
650                &[
651                    22517, 2429, 19065, 2921, 21611, 1873, 7507, 5661, 23006, 23128, 20543, 19777,
652                ],
653                &[
654                    1770, 4636, 20900, 14931, 9247, 12340, 11008, 12966, 4471, 2731, 16445, 791,
655                ],
656                &[
657                    6635, 14556, 18865, 22421, 22124, 12697, 9803, 25485, 7744, 18254, 11313, 9004,
658                ],
659                &[
660                    19982, 23963, 18912, 7206, 12500, 4382, 20067, 6177, 21007, 1195, 23547, 24837,
661                ],
662                &[
663                    756, 11158, 14646, 20534, 3647, 17728, 11676, 11843, 12937, 4402, 8261, 22944,
664                ],
665                &[
666                    9306, 24009, 10012, 11081, 3746, 24325, 8060, 19826, 842, 8836, 2898, 5019,
667                ],
668                &[
669                    7575, 7455, 25244, 4736, 14400, 22981, 5543, 8006, 24203, 13053, 1120, 5128,
670                ],
671                &[
672                    3482, 9270, 13059, 15825, 7453, 23747, 3656, 24585, 16542, 17507, 22462, 14670,
673                ],
674                &[
675                    15627, 15290, 4198, 22748, 5842, 13395, 23918, 16985, 14929, 3726, 25350, 24157,
676                ],
677                &[
678                    24896, 16365, 16423, 13461, 16615, 8107, 24741, 3604, 25904, 8716, 9604, 20365,
679                ],
680                &[
681                    3729, 17245, 18448, 9862, 20831, 25326, 20517, 24618, 13282, 5099, 14183, 8804,
682                ],
683                &[
684                    16455, 17646, 15376, 18194, 25528, 1777, 6066, 21855, 14372, 12517, 4488, 17490,
685                ],
686                &[
687                    1400, 8135, 23375, 20879, 8476, 4084, 12936, 25536, 22309, 16582, 6402, 24360,
688                ],
689                &[
690                    25119, 23586, 128, 4761, 10443, 22536, 8607, 9752, 25446, 15053, 1856, 4040,
691                ],
692                &[
693                    377, 21160, 13474, 5451, 17170, 5938, 10256, 11972, 24210, 17833, 22047, 16108,
694                ],
695                &[
696                    13075, 9648, 24546, 13150, 23867, 7309, 19798, 2988, 16858, 4825, 23950, 15125,
697                ],
698                &[
699                    20526, 3553, 11525, 23366, 2452, 17626, 19265, 20172, 18060, 24593, 13255, 1552,
700                ],
701                &[
702                    18839, 21132, 20119, 15214, 14705, 7096, 10174, 5663, 18651, 19700, 12524,
703                    14033,
704                ],
705                &[
706                    4127, 2971, 17499, 16287, 22368, 21463, 7943, 18880, 5567, 8047, 23363, 6797,
707                ],
708                &[
709                    10651, 24471, 14325, 4081, 7258, 4949, 7044, 1078, 797, 22910, 20474, 4318,
710                ],
711                &[
712                    21374, 13231, 22985, 5056, 3821, 23718, 14178, 9978, 19030, 23594, 8895, 25358,
713                ],
714                &[
715                    6199, 22056, 7749, 13310, 3999, 23697, 16445, 22636, 5225, 22437, 24153, 9442,
716                ],
717                &[
718                    7978, 12177, 2893, 20778, 3175, 8645, 11863, 24623, 10311, 25767, 17057, 3691,
719                ],
720                &[
721                    20473, 11294, 9914, 22815, 2574, 8439, 3699, 5431, 24840, 21908, 16088, 18244,
722                ],
723                &[
724                    8208, 5755, 19059, 8541, 24924, 6454, 11234, 10492, 16406, 10831, 11436, 9649,
725                ],
726                &[
727                    16264, 11275, 24953, 2347, 12667, 19190, 7257, 7174, 24819, 2938, 2522, 11749,
728                ],
729                &[
730                    3627, 5969, 13862, 1538, 23176, 6353, 2855, 17720, 2472, 7428, 573, 15036,
731                ],
732                &[0, 18539, 18661],
733                &[1, 10502, 3002],
734                &[2, 9368, 10761],
735                &[3, 12299, 7828],
736                &[4, 15048, 13362],
737                &[5, 18444, 24640],
738                &[6, 20775, 19175],
739                &[7, 18970, 10971],
740                &[8, 5329, 19982],
741                &[9, 11296, 18655],
742                &[10, 15046, 20659],
743                &[11, 7300, 22140],
744                &[12, 22029, 14477],
745                &[13, 11129, 742],
746                &[14, 13254, 13813],
747                &[15, 19234, 13273],
748                &[16, 6079, 21122],
749                &[17, 22782, 5828],
750                &[18, 19775, 4247],
751                &[19, 1660, 19413],
752                &[20, 4403, 3649],
753                &[21, 13371, 25851],
754                &[22, 22770, 21784],
755                &[23, 10757, 14131],
756                &[24, 16071, 21617],
757                &[25, 6393, 3725],
758                &[26, 597, 19968],
759                &[27, 5743, 8084],
760                &[28, 6770, 9548],
761                &[29, 4285, 17542],
762                &[30, 13568, 22599],
763                &[31, 1786, 4617],
764                &[32, 23238, 11648],
765                &[33, 19627, 2030],
766                &[34, 13601, 13458],
767                &[35, 13740, 17328],
768                &[36, 25012, 13944],
769                &[37, 22513, 6687],
770                &[38, 4934, 12587],
771                &[39, 21197, 5133],
772                &[40, 22705, 6938],
773                &[41, 7534, 24633],
774                &[42, 24400, 12797],
775                &[43, 21911, 25712],
776                &[44, 12039, 1140],
777                &[45, 24306, 1021],
778                &[46, 14012, 20747],
779                &[47, 11265, 15219],
780                &[48, 4670, 15531],
781                &[49, 9417, 14359],
782                &[50, 2415, 6504],
783                &[51, 24964, 24690],
784                &[52, 14443, 8816],
785                &[53, 6926, 1291],
786                &[54, 6209, 20806],
787                &[55, 13915, 4079],
788                &[56, 24410, 13196],
789                &[57, 13505, 6117],
790                &[58, 9869, 8220],
791                &[59, 1570, 6044],
792                &[60, 25780, 17387],
793                &[61, 20671, 24913],
794                &[62, 24558, 20591],
795                &[63, 12402, 3702],
796                &[64, 8314, 1357],
797                &[65, 20071, 14616],
798                &[66, 17014, 3688],
799                &[67, 19837, 946],
800                &[68, 15195, 12136],
801                &[69, 7758, 22808],
802                &[70, 3564, 2925],
803                &[71, 3434, 7769],
804            ],
805            // Table B.6 in [1]
806            Code::R2_3 => &[
807                &[
808                    0, 10491, 16043, 506, 12826, 8065, 8226, 2767, 240, 18673, 9279, 10579, 20928,
809                ],
810                &[
811                    1, 17819, 8313, 6433, 6224, 5120, 5824, 12812, 17187, 9940, 13447, 13825, 18483,
812                ],
813                &[
814                    2, 17957, 6024, 8681, 18628, 12794, 5915, 14576, 10970, 12064, 20437, 4455,
815                    7151,
816                ],
817                &[
818                    3, 19777, 6183, 9972, 14536, 8182, 17749, 11341, 5556, 4379, 17434, 15477,
819                    18532,
820                ],
821                &[
822                    4, 4651, 19689, 1608, 659, 16707, 14335, 6143, 3058, 14618, 17894, 20684, 5306,
823                ],
824                &[
825                    5, 9778, 2552, 12096, 12369, 15198, 16890, 4851, 3109, 1700, 18725, 1997, 15882,
826                ],
827                &[
828                    6, 486, 6111, 13743, 11537, 5591, 7433, 15227, 14145, 1483, 3887, 17431, 12430,
829                ],
830                &[
831                    7, 20647, 14311, 11734, 4180, 8110, 5525, 12141, 15761, 18661, 18441, 10569,
832                    8192,
833                ],
834                &[
835                    8, 3791, 14759, 15264, 19918, 10132, 9062, 10010, 12786, 10675, 9682, 19246,
836                    5454,
837                ],
838                &[
839                    9, 19525, 9485, 7777, 19999, 8378, 9209, 3163, 20232, 6690, 16518, 716, 7353,
840                ],
841                &[
842                    10, 4588, 6709, 20202, 10905, 915, 4317, 11073, 13576, 16433, 368, 3508, 21171,
843                ],
844                &[
845                    11, 14072, 4033, 19959, 12608, 631, 19494, 14160, 8249, 10223, 21504, 12395,
846                    4322,
847                ],
848                &[12, 13800, 14161],
849                &[13, 2948, 9647],
850                &[14, 14693, 16027],
851                &[15, 20506, 11082],
852                &[16, 1143, 9020],
853                &[17, 13501, 4014],
854                &[18, 1548, 2190],
855                &[19, 12216, 21556],
856                &[20, 2095, 19897],
857                &[21, 4189, 7958],
858                &[22, 15940, 10048],
859                &[23, 515, 12614],
860                &[24, 8501, 8450],
861                &[25, 17595, 16784],
862                &[26, 5913, 8495],
863                &[27, 16394, 10423],
864                &[28, 7409, 6981],
865                &[29, 6678, 15939],
866                &[30, 20344, 12987],
867                &[31, 2510, 14588],
868                &[32, 17918, 6655],
869                &[33, 6703, 19451],
870                &[34, 496, 4217],
871                &[35, 7290, 5766],
872                &[36, 10521, 8925],
873                &[37, 20379, 11905],
874                &[38, 4090, 5838],
875                &[39, 19082, 17040],
876                &[40, 20233, 12352],
877                &[41, 19365, 19546],
878                &[42, 6249, 19030],
879                &[43, 11037, 19193],
880                &[44, 19760, 11772],
881                &[45, 19644, 7428],
882                &[46, 16076, 3521],
883                &[47, 11779, 21062],
884                &[48, 13062, 9682],
885                &[49, 8934, 5217],
886                &[50, 11087, 3319],
887                &[51, 18892, 4356],
888                &[52, 7894, 3898],
889                &[53, 5963, 4360],
890                &[54, 7346, 11726],
891                &[55, 5182, 5609],
892                &[56, 2412, 17295],
893                &[57, 9845, 20494],
894                &[58, 6687, 1864],
895                &[59, 20564, 5216],
896                &[0, 18226, 17207],
897                &[1, 9380, 8266],
898                &[2, 7073, 3065],
899                &[3, 18252, 13437],
900                &[4, 9161, 15642],
901                &[5, 10714, 10153],
902                &[6, 11585, 9078],
903                &[7, 5359, 9418],
904                &[8, 9024, 9515],
905                &[9, 1206, 16354],
906                &[10, 14994, 1102],
907                &[11, 9375, 20796],
908                &[12, 15964, 6027],
909                &[13, 14789, 6452],
910                &[14, 8002, 18591],
911                &[15, 14742, 14089],
912                &[16, 253, 3045],
913                &[17, 1274, 19286],
914                &[18, 14777, 2044],
915                &[19, 13920, 9900],
916                &[20, 452, 7374],
917                &[21, 18206, 9921],
918                &[22, 6131, 5414],
919                &[23, 10077, 9726],
920                &[24, 12045, 5479],
921                &[25, 4322, 7990],
922                &[26, 15616, 5550],
923                &[27, 15561, 10661],
924                &[28, 20718, 7387],
925                &[29, 2518, 18804],
926                &[30, 8984, 2600],
927                &[31, 6516, 17909],
928                &[32, 11148, 98],
929                &[33, 20559, 3704],
930                &[34, 7510, 1569],
931                &[35, 16000, 11692],
932                &[36, 9147, 10303],
933                &[37, 16650, 191],
934                &[38, 15577, 18685],
935                &[39, 17167, 20917],
936                &[40, 4256, 3391],
937                &[41, 20092, 17219],
938                &[42, 9218, 5056],
939                &[43, 18429, 8472],
940                &[44, 12093, 20753],
941                &[45, 16345, 12748],
942                &[46, 16023, 11095],
943                &[47, 5048, 17595],
944                &[48, 18995, 4817],
945                &[49, 16483, 3536],
946                &[50, 1439, 16148],
947                &[51, 3661, 3039],
948                &[52, 19010, 18121],
949                &[53, 8968, 11793],
950                &[54, 13427, 18003],
951                &[55, 5303, 3083],
952                &[56, 531, 16668],
953                &[57, 4771, 6722],
954                &[58, 5695, 7960],
955                &[59, 3589, 14630],
956            ],
957            // Table B.7 in [1]
958            Code::R3_4 => &[
959                &[
960                    0, 6385, 7901, 14611, 13389, 11200, 3252, 5243, 2504, 2722, 821, 7374,
961                ],
962                &[
963                    1, 11359, 2698, 357, 13824, 12772, 7244, 6752, 15310, 852, 2001, 11417,
964                ],
965                &[
966                    2, 7862, 7977, 6321, 13612, 12197, 14449, 15137, 13860, 1708, 6399, 13444,
967                ],
968                &[
969                    3, 1560, 11804, 6975, 13292, 3646, 3812, 8772, 7306, 5795, 14327, 7866,
970                ],
971                &[
972                    4, 7626, 11407, 14599, 9689, 1628, 2113, 10809, 9283, 1230, 15241, 4870,
973                ],
974                &[
975                    5, 1610, 5699, 15876, 9446, 12515, 1400, 6303, 5411, 14181, 13925, 7358,
976                ],
977                &[
978                    6, 4059, 8836, 3405, 7853, 7992, 15336, 5970, 10368, 10278, 9675, 4651,
979                ],
980                &[
981                    7, 4441, 3963, 9153, 2109, 12683, 7459, 12030, 12221, 629, 15212, 406,
982                ],
983                &[
984                    8, 6007, 8411, 5771, 3497, 543, 14202, 875, 9186, 6235, 13908, 3563,
985                ],
986                &[
987                    9, 3232, 6625, 4795, 546, 9781, 2071, 7312, 3399, 7250, 4932, 12652,
988                ],
989                &[
990                    10, 8820, 10088, 11090, 7069, 6585, 13134, 10158, 7183, 488, 7455, 9238,
991                ],
992                &[
993                    11, 1903, 10818, 119, 215, 7558, 11046, 10615, 11545, 14784, 7961, 15619,
994                ],
995                &[
996                    12, 3655, 8736, 4917, 15874, 5129, 2134, 15944, 14768, 7150, 2692, 1469,
997                ],
998                &[
999                    13, 8316, 3820, 505, 8923, 6757, 806, 7957, 4216, 15589, 13244, 2622,
1000                ],
1001                &[
1002                    14, 14463, 4852, 15733, 3041, 11193, 12860, 13673, 8152, 6551, 15108, 8758,
1003                ],
1004                &[15, 3149, 11981],
1005                &[16, 13416, 6906],
1006                &[17, 13098, 13352],
1007                &[18, 2009, 14460],
1008                &[19, 7207, 4314],
1009                &[20, 3312, 3945],
1010                &[21, 4418, 6248],
1011                &[22, 2669, 13975],
1012                &[23, 7571, 9023],
1013                &[24, 14172, 2967],
1014                &[25, 7271, 7138],
1015                &[26, 6135, 13670],
1016                &[27, 7490, 14559],
1017                &[28, 8657, 2466],
1018                &[29, 8599, 12834],
1019                &[30, 3470, 3152],
1020                &[31, 13917, 4365],
1021                &[32, 6024, 13730],
1022                &[33, 10973, 14182],
1023                &[34, 2464, 13167],
1024                &[35, 5281, 15049],
1025                &[36, 1103, 1849],
1026                &[37, 2058, 1069],
1027                &[38, 9654, 6095],
1028                &[39, 14311, 7667],
1029                &[40, 15617, 8146],
1030                &[41, 4588, 11218],
1031                &[42, 13660, 6243],
1032                &[43, 8578, 7874],
1033                &[44, 11741, 2686],
1034                &[0, 1022, 1264],
1035                &[1, 12604, 9965],
1036                &[2, 8217, 2707],
1037                &[3, 3156, 11793],
1038                &[4, 354, 1514],
1039                &[5, 6978, 14058],
1040                &[6, 7922, 16079],
1041                &[7, 15087, 12138],
1042                &[8, 5053, 6470],
1043                &[9, 12687, 14932],
1044                &[10, 15458, 1763],
1045                &[11, 8121, 1721],
1046                &[12, 12431, 549],
1047                &[13, 4129, 7091],
1048                &[14, 1426, 8415],
1049                &[15, 9783, 7604],
1050                &[16, 6295, 11329],
1051                &[17, 1409, 12061],
1052                &[18, 8065, 9087],
1053                &[19, 2918, 8438],
1054                &[20, 1293, 14115],
1055                &[21, 3922, 13851],
1056                &[22, 3851, 4000],
1057                &[23, 5865, 1768],
1058                &[24, 2655, 14957],
1059                &[25, 5565, 6332],
1060                &[26, 4303, 12631],
1061                &[27, 11653, 12236],
1062                &[28, 16025, 7632],
1063                &[29, 4655, 14128],
1064                &[30, 9584, 13123],
1065                &[31, 13987, 9597],
1066                &[32, 15409, 12110],
1067                &[33, 8754, 15490],
1068                &[34, 7416, 15325],
1069                &[35, 2909, 15549],
1070                &[36, 2995, 8257],
1071                &[37, 9406, 4791],
1072                &[38, 11111, 4854],
1073                &[39, 2812, 8521],
1074                &[40, 8476, 14717],
1075                &[41, 7820, 15360],
1076                &[42, 1179, 7939],
1077                &[43, 2357, 8678],
1078                &[44, 7703, 6216],
1079                &[0, 3477, 7067],
1080                &[1, 3931, 13845],
1081                &[2, 7675, 12899],
1082                &[3, 1754, 8187],
1083                &[4, 7785, 1400],
1084                &[5, 9213, 5891],
1085                &[6, 2494, 7703],
1086                &[7, 2576, 7902],
1087                &[8, 4821, 15682],
1088                &[9, 10426, 11935],
1089                &[10, 1810, 904],
1090                &[11, 11332, 9264],
1091                &[12, 11312, 3570],
1092                &[13, 14916, 2650],
1093                &[14, 7679, 7842],
1094                &[15, 6089, 13084],
1095                &[16, 3938, 2751],
1096                &[17, 8509, 4648],
1097                &[18, 12204, 8917],
1098                &[19, 5749, 12443],
1099                &[20, 12613, 4431],
1100                &[21, 1344, 4014],
1101                &[22, 8488, 13850],
1102                &[23, 1730, 14896],
1103                &[24, 14942, 7126],
1104                &[25, 14983, 8863],
1105                &[26, 6578, 8564],
1106                &[27, 4947, 396],
1107                &[28, 297, 12805],
1108                &[29, 13878, 6692],
1109                &[30, 11857, 11186],
1110                &[31, 14395, 11493],
1111                &[32, 16145, 12251],
1112                &[33, 13462, 7428],
1113                &[34, 14526, 13119],
1114                &[35, 2535, 11243],
1115                &[36, 6465, 12690],
1116                &[37, 6872, 9334],
1117                &[38, 15371, 14023],
1118                &[39, 8101, 10187],
1119                &[40, 11963, 4848],
1120                &[41, 15125, 6119],
1121                &[42, 8051, 14465],
1122                &[43, 11139, 5167],
1123                &[44, 2883, 14521],
1124            ],
1125            // Table B.8 in [1]
1126            Code::R4_5 => &[
1127                &[
1128                    0, 149, 11212, 5575, 6360, 12559, 8108, 8505, 408, 10026, 12828,
1129                ],
1130                &[
1131                    1, 5237, 490, 10677, 4998, 3869, 3734, 3092, 3509, 7703, 10305,
1132                ],
1133                &[
1134                    2, 8742, 5553, 2820, 7085, 12116, 10485, 564, 7795, 2972, 2157,
1135                ],
1136                &[3, 2699, 4304, 8350, 712, 2841, 3250, 4731, 10105, 517, 7516],
1137                &[
1138                    4, 12067, 1351, 11992, 12191, 11267, 5161, 537, 6166, 4246, 2363,
1139                ],
1140                &[
1141                    5, 6828, 7107, 2127, 3724, 5743, 11040, 10756, 4073, 1011, 3422,
1142                ],
1143                &[
1144                    6, 11259, 1216, 9526, 1466, 10816, 940, 3744, 2815, 11506, 11573,
1145                ],
1146                &[
1147                    7, 4549, 11507, 1118, 1274, 11751, 5207, 7854, 12803, 4047, 6484,
1148                ],
1149                &[
1150                    8, 8430, 4115, 9440, 413, 4455, 2262, 7915, 12402, 8579, 7052,
1151                ],
1152                &[9, 3885, 9126, 5665, 4505, 2343, 253, 4707, 3742, 4166, 1556],
1153                &[
1154                    10, 1704, 8936, 6775, 8639, 8179, 7954, 8234, 7850, 8883, 8713,
1155                ],
1156                &[
1157                    11, 11716, 4344, 9087, 11264, 2274, 8832, 9147, 11930, 6054, 5455,
1158                ],
1159                &[
1160                    12, 7323, 3970, 10329, 2170, 8262, 3854, 2087, 12899, 9497, 11700,
1161                ],
1162                &[
1163                    13, 4418, 1467, 2490, 5841, 817, 11453, 533, 11217, 11962, 5251,
1164                ],
1165                &[
1166                    14, 1541, 4525, 7976, 3457, 9536, 7725, 3788, 2982, 6307, 5997,
1167                ],
1168                &[
1169                    15, 11484, 2739, 4023, 12107, 6516, 551, 2572, 6628, 8150, 9852,
1170                ],
1171                &[
1172                    16, 6070, 1761, 4627, 6534, 7913, 3730, 11866, 1813, 12306, 8249,
1173                ],
1174                &[
1175                    17, 12441, 5489, 8748, 7837, 7660, 2102, 11341, 2936, 6712, 11977,
1176                ],
1177                &[18, 10155, 4210],
1178                &[19, 1010, 10483],
1179                &[20, 8900, 10250],
1180                &[21, 10243, 12278],
1181                &[22, 7070, 4397],
1182                &[23, 12271, 3887],
1183                &[24, 11980, 6836],
1184                &[25, 9514, 4356],
1185                &[26, 7137, 10281],
1186                &[27, 11881, 2526],
1187                &[28, 1969, 11477],
1188                &[29, 3044, 10921],
1189                &[30, 2236, 8724],
1190                &[31, 9104, 6340],
1191                &[32, 7342, 8582],
1192                &[33, 11675, 10405],
1193                &[34, 6467, 12775],
1194                &[35, 3186, 12198],
1195                &[0, 9621, 11445],
1196                &[1, 7486, 5611],
1197                &[2, 4319, 4879],
1198                &[3, 2196, 344],
1199                &[4, 7527, 6650],
1200                &[5, 10693, 2440],
1201                &[6, 6755, 2706],
1202                &[7, 5144, 5998],
1203                &[8, 11043, 8033],
1204                &[9, 4846, 4435],
1205                &[10, 4157, 9228],
1206                &[11, 12270, 6562],
1207                &[12, 11954, 7592],
1208                &[13, 7420, 2592],
1209                &[14, 8810, 9636],
1210                &[15, 689, 5430],
1211                &[16, 920, 1304],
1212                &[17, 1253, 11934],
1213                &[18, 9559, 6016],
1214                &[19, 312, 7589],
1215                &[20, 4439, 4197],
1216                &[21, 4002, 9555],
1217                &[22, 12232, 7779],
1218                &[23, 1494, 8782],
1219                &[24, 10749, 3969],
1220                &[25, 4368, 3479],
1221                &[26, 6316, 5342],
1222                &[27, 2455, 3493],
1223                &[28, 12157, 7405],
1224                &[29, 6598, 11495],
1225                &[30, 11805, 4455],
1226                &[31, 9625, 2090],
1227                &[32, 4731, 2321],
1228                &[33, 3578, 2608],
1229                &[34, 8504, 1849],
1230                &[35, 4027, 1151],
1231                &[0, 5647, 4935],
1232                &[1, 4219, 1870],
1233                &[2, 10968, 8054],
1234                &[3, 6970, 5447],
1235                &[4, 3217, 5638],
1236                &[5, 8972, 669],
1237                &[6, 5618, 12472],
1238                &[7, 1457, 1280],
1239                &[8, 8868, 3883],
1240                &[9, 8866, 1224],
1241                &[10, 8371, 5972],
1242                &[11, 266, 4405],
1243                &[12, 3706, 3244],
1244                &[13, 6039, 5844],
1245                &[14, 7200, 3283],
1246                &[15, 1502, 11282],
1247                &[16, 12318, 2202],
1248                &[17, 4523, 965],
1249                &[18, 9587, 7011],
1250                &[19, 2552, 2051],
1251                &[20, 12045, 10306],
1252                &[21, 11070, 5104],
1253                &[22, 6627, 6906],
1254                &[23, 9889, 2121],
1255                &[24, 829, 9701],
1256                &[25, 2201, 1819],
1257                &[26, 6689, 12925],
1258                &[27, 2139, 8757],
1259                &[28, 12004, 5948],
1260                &[29, 8704, 3191],
1261                &[30, 8171, 10933],
1262                &[31, 6297, 7116],
1263                &[32, 616, 7146],
1264                &[33, 5142, 9761],
1265                &[34, 10377, 8138],
1266                &[35, 7616, 5811],
1267                &[0, 7285, 9863],
1268                &[1, 7764, 10867],
1269                &[2, 12343, 9019],
1270                &[3, 4414, 8331],
1271                &[4, 3464, 642],
1272                &[5, 6960, 2039],
1273                &[6, 786, 3021],
1274                &[7, 710, 2086],
1275                &[8, 7423, 5601],
1276                &[9, 8120, 4885],
1277                &[10, 12385, 11990],
1278                &[11, 9739, 10034],
1279                &[12, 424, 10162],
1280                &[13, 1347, 7597],
1281                &[14, 1450, 112],
1282                &[15, 7965, 8478],
1283                &[16, 8945, 7397],
1284                &[17, 6590, 8316],
1285                &[18, 6838, 9011],
1286                &[19, 6174, 9410],
1287                &[20, 255, 113],
1288                &[21, 6197, 5835],
1289                &[22, 12902, 3844],
1290                &[23, 4377, 3505],
1291                &[24, 5478, 8672],
1292                &[25, 4453, 2132],
1293                &[26, 9724, 1380],
1294                &[27, 12131, 11526],
1295                &[28, 12323, 9511],
1296                &[29, 8231, 1752],
1297                &[30, 497, 9022],
1298                &[31, 9288, 3080],
1299                &[32, 2481, 7515],
1300                &[33, 2696, 268],
1301                &[34, 4023, 12341],
1302                &[35, 7108, 5553],
1303            ],
1304            // Table B.9 in [1]
1305            Code::R5_6 => &[
1306                &[
1307                    0, 4362, 416, 8909, 4156, 3216, 3112, 2560, 2912, 6405, 8593, 4969, 6723,
1308                ],
1309                &[
1310                    1, 2479, 1786, 8978, 3011, 4339, 9313, 6397, 2957, 7288, 5484, 6031, 10217,
1311                ],
1312                &[
1313                    2, 10175, 9009, 9889, 3091, 4985, 7267, 4092, 8874, 5671, 2777, 2189, 8716,
1314                ],
1315                &[
1316                    3, 9052, 4795, 3924, 3370, 10058, 1128, 9996, 10165, 9360, 4297, 434, 5138,
1317                ],
1318                &[
1319                    4, 2379, 7834, 4835, 2327, 9843, 804, 329, 8353, 7167, 3070, 1528, 7311,
1320                ],
1321                &[
1322                    5, 3435, 7871, 348, 3693, 1876, 6585, 10340, 7144, 5870, 2084, 4052, 2780,
1323                ],
1324                &[
1325                    6, 3917, 3111, 3476, 1304, 10331, 5939, 5199, 1611, 1991, 699, 8316, 9960,
1326                ],
1327                &[
1328                    7, 6883, 3237, 1717, 10752, 7891, 9764, 4745, 3888, 10009, 4176, 4614, 1567,
1329                ],
1330                &[
1331                    8, 10587, 2195, 1689, 2968, 5420, 2580, 2883, 6496, 111, 6023, 1024, 4449,
1332                ],
1333                &[
1334                    9, 3786, 8593, 2074, 3321, 5057, 1450, 3840, 5444, 6572, 3094, 9892, 1512,
1335                ],
1336                &[
1337                    10, 8548, 1848, 10372, 4585, 7313, 6536, 6379, 1766, 9462, 2456, 5606, 9975,
1338                ],
1339                &[
1340                    11, 8204, 10593, 7935, 3636, 3882, 394, 5968, 8561, 2395, 7289, 9267, 9978,
1341                ],
1342                &[
1343                    12, 7795, 74, 1633, 9542, 6867, 7352, 6417, 7568, 10623, 725, 2531, 9115,
1344                ],
1345                &[
1346                    13, 7151, 2482, 4260, 5003, 10105, 7419, 9203, 6691, 8798, 2092, 8263, 3755,
1347                ],
1348                &[
1349                    14, 3600, 570, 4527, 200, 9718, 6771, 1995, 8902, 5446, 768, 1103, 6520,
1350                ],
1351                &[15, 6304, 7621],
1352                &[16, 6498, 9209],
1353                &[17, 7293, 6786],
1354                &[18, 5950, 1708],
1355                &[19, 8521, 1793],
1356                &[20, 6174, 7854],
1357                &[21, 9773, 1190],
1358                &[22, 9517, 10268],
1359                &[23, 2181, 9349],
1360                &[24, 1949, 5560],
1361                &[25, 1556, 555],
1362                &[26, 8600, 3827],
1363                &[27, 5072, 1057],
1364                &[28, 7928, 3542],
1365                &[29, 3226, 3762],
1366                &[0, 7045, 2420],
1367                &[1, 9645, 2641],
1368                &[2, 2774, 2452],
1369                &[3, 5331, 2031],
1370                &[4, 9400, 7503],
1371                &[5, 1850, 2338],
1372                &[6, 10456, 9774],
1373                &[7, 1692, 9276],
1374                &[8, 10037, 4038],
1375                &[9, 3964, 338],
1376                &[10, 2640, 5087],
1377                &[11, 858, 3473],
1378                &[12, 5582, 5683],
1379                &[13, 9523, 916],
1380                &[14, 4107, 1559],
1381                &[15, 4506, 3491],
1382                &[16, 8191, 4182],
1383                &[17, 10192, 6157],
1384                &[18, 5668, 3305],
1385                &[19, 3449, 1540],
1386                &[20, 4766, 2697],
1387                &[21, 4069, 6675],
1388                &[22, 1117, 1016],
1389                &[23, 5619, 3085],
1390                &[24, 8483, 8400],
1391                &[25, 8255, 394],
1392                &[26, 6338, 5042],
1393                &[27, 6174, 5119],
1394                &[28, 7203, 1989],
1395                &[29, 1781, 5174],
1396                &[0, 1464, 3559],
1397                &[1, 3376, 4214],
1398                &[2, 7238, 67],
1399                &[3, 10595, 8831],
1400                &[4, 1221, 6513],
1401                &[5, 5300, 4652],
1402                &[6, 1429, 9749],
1403                &[7, 7878, 5131],
1404                &[8, 4435, 10284],
1405                &[9, 6331, 5507],
1406                &[10, 6662, 4941],
1407                &[11, 9614, 10238],
1408                &[12, 8400, 8025],
1409                &[13, 9156, 5630],
1410                &[14, 7067, 8878],
1411                &[15, 9027, 3415],
1412                &[16, 1690, 3866],
1413                &[17, 2854, 8469],
1414                &[18, 6206, 630],
1415                &[19, 363, 5453],
1416                &[20, 4125, 7008],
1417                &[21, 1612, 6702],
1418                &[22, 9069, 9226],
1419                &[23, 5767, 4060],
1420                &[24, 3743, 9237],
1421                &[25, 7018, 5572],
1422                &[26, 8892, 4536],
1423                &[27, 853, 6064],
1424                &[28, 8069, 5893],
1425                &[29, 2051, 2885],
1426                &[0, 10691, 3153],
1427                &[1, 3602, 4055],
1428                &[2, 328, 1717],
1429                &[3, 2219, 9299],
1430                &[4, 1939, 7898],
1431                &[5, 617, 206],
1432                &[6, 8544, 1374],
1433                &[7, 10676, 3240],
1434                &[8, 6672, 9489],
1435                &[9, 3170, 7457],
1436                &[10, 7868, 5731],
1437                &[11, 6121, 10732],
1438                &[12, 4843, 9132],
1439                &[13, 580, 9591],
1440                &[14, 6267, 9290],
1441                &[15, 3009, 2268],
1442                &[16, 195, 2419],
1443                &[17, 8016, 1557],
1444                &[18, 1516, 9195],
1445                &[19, 8062, 9064],
1446                &[20, 2095, 8968],
1447                &[21, 753, 7326],
1448                &[22, 6291, 3833],
1449                &[23, 2614, 7844],
1450                &[24, 2303, 646],
1451                &[25, 2075, 611],
1452                &[26, 4687, 362],
1453                &[27, 8684, 9940],
1454                &[28, 4830, 2065],
1455                &[29, 7038, 1363],
1456                &[0, 1769, 7837],
1457                &[1, 3801, 1689],
1458                &[2, 10070, 2359],
1459                &[3, 3667, 9918],
1460                &[4, 1914, 6920],
1461                &[5, 4244, 5669],
1462                &[6, 10245, 7821],
1463                &[7, 7648, 3944],
1464                &[8, 3310, 5488],
1465                &[9, 6346, 9666],
1466                &[10, 7088, 6122],
1467                &[11, 1291, 7827],
1468                &[12, 10592, 8945],
1469                &[13, 3609, 7120],
1470                &[14, 9168, 9112],
1471                &[15, 6203, 8052],
1472                &[16, 3330, 2895],
1473                &[17, 4264, 10563],
1474                &[18, 10556, 6496],
1475                &[19, 8807, 7645],
1476                &[20, 1999, 4530],
1477                &[21, 9202, 6818],
1478                &[22, 3403, 1734],
1479                &[23, 2106, 9023],
1480                &[24, 6881, 3883],
1481                &[25, 3895, 2171],
1482                &[26, 4062, 6424],
1483                &[27, 3755, 9536],
1484                &[28, 4683, 2131],
1485                &[29, 7347, 8027],
1486            ],
1487            // Table B.10 in [1]
1488            Code::R8_9 => &[
1489                &[0, 6235, 2848, 3222],
1490                &[1, 5800, 3492, 5348],
1491                &[2, 2757, 927, 90],
1492                &[3, 6961, 4516, 4739],
1493                &[4, 1172, 3237, 6264],
1494                &[5, 1927, 2425, 3683],
1495                &[6, 3714, 6309, 2495],
1496                &[7, 3070, 6342, 7154],
1497                &[8, 2428, 613, 3761],
1498                &[9, 2906, 264, 5927],
1499                &[10, 1716, 1950, 4273],
1500                &[11, 4613, 6179, 3491],
1501                &[12, 4865, 3286, 6005],
1502                &[13, 1343, 5923, 3529],
1503                &[14, 4589, 4035, 2132],
1504                &[15, 1579, 3920, 6737],
1505                &[16, 1644, 1191, 5998],
1506                &[17, 1482, 2381, 4620],
1507                &[18, 6791, 6014, 6596],
1508                &[19, 2738, 5918, 3786],
1509                &[0, 5156, 6166],
1510                &[1, 1504, 4356],
1511                &[2, 130, 1904],
1512                &[3, 6027, 3187],
1513                &[4, 6718, 759],
1514                &[5, 6240, 2870],
1515                &[6, 2343, 1311],
1516                &[7, 1039, 5465],
1517                &[8, 6617, 2513],
1518                &[9, 1588, 5222],
1519                &[10, 6561, 535],
1520                &[11, 4765, 2054],
1521                &[12, 5966, 6892],
1522                &[13, 1969, 3869],
1523                &[14, 3571, 2420],
1524                &[15, 4632, 981],
1525                &[16, 3215, 4163],
1526                &[17, 973, 3117],
1527                &[18, 3802, 6198],
1528                &[19, 3794, 3948],
1529                &[0, 3196, 6126],
1530                &[1, 573, 1909],
1531                &[2, 850, 4034],
1532                &[3, 5622, 1601],
1533                &[4, 6005, 524],
1534                &[5, 5251, 5783],
1535                &[6, 172, 2032],
1536                &[7, 1875, 2475],
1537                &[8, 497, 1291],
1538                &[9, 2566, 3430],
1539                &[10, 1249, 740],
1540                &[11, 2944, 1948],
1541                &[12, 6528, 2899],
1542                &[13, 2243, 3616],
1543                &[14, 867, 3733],
1544                &[15, 1374, 4702],
1545                &[16, 4698, 2285],
1546                &[17, 4760, 3917],
1547                &[18, 1859, 4058],
1548                &[19, 6141, 3527],
1549                &[0, 2148, 5066],
1550                &[1, 1306, 145],
1551                &[2, 2319, 871],
1552                &[3, 3463, 1061],
1553                &[4, 5554, 6647],
1554                &[5, 5837, 339],
1555                &[6, 5821, 4932],
1556                &[7, 6356, 4756],
1557                &[8, 3930, 418],
1558                &[9, 211, 3094],
1559                &[10, 1007, 4928],
1560                &[11, 3584, 1235],
1561                &[12, 6982, 2869],
1562                &[13, 1612, 1013],
1563                &[14, 953, 4964],
1564                &[15, 4555, 4410],
1565                &[16, 4925, 4842],
1566                &[17, 5778, 600],
1567                &[18, 6509, 2417],
1568                &[19, 1260, 4903],
1569                &[0, 3369, 3031],
1570                &[1, 3557, 3224],
1571                &[2, 3028, 583],
1572                &[3, 3258, 440],
1573                &[4, 6226, 6655],
1574                &[5, 4895, 1094],
1575                &[6, 1481, 6847],
1576                &[7, 4433, 1932],
1577                &[8, 2107, 1649],
1578                &[9, 2119, 2065],
1579                &[10, 4003, 6388],
1580                &[11, 6720, 3622],
1581                &[12, 3694, 4521],
1582                &[13, 1164, 7050],
1583                &[14, 1965, 3613],
1584                &[15, 4331, 66],
1585                &[16, 2970, 1796],
1586                &[17, 4652, 3218],
1587                &[18, 1762, 4777],
1588                &[19, 5736, 1399],
1589                &[0, 970, 2572],
1590                &[1, 2062, 6599],
1591                &[2, 4597, 4870],
1592                &[3, 1228, 6913],
1593                &[4, 4159, 1037],
1594                &[5, 2916, 2362],
1595                &[6, 395, 1226],
1596                &[7, 6911, 4548],
1597                &[8, 4618, 2241],
1598                &[9, 4120, 4280],
1599                &[10, 5825, 474],
1600                &[11, 2154, 5558],
1601                &[12, 3793, 5471],
1602                &[13, 5707, 1595],
1603                &[14, 1403, 325],
1604                &[15, 6601, 5183],
1605                &[16, 6369, 4569],
1606                &[17, 4846, 896],
1607                &[18, 7092, 6184],
1608                &[19, 6764, 7127],
1609                &[0, 6358, 1951],
1610                &[1, 3117, 6960],
1611                &[2, 2710, 7062],
1612                &[3, 1133, 3604],
1613                &[4, 3694, 657],
1614                &[5, 1355, 110],
1615                &[6, 3329, 6736],
1616                &[7, 2505, 3407],
1617                &[8, 2462, 4806],
1618                &[9, 4216, 214],
1619                &[10, 5348, 5619],
1620                &[11, 6627, 6243],
1621                &[12, 2644, 5073],
1622                &[13, 4212, 5088],
1623                &[14, 3463, 3889],
1624                &[15, 5306, 478],
1625                &[16, 4320, 6121],
1626                &[17, 3961, 1125],
1627                &[18, 5699, 1195],
1628                &[19, 6511, 792],
1629                &[0, 3934, 2778],
1630                &[1, 3238, 6587],
1631                &[2, 1111, 6596],
1632                &[3, 1457, 6226],
1633                &[4, 1446, 3885],
1634                &[5, 3907, 4043],
1635                &[6, 6839, 2873],
1636                &[7, 1733, 5615],
1637                &[8, 5202, 4269],
1638                &[9, 3024, 4722],
1639                &[10, 5445, 6372],
1640                &[11, 370, 1828],
1641                &[12, 4695, 1600],
1642                &[13, 680, 2074],
1643                &[14, 1801, 6690],
1644                &[15, 2669, 1377],
1645                &[16, 2463, 1681],
1646                &[17, 5972, 5171],
1647                &[18, 5728, 4284],
1648                &[19, 1696, 1459],
1649            ],
1650            // Table B.11 in [1]
1651            Code::R9_10 => &[
1652                &[0, 5611, 2563, 2900],
1653                &[1, 5220, 3143, 4813],
1654                &[2, 2481, 834, 81],
1655                &[3, 6265, 4064, 4265],
1656                &[4, 1055, 2914, 5638],
1657                &[5, 1734, 2182, 3315],
1658                &[6, 3342, 5678, 2246],
1659                &[7, 2185, 552, 3385],
1660                &[8, 2615, 236, 5334],
1661                &[9, 1546, 1755, 3846],
1662                &[10, 4154, 5561, 3142],
1663                &[11, 4382, 2957, 5400],
1664                &[12, 1209, 5329, 3179],
1665                &[13, 1421, 3528, 6063],
1666                &[14, 1480, 1072, 5398],
1667                &[15, 3843, 1777, 4369],
1668                &[16, 1334, 2145, 4163],
1669                &[17, 2368, 5055, 260],
1670                &[0, 6118, 5405],
1671                &[1, 2994, 4370],
1672                &[2, 3405, 1669],
1673                &[3, 4640, 5550],
1674                &[4, 1354, 3921],
1675                &[5, 117, 1713],
1676                &[6, 5425, 2866],
1677                &[7, 6047, 683],
1678                &[8, 5616, 2582],
1679                &[9, 2108, 1179],
1680                &[10, 933, 4921],
1681                &[11, 5953, 2261],
1682                &[12, 1430, 4699],
1683                &[13, 5905, 480],
1684                &[14, 4289, 1846],
1685                &[15, 5374, 6208],
1686                &[16, 1775, 3476],
1687                &[17, 3216, 2178],
1688                &[0, 4165, 884],
1689                &[1, 2896, 3744],
1690                &[2, 874, 2801],
1691                &[3, 3423, 5579],
1692                &[4, 3404, 3552],
1693                &[5, 2876, 5515],
1694                &[6, 516, 1719],
1695                &[7, 765, 3631],
1696                &[8, 5059, 1441],
1697                &[9, 5629, 598],
1698                &[10, 5405, 473],
1699                &[11, 4724, 5210],
1700                &[12, 155, 1832],
1701                &[13, 1689, 2229],
1702                &[14, 449, 1164],
1703                &[15, 2308, 3088],
1704                &[16, 1122, 669],
1705                &[17, 2268, 5758],
1706                &[0, 5878, 2609],
1707                &[1, 782, 3359],
1708                &[2, 1231, 4231],
1709                &[3, 4225, 2052],
1710                &[4, 4286, 3517],
1711                &[5, 5531, 3184],
1712                &[6, 1935, 4560],
1713                &[7, 1174, 131],
1714                &[8, 3115, 956],
1715                &[9, 3129, 1088],
1716                &[10, 5238, 4440],
1717                &[11, 5722, 4280],
1718                &[12, 3540, 375],
1719                &[13, 191, 2782],
1720                &[14, 906, 4432],
1721                &[15, 3225, 1111],
1722                &[16, 6296, 2583],
1723                &[17, 1457, 903],
1724                &[0, 855, 4475],
1725                &[1, 4097, 3970],
1726                &[2, 4433, 4361],
1727                &[3, 5198, 541],
1728                &[4, 1146, 4426],
1729                &[5, 3202, 2902],
1730                &[6, 2724, 525],
1731                &[7, 1083, 4124],
1732                &[8, 2326, 6003],
1733                &[9, 5605, 5990],
1734                &[10, 4376, 1579],
1735                &[11, 4407, 984],
1736                &[12, 1332, 6163],
1737                &[13, 5359, 3975],
1738                &[14, 1907, 1854],
1739                &[15, 3601, 5748],
1740                &[16, 6056, 3266],
1741                &[17, 3322, 4085],
1742                &[0, 1768, 3244],
1743                &[1, 2149, 144],
1744                &[2, 1589, 4291],
1745                &[3, 5154, 1252],
1746                &[4, 1855, 5939],
1747                &[5, 4820, 2706],
1748                &[6, 1475, 3360],
1749                &[7, 4266, 693],
1750                &[8, 4156, 2018],
1751                &[9, 2103, 752],
1752                &[10, 3710, 3853],
1753                &[11, 5123, 931],
1754                &[12, 6146, 3323],
1755                &[13, 1939, 5002],
1756                &[14, 5140, 1437],
1757                &[15, 1263, 293],
1758                &[16, 5949, 4665],
1759                &[17, 4548, 6380],
1760                &[0, 3171, 4690],
1761                &[1, 5204, 2114],
1762                &[2, 6384, 5565],
1763                &[3, 5722, 1757],
1764                &[4, 2805, 6264],
1765                &[5, 1202, 2616],
1766                &[6, 1018, 3244],
1767                &[7, 4018, 5289],
1768                &[8, 2257, 3067],
1769                &[9, 2483, 3073],
1770                &[10, 1196, 5329],
1771                &[11, 649, 3918],
1772                &[12, 3791, 4581],
1773                &[13, 5028, 3803],
1774                &[14, 3119, 3506],
1775                &[15, 4779, 431],
1776                &[16, 3888, 5510],
1777                &[17, 4387, 4084],
1778                &[0, 5836, 1692],
1779                &[1, 5126, 1078],
1780                &[2, 5721, 6165],
1781                &[3, 3540, 2499],
1782                &[4, 2225, 6348],
1783                &[5, 1044, 1484],
1784                &[6, 6323, 4042],
1785                &[7, 1313, 5603],
1786                &[8, 1303, 3496],
1787                &[9, 3516, 3639],
1788                &[10, 5161, 2293],
1789                &[11, 4682, 3845],
1790                &[12, 3045, 643],
1791                &[13, 2818, 2616],
1792                &[14, 3267, 649],
1793                &[15, 6236, 593],
1794                &[16, 646, 2948],
1795                &[17, 4213, 1442],
1796                &[0, 5779, 1596],
1797                &[1, 2403, 1237],
1798                &[2, 2217, 1514],
1799                &[3, 5609, 716],
1800                &[4, 5155, 3858],
1801                &[5, 1517, 1312],
1802                &[6, 2554, 3158],
1803                &[7, 5280, 2643],
1804                &[8, 4990, 1353],
1805                &[9, 5648, 1170],
1806                &[10, 1152, 4366],
1807                &[11, 3561, 5368],
1808                &[12, 3581, 1411],
1809                &[13, 5647, 4661],
1810                &[14, 1542, 5401],
1811                &[15, 5078, 2687],
1812                &[16, 316, 1755],
1813                &[17, 3392, 1991],
1814            ],
1815            // Table C.1 in [1]
1816            Code::R1_4short => &[
1817                &[
1818                    6295, 9626, 304, 7695, 4839, 4936, 1660, 144, 11203, 5567, 6347, 12557,
1819                ],
1820                &[
1821                    10691, 4988, 3859, 3734, 3071, 3494, 7687, 10313, 5964, 8069, 8296, 11090,
1822                ],
1823                &[
1824                    10774, 3613, 5208, 11177, 7676, 3549, 8746, 6583, 7239, 12265, 2674, 4292,
1825                ],
1826                &[
1827                    11869, 3708, 5981, 8718, 4908, 10650, 6805, 3334, 2627, 10461, 9285, 11120,
1828                ],
1829                &[7844, 3079, 10773],
1830                &[3385, 10854, 5747],
1831                &[1360, 12010, 12202],
1832                &[6189, 4241, 2343],
1833                &[9840, 12726, 4977],
1834            ],
1835            // Table C.2 in [1]
1836            Code::R1_3short => &[
1837                &[
1838                    416, 8909, 4156, 3216, 3112, 2560, 2912, 6405, 8593, 4969, 6723, 6912,
1839                ],
1840                &[
1841                    8978, 3011, 4339, 9312, 6396, 2957, 7288, 5485, 6031, 10218, 2226, 3575,
1842                ],
1843                &[
1844                    3383, 10059, 1114, 10008, 10147, 9384, 4290, 434, 5139, 3536, 1965, 2291,
1845                ],
1846                &[
1847                    2797, 3693, 7615, 7077, 743, 1941, 8716, 6215, 3840, 5140, 4582, 5420,
1848                ],
1849                &[
1850                    6110, 8551, 1515, 7404, 4879, 4946, 5383, 1831, 3441, 9569, 10472, 4306,
1851                ],
1852                &[1505, 5682, 7778],
1853                &[7172, 6830, 6623],
1854                &[7281, 3941, 3505],
1855                &[10270, 8669, 914],
1856                &[3622, 7563, 9388],
1857                &[9930, 5058, 4554],
1858                &[4844, 9609, 2707],
1859                &[6883, 3237, 1714],
1860                &[4768, 3878, 10017],
1861                &[10127, 3334, 8267],
1862            ],
1863            // Table C.3 in [1]
1864            Code::R2_5short => &[
1865                &[
1866                    5650, 4143, 8750, 583, 6720, 8071, 635, 1767, 1344, 6922, 738, 6658,
1867                ],
1868                &[
1869                    5696, 1685, 3207, 415, 7019, 5023, 5608, 2605, 857, 6915, 1770, 8016,
1870                ],
1871                &[
1872                    3992, 771, 2190, 7258, 8970, 7792, 1802, 1866, 6137, 8841, 886, 1931,
1873                ],
1874                &[
1875                    4108, 3781, 7577, 6810, 9322, 8226, 5396, 5867, 4428, 8827, 7766, 2254,
1876                ],
1877                &[
1878                    4247, 888, 4367, 8821, 9660, 324, 5864, 4774, 227, 7889, 6405, 8963,
1879                ],
1880                &[
1881                    9693, 500, 2520, 2227, 1811, 9330, 1928, 5140, 4030, 4824, 806, 3134,
1882                ],
1883                &[1652, 8171, 1435],
1884                &[3366, 6543, 3745],
1885                &[9286, 8509, 4645],
1886                &[7397, 5790, 8972],
1887                &[6597, 4422, 1799],
1888                &[9276, 4041, 3847],
1889                &[8683, 7378, 4946],
1890                &[5348, 1993, 9186],
1891                &[6724, 9015, 5646],
1892                &[4502, 4439, 8474],
1893                &[5107, 7342, 9442],
1894                &[1387, 8910, 2660],
1895            ],
1896            // Table C.4 in [1]
1897            Code::R1_2short => &[
1898                &[20, 712, 2386, 6354, 4061, 1062, 5045, 5158],
1899                &[21, 2543, 5748, 4822, 2348, 3089, 6328, 5876],
1900                &[22, 926, 5701, 269, 3693, 2438, 3190, 3507],
1901                &[23, 2802, 4520, 3577, 5324, 1091, 4667, 4449],
1902                &[24, 5140, 2003, 1263, 4742, 6497, 1185, 6202],
1903                &[0, 4046, 6934],
1904                &[1, 2855, 66],
1905                &[2, 6694, 212],
1906                &[3, 3439, 1158],
1907                &[4, 3850, 4422],
1908                &[5, 5924, 290],
1909                &[6, 1467, 4049],
1910                &[7, 7820, 2242],
1911                &[8, 4606, 3080],
1912                &[9, 4633, 7877],
1913                &[10, 3884, 6868],
1914                &[11, 8935, 4996],
1915                &[12, 3028, 764],
1916                &[13, 5988, 1057],
1917                &[14, 7411, 3450],
1918            ],
1919            // Table C.5 in [1]
1920            Code::R3_5short => &[
1921                &[
1922                    2765, 5713, 6426, 3596, 1374, 4811, 2182, 544, 3394, 2840, 4310, 771,
1923                ],
1924                &[
1925                    4951, 211, 2208, 723, 1246, 2928, 398, 5739, 265, 5601, 5993, 2615,
1926                ],
1927                &[
1928                    210, 4730, 5777, 3096, 4282, 6238, 4939, 1119, 6463, 5298, 6320, 4016,
1929                ],
1930                &[
1931                    4167, 2063, 4757, 3157, 5664, 3956, 6045, 563, 4284, 2441, 3412, 6334,
1932                ],
1933                &[
1934                    4201, 2428, 4474, 59, 1721, 736, 2997, 428, 3807, 1513, 4732, 6195,
1935                ],
1936                &[
1937                    2670, 3081, 5139, 3736, 1999, 5889, 4362, 3806, 4534, 5409, 6384, 5809,
1938                ],
1939                &[
1940                    5516, 1622, 2906, 3285, 1257, 5797, 3816, 817, 875, 2311, 3543, 1205,
1941                ],
1942                &[
1943                    4244, 2184, 5415, 1705, 5642, 4886, 2333, 287, 1848, 1121, 3595, 6022,
1944                ],
1945                &[
1946                    2142, 2830, 4069, 5654, 1295, 2951, 3919, 1356, 884, 1786, 396, 4738,
1947                ],
1948                &[0, 2161, 2653],
1949                &[1, 1380, 1461],
1950                &[2, 2502, 3707],
1951                &[3, 3971, 1057],
1952                &[4, 5985, 6062],
1953                &[5, 1733, 6028],
1954                &[6, 3786, 1936],
1955                &[7, 4292, 956],
1956                &[8, 5692, 3417],
1957                &[9, 266, 4878],
1958                &[10, 4913, 3247],
1959                &[11, 4763, 3937],
1960                &[12, 3590, 2903],
1961                &[13, 2566, 4215],
1962                &[14, 5208, 4707],
1963                &[15, 3940, 3388],
1964                &[16, 5109, 4556],
1965                &[17, 4908, 4177],
1966            ],
1967            // Table C.6 in [1]
1968            Code::R2_3short => &[
1969                &[
1970                    0, 2084, 1613, 1548, 1286, 1460, 3196, 4297, 2481, 3369, 3451, 4620, 2622,
1971                ],
1972                &[
1973                    1, 122, 1516, 3448, 2880, 1407, 1847, 3799, 3529, 373, 971, 4358, 3108,
1974                ],
1975                &[
1976                    2, 259, 3399, 929, 2650, 864, 3996, 3833, 107, 5287, 164, 3125, 2350,
1977                ],
1978                &[3, 342, 3529],
1979                &[4, 4198, 2147],
1980                &[5, 1880, 4836],
1981                &[6, 3864, 4910],
1982                &[7, 243, 1542],
1983                &[8, 3011, 1436],
1984                &[9, 2167, 2512],
1985                &[10, 4606, 1003],
1986                &[11, 2835, 705],
1987                &[12, 3426, 2365],
1988                &[13, 3848, 2474],
1989                &[14, 1360, 1743],
1990                &[0, 163, 2536],
1991                &[1, 2583, 1180],
1992                &[2, 1542, 509],
1993                &[3, 4418, 1005],
1994                &[4, 5212, 5117],
1995                &[5, 2155, 2922],
1996                &[6, 347, 2696],
1997                &[7, 226, 4296],
1998                &[8, 1560, 487],
1999                &[9, 3926, 1640],
2000                &[10, 149, 2928],
2001                &[11, 2364, 563],
2002                &[12, 635, 688],
2003                &[13, 231, 1684],
2004                &[14, 1129, 3894],
2005            ],
2006            // Table C.7 in [1]
2007            Code::R3_4short => &[
2008                &[
2009                    3, 3198, 478, 4207, 1481, 1009, 2616, 1924, 3437, 554, 683, 1801,
2010                ],
2011                &[4, 2681, 2135],
2012                &[5, 3107, 4027],
2013                &[6, 2637, 3373],
2014                &[7, 3830, 3449],
2015                &[8, 4129, 2060],
2016                &[9, 4184, 2742],
2017                &[10, 3946, 1070],
2018                &[11, 2239, 984],
2019                &[0, 1458, 3031],
2020                &[1, 3003, 1328],
2021                &[2, 1137, 1716],
2022                &[3, 132, 3725],
2023                &[4, 1817, 638],
2024                &[5, 1774, 3447],
2025                &[6, 3632, 1257],
2026                &[7, 542, 3694],
2027                &[8, 1015, 1945],
2028                &[9, 1948, 412],
2029                &[10, 995, 2238],
2030                &[11, 4141, 1907],
2031                &[0, 2480, 3079],
2032                &[1, 3021, 1088],
2033                &[2, 713, 1379],
2034                &[3, 997, 3903],
2035                &[4, 2323, 3361],
2036                &[5, 1110, 986],
2037                &[6, 2532, 142],
2038                &[7, 1690, 2405],
2039                &[8, 1298, 1881],
2040                &[9, 615, 174],
2041                &[10, 1648, 3112],
2042                &[11, 1415, 2808],
2043            ],
2044            // Table C.8 in [1]
2045            Code::R4_5short => &[
2046                &[5, 896, 1565],
2047                &[6, 2493, 184],
2048                &[7, 212, 3210],
2049                &[8, 727, 1339],
2050                &[9, 3428, 612],
2051                &[0, 2663, 1947],
2052                &[1, 230, 2695],
2053                &[2, 2025, 2794],
2054                &[3, 3039, 283],
2055                &[4, 862, 2889],
2056                &[5, 376, 2110],
2057                &[6, 2034, 2286],
2058                &[7, 951, 2068],
2059                &[8, 3108, 3542],
2060                &[9, 307, 1421],
2061                &[0, 2272, 1197],
2062                &[1, 1800, 3280],
2063                &[2, 331, 2308],
2064                &[3, 465, 2552],
2065                &[4, 1038, 2479],
2066                &[5, 1383, 343],
2067                &[6, 94, 236],
2068                &[7, 2619, 121],
2069                &[8, 1497, 2774],
2070                &[9, 2116, 1855],
2071                &[0, 722, 1584],
2072                &[1, 2767, 1881],
2073                &[2, 2701, 1610],
2074                &[3, 3283, 1732],
2075                &[4, 168, 1099],
2076                &[5, 3074, 243],
2077                &[6, 3460, 945],
2078                &[7, 2049, 1746],
2079                &[8, 566, 1427],
2080                &[9, 3545, 1168],
2081            ],
2082            // Table C.9 in [1]
2083            Code::R5_6short => &[
2084                &[
2085                    3, 2409, 499, 1481, 908, 559, 716, 1270, 333, 2508, 2264, 1702, 2805,
2086                ],
2087                &[4, 2447, 1926],
2088                &[5, 414, 1224],
2089                &[6, 2114, 842],
2090                &[7, 212, 573],
2091                &[0, 2383, 2112],
2092                &[1, 2286, 2348],
2093                &[2, 545, 819],
2094                &[3, 1264, 143],
2095                &[4, 1701, 2258],
2096                &[5, 964, 166],
2097                &[6, 114, 2413],
2098                &[7, 2243, 81],
2099                &[0, 1245, 1581],
2100                &[1, 775, 169],
2101                &[2, 1696, 1104],
2102                &[3, 1914, 2831],
2103                &[4, 532, 1450],
2104                &[5, 91, 974],
2105                &[6, 497, 2228],
2106                &[7, 2326, 1579],
2107                &[0, 2482, 256],
2108                &[1, 1117, 1261],
2109                &[2, 1257, 1658],
2110                &[3, 1478, 1225],
2111                &[4, 2511, 980],
2112                &[5, 2320, 2675],
2113                &[6, 435, 1278],
2114                &[7, 228, 503],
2115                &[0, 1885, 2369],
2116                &[1, 57, 483],
2117                &[2, 838, 1050],
2118                &[3, 1231, 1990],
2119                &[4, 1738, 68],
2120                &[5, 2392, 951],
2121                &[6, 163, 645],
2122                &[7, 2644, 1704],
2123            ],
2124            // Table C.10 in [1]
2125            Code::R8_9short => &[
2126                &[0, 1558, 712, 805],
2127                &[1, 1450, 873, 1337],
2128                &[2, 1741, 1129, 1184],
2129                &[3, 294, 806, 1566],
2130                &[4, 482, 605, 923],
2131                &[0, 926, 1578],
2132                &[1, 777, 1374],
2133                &[2, 608, 151],
2134                &[3, 1195, 210],
2135                &[4, 1484, 692],
2136                &[0, 427, 488],
2137                &[1, 828, 1124],
2138                &[2, 874, 1366],
2139                &[3, 1500, 835],
2140                &[4, 1496, 502],
2141                &[0, 1006, 1701],
2142                &[1, 1155, 97],
2143                &[2, 657, 1403],
2144                &[3, 1453, 624],
2145                &[4, 429, 1495],
2146                &[0, 809, 385],
2147                &[1, 367, 151],
2148                &[2, 1323, 202],
2149                &[3, 960, 318],
2150                &[4, 1451, 1039],
2151                &[0, 1098, 1722],
2152                &[1, 1015, 1428],
2153                &[2, 1261, 1564],
2154                &[3, 544, 1190],
2155                &[4, 1472, 1246],
2156                &[0, 508, 630],
2157                &[1, 421, 1704],
2158                &[2, 284, 898],
2159                &[3, 392, 577],
2160                &[4, 1155, 556],
2161                &[0, 631, 1000],
2162                &[1, 732, 1368],
2163                &[2, 1328, 329],
2164                &[3, 1515, 506],
2165                &[4, 1104, 1172],
2166            ],
2167        }
2168    }
2169}
2170
2171#[cfg(test)]
2172mod tests {
2173    use super::*;
2174
2175    #[test]
2176    fn construct_h() {
2177        for code in enum_iterator::all::<Code>() {
2178            let h = code.h();
2179            assert_eq!(h.num_rows(), code.m());
2180            assert_eq!(h.num_cols(), code.n());
2181        }
2182    }
2183
2184    #[test]
2185    fn regular_row_weight() {
2186        let irregular = [Code::R1_4short, Code::R4_5short];
2187        let very_irregular = [Code::R1_2short, Code::R3_4short, Code::R5_6short];
2188
2189        for code in enum_iterator::all::<Code>().filter(|code| !very_irregular.contains(code)) {
2190            let h = code.h();
2191            let w = h.row_weight(0);
2192            let mut all_rows = 1..h.num_rows();
2193            if irregular.contains(&code) {
2194                assert!(all_rows.all(|r| {
2195                    let v = h.row_weight(r);
2196                    v == w + 2 || v == w + 1 || v == w
2197                }));
2198            } else {
2199                assert!(all_rows.all(|r| h.row_weight(r) == w + 1));
2200            };
2201        }
2202    }
2203}