raptorq/src/systematic_constants.rs

1081 lines
27 KiB
Rust

// K'_max as defined in section 5.1.2
pub const MAX_SOURCE_SYMBOLS_PER_BLOCK: u32 = 56403;
// Table 2, as defined in section 5.6
pub const SYSTEMATIC_INDICES_AND_PARAMETERS: [(u32, u32, u32, u32, u32); 477] = [
(10, 254, 7, 10, 17),
(12, 630, 7, 10, 19),
(18, 682, 11, 10, 29),
(20, 293, 11, 10, 31),
(26, 80, 11, 10, 37),
(30, 566, 11, 10, 41),
(32, 860, 11, 10, 43),
(36, 267, 11, 10, 47),
(42, 822, 11, 10, 53),
(46, 506, 13, 10, 59),
(48, 589, 13, 10, 61),
(49, 87, 13, 10, 61),
(55, 520, 13, 10, 67),
(60, 159, 13, 10, 71),
(62, 235, 13, 10, 73),
(69, 157, 13, 10, 79),
(75, 502, 17, 10, 89),
(84, 334, 17, 10, 97),
(88, 583, 17, 10, 101),
(91, 66, 17, 10, 103),
(95, 352, 17, 10, 107),
(97, 365, 17, 10, 109),
(101, 562, 17, 10, 113),
(114, 5, 19, 10, 127),
(119, 603, 19, 10, 131),
(125, 721, 19, 10, 137),
(127, 28, 19, 10, 139),
(138, 660, 19, 10, 149),
(140, 829, 19, 10, 151),
(149, 900, 23, 10, 163),
(153, 930, 23, 10, 167),
(160, 814, 23, 10, 173),
(166, 661, 23, 10, 179),
(168, 693, 23, 10, 181),
(179, 780, 23, 10, 191),
(181, 605, 23, 10, 193),
(185, 551, 23, 10, 197),
(187, 777, 23, 10, 199),
(200, 491, 23, 10, 211),
(213, 396, 23, 10, 223),
(217, 764, 29, 10, 233),
(225, 843, 29, 10, 241),
(236, 646, 29, 10, 251),
(242, 557, 29, 10, 257),
(248, 608, 29, 10, 263),
(257, 265, 29, 10, 271),
(263, 505, 29, 10, 277),
(269, 722, 29, 10, 283),
(280, 263, 29, 10, 293),
(295, 999, 29, 10, 307),
(301, 874, 29, 10, 313),
(305, 160, 29, 10, 317),
(324, 575, 31, 10, 337),
(337, 210, 31, 10, 349),
(341, 513, 31, 10, 353),
(347, 503, 31, 10, 359),
(355, 558, 31, 10, 367),
(362, 932, 31, 10, 373),
(368, 404, 31, 10, 379),
(372, 520, 37, 10, 389),
(380, 846, 37, 10, 397),
(385, 485, 37, 10, 401),
(393, 728, 37, 10, 409),
(405, 554, 37, 10, 421),
(418, 471, 37, 10, 433),
(428, 641, 37, 10, 443),
(434, 732, 37, 10, 449),
(447, 193, 37, 10, 461),
(453, 934, 37, 10, 467),
(466, 864, 37, 10, 479),
(478, 790, 37, 10, 491),
(486, 912, 37, 10, 499),
(491, 617, 37, 10, 503),
(497, 587, 37, 10, 509),
(511, 800, 37, 10, 523),
(526, 923, 41, 10, 541),
(532, 998, 41, 10, 547),
(542, 92, 41, 10, 557),
(549, 497, 41, 10, 563),
(557, 559, 41, 10, 571),
(563, 667, 41, 10, 577),
(573, 912, 41, 10, 587),
(580, 262, 41, 10, 593),
(588, 152, 41, 10, 601),
(594, 526, 41, 10, 607),
(600, 268, 41, 10, 613),
(606, 212, 41, 10, 619),
(619, 45, 41, 10, 631),
(633, 898, 43, 10, 647),
(640, 527, 43, 10, 653),
(648, 558, 43, 10, 661),
(666, 460, 47, 10, 683),
(675, 5, 47, 10, 691),
(685, 895, 47, 10, 701),
(693, 996, 47, 10, 709),
(703, 282, 47, 10, 719),
(718, 513, 47, 10, 733),
(728, 865, 47, 10, 743),
(736, 870, 47, 10, 751),
(747, 239, 47, 10, 761),
(759, 452, 47, 10, 773),
(778, 862, 53, 10, 797),
(792, 852, 53, 10, 811),
(802, 643, 53, 10, 821),
(811, 543, 53, 10, 829),
(821, 447, 53, 10, 839),
(835, 321, 53, 10, 853),
(845, 287, 53, 10, 863),
(860, 12, 53, 10, 877),
(870, 251, 53, 10, 887),
(891, 30, 53, 10, 907),
(903, 621, 53, 10, 919),
(913, 555, 53, 10, 929),
(926, 127, 53, 10, 941),
(938, 400, 53, 10, 953),
(950, 91, 59, 10, 971),
(963, 916, 59, 10, 983),
(977, 935, 59, 10, 997),
(989, 691, 59, 10, 1009),
(1002, 299, 59, 10, 1021),
(1020, 282, 59, 10, 1039),
(1032, 824, 59, 10, 1051),
(1050, 536, 59, 11, 1069),
(1074, 596, 59, 11, 1093),
(1085, 28, 59, 11, 1103),
(1099, 947, 59, 11, 1117),
(1111, 162, 59, 11, 1129),
(1136, 536, 59, 11, 1153),
(1152, 1000, 61, 11, 1171),
(1169, 251, 61, 11, 1187),
(1183, 673, 61, 11, 1201),
(1205, 559, 61, 11, 1223),
(1220, 923, 61, 11, 1237),
(1236, 81, 67, 11, 1259),
(1255, 478, 67, 11, 1277),
(1269, 198, 67, 11, 1291),
(1285, 137, 67, 11, 1307),
(1306, 75, 67, 11, 1327),
(1347, 29, 67, 11, 1367),
(1361, 231, 67, 11, 1381),
(1389, 532, 67, 11, 1409),
(1404, 58, 67, 11, 1423),
(1420, 60, 67, 11, 1439),
(1436, 964, 71, 11, 1459),
(1461, 624, 71, 11, 1483),
(1477, 502, 71, 11, 1499),
(1502, 636, 71, 11, 1523),
(1522, 986, 71, 11, 1543),
(1539, 950, 71, 11, 1559),
(1561, 735, 73, 11, 1583),
(1579, 866, 73, 11, 1601),
(1600, 203, 73, 11, 1621),
(1616, 83, 73, 11, 1637),
(1649, 14, 73, 11, 1669),
(1673, 522, 79, 11, 1699),
(1698, 226, 79, 11, 1723),
(1716, 282, 79, 11, 1741),
(1734, 88, 79, 11, 1759),
(1759, 636, 79, 11, 1783),
(1777, 860, 79, 11, 1801),
(1800, 324, 79, 11, 1823),
(1824, 424, 79, 11, 1847),
(1844, 999, 79, 11, 1867),
(1863, 682, 83, 11, 1889),
(1887, 814, 83, 11, 1913),
(1906, 979, 83, 11, 1931),
(1926, 538, 83, 11, 1951),
(1954, 278, 83, 11, 1979),
(1979, 580, 83, 11, 2003),
(2005, 773, 83, 11, 2029),
(2040, 911, 89, 11, 2069),
(2070, 506, 89, 11, 2099),
(2103, 628, 89, 11, 2131),
(2125, 282, 89, 11, 2153),
(2152, 309, 89, 11, 2179),
(2195, 858, 89, 11, 2221),
(2217, 442, 89, 11, 2243),
(2247, 654, 89, 11, 2273),
(2278, 82, 97, 11, 2311),
(2315, 428, 97, 11, 2347),
(2339, 442, 97, 11, 2371),
(2367, 283, 97, 11, 2399),
(2392, 538, 97, 11, 2423),
(2416, 189, 97, 11, 2447),
(2447, 438, 97, 11, 2477),
(2473, 912, 97, 11, 2503),
(2502, 1, 97, 11, 2531),
(2528, 167, 97, 11, 2557),
(2565, 272, 97, 11, 2593),
(2601, 209, 101, 11, 2633),
(2640, 927, 101, 11, 2671),
(2668, 386, 101, 11, 2699),
(2701, 653, 101, 11, 2731),
(2737, 669, 101, 11, 2767),
(2772, 431, 101, 11, 2801),
(2802, 793, 103, 11, 2833),
(2831, 588, 103, 11, 2861),
(2875, 777, 107, 11, 2909),
(2906, 939, 107, 11, 2939),
(2938, 864, 107, 11, 2971),
(2979, 627, 107, 11, 3011),
(3015, 265, 109, 11, 3049),
(3056, 976, 109, 11, 3089),
(3101, 988, 113, 11, 3137),
(3151, 507, 113, 11, 3187),
(3186, 640, 113, 11, 3221),
(3224, 15, 113, 11, 3259),
(3265, 667, 113, 11, 3299),
(3299, 24, 127, 11, 3347),
(3344, 877, 127, 11, 3391),
(3387, 240, 127, 11, 3433),
(3423, 720, 127, 11, 3469),
(3466, 93, 127, 11, 3511),
(3502, 919, 127, 11, 3547),
(3539, 635, 127, 11, 3583),
(3579, 174, 127, 11, 3623),
(3616, 647, 127, 11, 3659),
(3658, 820, 127, 11, 3701),
(3697, 56, 127, 11, 3739),
(3751, 485, 127, 11, 3793),
(3792, 210, 127, 11, 3833),
(3840, 124, 127, 11, 3881),
(3883, 546, 127, 11, 3923),
(3924, 954, 131, 11, 3967),
(3970, 262, 131, 11, 4013),
(4015, 927, 131, 11, 4057),
(4069, 957, 131, 11, 4111),
(4112, 726, 137, 11, 4159),
(4165, 583, 137, 11, 4211),
(4207, 782, 137, 11, 4253),
(4252, 37, 137, 11, 4297),
(4318, 758, 137, 11, 4363),
(4365, 777, 137, 11, 4409),
(4418, 104, 139, 11, 4463),
(4468, 476, 139, 11, 4513),
(4513, 113, 149, 11, 4567),
(4567, 313, 149, 11, 4621),
(4626, 102, 149, 11, 4679),
(4681, 501, 149, 11, 4733),
(4731, 332, 149, 11, 4783),
(4780, 786, 149, 11, 4831),
(4838, 99, 149, 11, 4889),
(4901, 658, 149, 11, 4951),
(4954, 794, 149, 11, 5003),
(5008, 37, 151, 11, 5059),
(5063, 471, 151, 11, 5113),
(5116, 94, 157, 11, 5171),
(5172, 873, 157, 11, 5227),
(5225, 918, 157, 11, 5279),
(5279, 945, 157, 11, 5333),
(5334, 211, 157, 11, 5387),
(5391, 341, 157, 11, 5443),
(5449, 11, 163, 11, 5507),
(5506, 578, 163, 11, 5563),
(5566, 494, 163, 11, 5623),
(5637, 694, 163, 11, 5693),
(5694, 252, 163, 11, 5749),
(5763, 451, 167, 11, 5821),
(5823, 83, 167, 11, 5881),
(5896, 689, 167, 11, 5953),
(5975, 488, 173, 11, 6037),
(6039, 214, 173, 11, 6101),
(6102, 17, 173, 11, 6163),
(6169, 469, 173, 11, 6229),
(6233, 263, 179, 11, 6299),
(6296, 309, 179, 11, 6361),
(6363, 984, 179, 11, 6427),
(6427, 123, 179, 11, 6491),
(6518, 360, 179, 11, 6581),
(6589, 863, 181, 11, 6653),
(6655, 122, 181, 11, 6719),
(6730, 522, 191, 11, 6803),
(6799, 539, 191, 11, 6871),
(6878, 181, 191, 11, 6949),
(6956, 64, 191, 11, 7027),
(7033, 387, 191, 11, 7103),
(7108, 967, 191, 11, 7177),
(7185, 843, 191, 11, 7253),
(7281, 999, 193, 11, 7351),
(7360, 76, 197, 11, 7433),
(7445, 142, 197, 11, 7517),
(7520, 599, 197, 11, 7591),
(7596, 576, 199, 11, 7669),
(7675, 176, 211, 11, 7759),
(7770, 392, 211, 11, 7853),
(7855, 332, 211, 11, 7937),
(7935, 291, 211, 11, 8017),
(8030, 913, 211, 11, 8111),
(8111, 608, 211, 11, 8191),
(8194, 212, 211, 11, 8273),
(8290, 696, 211, 11, 8369),
(8377, 931, 223, 11, 8467),
(8474, 326, 223, 11, 8563),
(8559, 228, 223, 11, 8647),
(8654, 706, 223, 11, 8741),
(8744, 144, 223, 11, 8831),
(8837, 83, 223, 11, 8923),
(8928, 743, 223, 11, 9013),
(9019, 187, 223, 11, 9103),
(9111, 654, 227, 11, 9199),
(9206, 359, 227, 11, 9293),
(9303, 493, 229, 11, 9391),
(9400, 369, 233, 11, 9491),
(9497, 981, 233, 11, 9587),
(9601, 276, 239, 11, 9697),
(9708, 647, 239, 11, 9803),
(9813, 389, 239, 11, 9907),
(9916, 80, 239, 11, 10009),
(10017, 396, 241, 11, 10111),
(10120, 580, 251, 11, 10223),
(10241, 873, 251, 11, 10343),
(10351, 15, 251, 11, 10453),
(10458, 976, 251, 11, 10559),
(10567, 584, 251, 11, 10667),
(10676, 267, 257, 11, 10781),
(10787, 876, 257, 11, 10891),
(10899, 642, 257, 12, 11003),
(11015, 794, 257, 12, 11119),
(11130, 78, 263, 12, 11239),
(11245, 736, 263, 12, 11353),
(11358, 882, 269, 12, 11471),
(11475, 251, 269, 12, 11587),
(11590, 434, 269, 12, 11701),
(11711, 204, 269, 12, 11821),
(11829, 256, 271, 12, 11941),
(11956, 106, 277, 12, 12073),
(12087, 375, 277, 12, 12203),
(12208, 148, 277, 12, 12323),
(12333, 496, 281, 12, 12451),
(12460, 88, 281, 12, 12577),
(12593, 826, 293, 12, 12721),
(12726, 71, 293, 12, 12853),
(12857, 925, 293, 12, 12983),
(13002, 760, 293, 12, 13127),
(13143, 130, 293, 12, 13267),
(13284, 641, 307, 12, 13421),
(13417, 400, 307, 12, 13553),
(13558, 480, 307, 12, 13693),
(13695, 76, 307, 12, 13829),
(13833, 665, 307, 12, 13967),
(13974, 910, 307, 12, 14107),
(14115, 467, 311, 12, 14251),
(14272, 964, 311, 12, 14407),
(14415, 625, 313, 12, 14551),
(14560, 362, 317, 12, 14699),
(14713, 759, 317, 12, 14851),
(14862, 728, 331, 12, 15013),
(15011, 343, 331, 12, 15161),
(15170, 113, 331, 12, 15319),
(15325, 137, 331, 12, 15473),
(15496, 308, 331, 12, 15643),
(15651, 800, 337, 12, 15803),
(15808, 177, 337, 12, 15959),
(15977, 961, 337, 12, 16127),
(16161, 958, 347, 12, 16319),
(16336, 72, 347, 12, 16493),
(16505, 732, 347, 12, 16661),
(16674, 145, 349, 12, 16831),
(16851, 577, 353, 12, 17011),
(17024, 305, 353, 12, 17183),
(17195, 50, 359, 12, 17359),
(17376, 351, 359, 12, 17539),
(17559, 175, 367, 12, 17729),
(17742, 727, 367, 12, 17911),
(17929, 902, 367, 12, 18097),
(18116, 409, 373, 12, 18289),
(18309, 776, 373, 12, 18481),
(18503, 586, 379, 12, 18679),
(18694, 451, 379, 12, 18869),
(18909, 287, 383, 12, 19087),
(19126, 246, 389, 12, 19309),
(19325, 222, 389, 12, 19507),
(19539, 563, 397, 12, 19727),
(19740, 839, 397, 12, 19927),
(19939, 897, 401, 12, 20129),
(20152, 409, 401, 12, 20341),
(20355, 618, 409, 12, 20551),
(20564, 439, 409, 12, 20759),
(20778, 95, 419, 13, 20983),
(20988, 448, 419, 13, 21191),
(21199, 133, 419, 13, 21401),
(21412, 938, 419, 13, 21613),
(21629, 423, 431, 13, 21841),
(21852, 90, 431, 13, 22063),
(22073, 640, 431, 13, 22283),
(22301, 922, 433, 13, 22511),
(22536, 250, 439, 13, 22751),
(22779, 367, 439, 13, 22993),
(23010, 447, 443, 13, 23227),
(23252, 559, 449, 13, 23473),
(23491, 121, 457, 13, 23719),
(23730, 623, 457, 13, 23957),
(23971, 450, 457, 13, 24197),
(24215, 253, 461, 13, 24443),
(24476, 106, 467, 13, 24709),
(24721, 863, 467, 13, 24953),
(24976, 148, 479, 13, 25219),
(25230, 427, 479, 13, 25471),
(25493, 138, 479, 13, 25733),
(25756, 794, 487, 13, 26003),
(26022, 247, 487, 13, 26267),
(26291, 562, 491, 13, 26539),
(26566, 53, 499, 13, 26821),
(26838, 135, 499, 13, 27091),
(27111, 21, 503, 13, 27367),
(27392, 201, 509, 13, 27653),
(27682, 169, 521, 13, 27953),
(27959, 70, 521, 13, 28229),
(28248, 386, 521, 13, 28517),
(28548, 226, 523, 13, 28817),
(28845, 3, 541, 13, 29131),
(29138, 769, 541, 13, 29423),
(29434, 590, 541, 13, 29717),
(29731, 672, 541, 13, 30013),
(30037, 713, 547, 13, 30323),
(30346, 967, 547, 13, 30631),
(30654, 368, 557, 14, 30949),
(30974, 348, 557, 14, 31267),
(31285, 119, 563, 14, 31583),
(31605, 503, 569, 14, 31907),
(31948, 181, 571, 14, 32251),
(32272, 394, 577, 14, 32579),
(32601, 189, 587, 14, 32917),
(32932, 210, 587, 14, 33247),
(33282, 62, 593, 14, 33601),
(33623, 273, 593, 14, 33941),
(33961, 554, 599, 14, 34283),
(34302, 936, 607, 14, 34631),
(34654, 483, 607, 14, 34981),
(35031, 397, 613, 14, 35363),
(35395, 241, 619, 14, 35731),
(35750, 500, 631, 14, 36097),
(36112, 12, 631, 14, 36457),
(36479, 958, 641, 14, 36833),
(36849, 524, 641, 14, 37201),
(37227, 8, 643, 14, 37579),
(37606, 100, 653, 14, 37967),
(37992, 339, 653, 14, 38351),
(38385, 804, 659, 14, 38749),
(38787, 510, 673, 14, 39163),
(39176, 18, 673, 14, 39551),
(39576, 412, 677, 14, 39953),
(39980, 394, 683, 14, 40361),
(40398, 830, 691, 15, 40787),
(40816, 535, 701, 15, 41213),
(41226, 199, 701, 15, 41621),
(41641, 27, 709, 15, 42043),
(42067, 298, 709, 15, 42467),
(42490, 368, 719, 15, 42899),
(42916, 755, 727, 15, 43331),
(43388, 379, 727, 15, 43801),
(43840, 73, 733, 15, 44257),
(44279, 387, 739, 15, 44701),
(44729, 457, 751, 15, 45161),
(45183, 761, 751, 15, 45613),
(45638, 855, 757, 15, 46073),
(46104, 370, 769, 15, 46549),
(46574, 261, 769, 15, 47017),
(47047, 299, 787, 15, 47507),
(47523, 920, 787, 15, 47981),
(48007, 269, 787, 15, 48463),
(48489, 862, 797, 15, 48953),
(48976, 349, 809, 15, 49451),
(49470, 103, 809, 15, 49943),
(49978, 115, 821, 15, 50461),
(50511, 93, 821, 16, 50993),
(51017, 982, 827, 16, 51503),
(51530, 432, 839, 16, 52027),
(52062, 340, 853, 16, 52571),
(52586, 173, 853, 16, 53093),
(53114, 421, 857, 16, 53623),
(53650, 330, 863, 16, 54163),
(54188, 624, 877, 16, 54713),
(54735, 233, 877, 16, 55259),
(55289, 362, 883, 16, 55817),
(55843, 963, 907, 16, 56393),
(56403, 471, 907, 16, 56951),
];
const P1_TABLE: [(u32, u32); 477] = [
(10, 11),
(12, 11),
(18, 11),
(20, 11),
(26, 11),
(30, 11),
(32, 11),
(36, 11),
(42, 11),
(46, 11),
(48, 11),
(49, 11),
(55, 11),
(60, 13),
(62, 13),
(69, 13),
(75, 13),
(84, 17),
(88, 17),
(91, 17),
(95, 17),
(97, 17),
(101, 17),
(114, 17),
(119, 17),
(125, 17),
(127, 17),
(138, 19),
(140, 19),
(149, 19),
(153, 19),
(160, 23),
(166, 23),
(168, 23),
(179, 23),
(181, 23),
(185, 23),
(187, 23),
(200, 23),
(213, 23),
(217, 23),
(225, 23),
(236, 29),
(242, 29),
(248, 29),
(257, 29),
(263, 29),
(269, 29),
(280, 29),
(295, 29),
(301, 29),
(305, 29),
(324, 29),
(337, 29),
(341, 29),
(347, 29),
(355, 29),
(362, 31),
(368, 31),
(372, 31),
(380, 31),
(385, 31),
(393, 31),
(405, 31),
(418, 37),
(428, 37),
(434, 37),
(447, 37),
(453, 37),
(466, 37),
(478, 37),
(486, 37),
(491, 37),
(497, 37),
(511, 37),
(526, 37),
(532, 37),
(542, 37),
(549, 37),
(557, 37),
(563, 37),
(573, 37),
(580, 41),
(588, 41),
(594, 41),
(600, 41),
(606, 41),
(619, 41),
(633, 41),
(640, 41),
(648, 41),
(666, 41),
(675, 41),
(685, 41),
(693, 41),
(703, 41),
(718, 43),
(728, 43),
(736, 43),
(747, 43),
(759, 43),
(778, 47),
(792, 47),
(802, 47),
(811, 47),
(821, 47),
(835, 47),
(845, 47),
(860, 47),
(870, 47),
(891, 47),
(903, 47),
(913, 47),
(926, 53),
(938, 53),
(950, 53),
(963, 53),
(977, 53),
(989, 53),
(1002, 53),
(1020, 53),
(1032, 53),
(1050, 53),
(1074, 53),
(1085, 53),
(1099, 53),
(1111, 53),
(1136, 53),
(1152, 53),
(1169, 59),
(1183, 59),
(1205, 59),
(1220, 59),
(1236, 59),
(1255, 59),
(1269, 59),
(1285, 59),
(1306, 59),
(1347, 59),
(1361, 59),
(1389, 59),
(1404, 59),
(1420, 59),
(1436, 59),
(1461, 61),
(1477, 61),
(1502, 61),
(1522, 61),
(1539, 67),
(1561, 67),
(1579, 67),
(1600, 67),
(1616, 67),
(1649, 67),
(1673, 67),
(1698, 67),
(1716, 67),
(1734, 67),
(1759, 67),
(1777, 67),
(1800, 67),
(1824, 67),
(1844, 67),
(1863, 71),
(1887, 71),
(1906, 71),
(1926, 71),
(1954, 71),
(1979, 71),
(2005, 71),
(2040, 71),
(2070, 71),
(2103, 73),
(2125, 73),
(2152, 73),
(2195, 79),
(2217, 79),
(2247, 79),
(2278, 79),
(2315, 79),
(2339, 79),
(2367, 79),
(2392, 79),
(2416, 79),
(2447, 79),
(2473, 79),
(2502, 79),
(2528, 79),
(2565, 83),
(2601, 83),
(2640, 83),
(2668, 83),
(2701, 83),
(2737, 83),
(2772, 83),
(2802, 83),
(2831, 89),
(2875, 89),
(2906, 89),
(2938, 89),
(2979, 89),
(3015, 89),
(3056, 89),
(3101, 89),
(3151, 89),
(3186, 89),
(3224, 89),
(3265, 97),
(3299, 97),
(3344, 97),
(3387, 97),
(3423, 97),
(3466, 97),
(3502, 97),
(3539, 97),
(3579, 97),
(3616, 97),
(3658, 97),
(3697, 97),
(3751, 97),
(3792, 97),
(3840, 97),
(3883, 101),
(3924, 101),
(3970, 101),
(4015, 101),
(4069, 101),
(4112, 101),
(4165, 103),
(4207, 103),
(4252, 103),
(4318, 103),
(4365, 107),
(4418, 107),
(4468, 107),
(4513, 107),
(4567, 107),
(4626, 107),
(4681, 109),
(4731, 109),
(4780, 109),
(4838, 109),
(4901, 113),
(4954, 113),
(5008, 113),
(5063, 113),
(5116, 113),
(5172, 113),
(5225, 127),
(5279, 127),
(5334, 127),
(5391, 127),
(5449, 127),
(5506, 127),
(5566, 127),
(5637, 127),
(5694, 127),
(5763, 127),
(5823, 127),
(5896, 127),
(5975, 127),
(6039, 127),
(6102, 127),
(6169, 127),
(6233, 127),
(6296, 127),
(6363, 127),
(6427, 127),
(6518, 127),
(6589, 131),
(6655, 131),
(6730, 131),
(6799, 131),
(6878, 131),
(6956, 131),
(7033, 137),
(7108, 137),
(7185, 137),
(7281, 137),
(7360, 137),
(7445, 137),
(7520, 137),
(7596, 137),
(7675, 139),
(7770, 139),
(7855, 149),
(7935, 149),
(8030, 149),
(8111, 149),
(8194, 149),
(8290, 149),
(8377, 149),
(8474, 149),
(8559, 149),
(8654, 149),
(8744, 149),
(8837, 149),
(8928, 149),
(9019, 151),
(9111, 151),
(9206, 151),
(9303, 157),
(9400, 157),
(9497, 157),
(9601, 157),
(9708, 157),
(9813, 157),
(9916, 157),
(10017, 163),
(10120, 163),
(10241, 163),
(10351, 163),
(10458, 163),
(10567, 163),
(10676, 163),
(10787, 167),
(10899, 167),
(11015, 167),
(11130, 167),
(11245, 167),
(11358, 173),
(11475, 173),
(11590, 173),
(11711, 173),
(11829, 173),
(11956, 173),
(12087, 173),
(12208, 179),
(12333, 179),
(12460, 179),
(12593, 179),
(12726, 179),
(12857, 179),
(13002, 181),
(13143, 181),
(13284, 191),
(13417, 191),
(13558, 191),
(13695, 191),
(13833, 191),
(13974, 191),
(14115, 191),
(14272, 191),
(14415, 191),
(14560, 191),
(14713, 191),
(14862, 193),
(15011, 193),
(15170, 197),
(15325, 197),
(15496, 197),
(15651, 197),
(15808, 199),
(15977, 199),
(16161, 211),
(16336, 211),
(16505, 211),
(16674, 211),
(16851, 211),
(17024, 211),
(17195, 211),
(17376, 211),
(17559, 211),
(17742, 211),
(17929, 211),
(18116, 223),
(18309, 223),
(18503, 223),
(18694, 223),
(18909, 223),
(19126, 223),
(19325, 223),
(19539, 223),
(19740, 223),
(19939, 223),
(20152, 227),
(20355, 227),
(20564, 227),
(20778, 227),
(20988, 229),
(21199, 233),
(21412, 233),
(21629, 233),
(21852, 233),
(22073, 239),
(22301, 239),
(22536, 239),
(22779, 239),
(23010, 239),
(23252, 241),
(23491, 251),
(23730, 251),
(23971, 251),
(24215, 251),
(24476, 251),
(24721, 251),
(24976, 251),
(25230, 251),
(25493, 257),
(25756, 257),
(26022, 257),
(26291, 257),
(26566, 257),
(26838, 263),
(27111, 263),
(27392, 263),
(27682, 263),
(27959, 269),
(28248, 269),
(28548, 269),
(28845, 269),
(29138, 269),
(29434, 271),
(29731, 277),
(30037, 277),
(30346, 277),
(30654, 277),
(30974, 281),
(31285, 281),
(31605, 281),
(31948, 283),
(32272, 293),
(32601, 293),
(32932, 293),
(33282, 293),
(33623, 293),
(33961, 293),
(34302, 293),
(34654, 307),
(35031, 307),
(35395, 307),
(35750, 307),
(36112, 307),
(36479, 307),
(36849, 307),
(37227, 307),
(37606, 307),
(37992, 311),
(38385, 311),
(38787, 311),
(39176, 313),
(39576, 317),
(39980, 317),
(40398, 317),
(40816, 331),
(41226, 331),
(41641, 331),
(42067, 331),
(42490, 331),
(42916, 331),
(43388, 331),
(43840, 331),
(44279, 337),
(44729, 337),
(45183, 337),
(45638, 337),
(46104, 347),
(46574, 347),
(47047, 347),
(47523, 347),
(48007, 347),
(48489, 349),
(48976, 349),
(49470, 353),
(49978, 353),
(50511, 359),
(51017, 359),
(51530, 359),
(52062, 367),
(52586, 367),
(53114, 367),
(53650, 367),
(54188, 373),
(54735, 373),
(55289, 373),
(55843, 373),
(56403, 379),
];
// Calculates, K', the extended source block size, in symbols, for a given source block size
// See section 5.3.1
pub fn extended_source_block_symbols(source_block_symbols: u32) -> u32 {
assert!(source_block_symbols <= MAX_SOURCE_SYMBOLS_PER_BLOCK);
for &(block_size, _, _, _, _) in SYSTEMATIC_INDICES_AND_PARAMETERS.iter() {
if block_size >= source_block_symbols {
return block_size;
}
}
unreachable!();
}
// Calculates, J(K'), the systematic index, for a given number of source block symbols
// See section 5.6
pub fn systematic_index(source_block_symbols: u32) -> u32 {
assert!(source_block_symbols <= MAX_SOURCE_SYMBOLS_PER_BLOCK);
for &(block_size, systematic_index, _, _, _) in SYSTEMATIC_INDICES_AND_PARAMETERS.iter() {
if block_size >= source_block_symbols {
return systematic_index;
}
}
unreachable!();
}
// Calculates, H(K'), the number of HDPC symbols, for a given number of source block symbols
// See section 5.6
pub fn num_hdpc_symbols(source_block_symbols: u32) -> u32 {
assert!(source_block_symbols <= MAX_SOURCE_SYMBOLS_PER_BLOCK);
for &(block_size, _, _, hdpc_symbols, _) in SYSTEMATIC_INDICES_AND_PARAMETERS.iter() {
if block_size >= source_block_symbols {
return hdpc_symbols;
}
}
unreachable!();
}
// Calculates, S(K'), the number of LDPC symbols, for a given number of source block symbols
// See section 5.6
pub fn num_ldpc_symbols(source_block_symbols: u32) -> u32 {
assert!(source_block_symbols <= MAX_SOURCE_SYMBOLS_PER_BLOCK);
for &(block_size, _, ldpc_symbols, _, _) in SYSTEMATIC_INDICES_AND_PARAMETERS.iter() {
if block_size >= source_block_symbols {
return ldpc_symbols;
}
}
unreachable!();
}
// Calculates, W(K'), the number of LT symbols, for a given number of source block symbols
// See section 5.6
pub fn num_lt_symbols(source_block_symbols: u32) -> u32 {
assert!(source_block_symbols <= MAX_SOURCE_SYMBOLS_PER_BLOCK);
for &(block_size, _, _, _, lt_symbols) in SYSTEMATIC_INDICES_AND_PARAMETERS.iter() {
if block_size >= source_block_symbols {
return lt_symbols;
}
}
unreachable!();
}
// Calculates, L, the number of intermediate symbols, for a given number of source block symbols
// See section 5.3.3.3
pub fn num_intermediate_symbols(source_block_symbols: u32) -> u32 {
extended_source_block_symbols(source_block_symbols)
+ num_ldpc_symbols(source_block_symbols)
+ num_hdpc_symbols(source_block_symbols)
}
// Calculates, P, the number of PI symbols, for a given number of source block symbols
// See section 5.3.3.3
pub fn num_pi_symbols(source_block_symbols: u32) -> u32 {
num_intermediate_symbols(source_block_symbols) - num_lt_symbols(source_block_symbols)
}
// Calculates P1, smallest prime greater than P. See 5.3.3.3
pub fn calculate_p1(source_block_symbols: u32) -> u32 {
assert!(source_block_symbols <= MAX_SOURCE_SYMBOLS_PER_BLOCK);
for &(block_size, p1) in P1_TABLE.iter() {
if block_size >= source_block_symbols {
return p1;
}
}
unreachable!();
}
#[cfg(test)]
mod tests {
use crate::systematic_constants::num_ldpc_symbols;
use crate::systematic_constants::num_lt_symbols;
use crate::systematic_constants::{calculate_p1, num_pi_symbols, MAX_SOURCE_SYMBOLS_PER_BLOCK};
#[test]
fn all_prime() {
for i in 0..=MAX_SOURCE_SYMBOLS_PER_BLOCK {
// See section 5.6
assert!(primal::is_prime(num_ldpc_symbols(i) as u64));
assert!(primal::is_prime(num_lt_symbols(i) as u64));
}
}
#[test]
fn check_p1() {
for i in 0..=MAX_SOURCE_SYMBOLS_PER_BLOCK {
let mut p1 = num_pi_symbols(i);
while !primal::is_prime(p1 as u64) {
if p1 % 2 == 0 {
p1 += 1;
} else {
p1 += 2;
}
}
assert_eq!(p1, calculate_p1(i));
}
}
}