diff --git a/bsp/bsp.emProject b/bsp/bsp.emProject index 1a4fd7e..ad68b0e 100644 --- a/bsp/bsp.emProject +++ b/bsp/bsp.emProject @@ -29,6 +29,7 @@ project_directory="." project_type="Library" /> + diff --git a/bsp/lh2.h b/bsp/lh2.h index a2095c7..cb11bd5 100644 --- a/bsp/lh2.h +++ b/bsp/lh2.h @@ -23,7 +23,7 @@ //=========================== defines ========================================== -#define LH2_BASESTATION_COUNT 4 ///< Number of supported concurrent basestations +#define LH2_BASESTATION_COUNT 16 ///< Number of supported concurrent basestations #define LH2_POLYNOMIAL_COUNT LH2_BASESTATION_COUNT * 2 ///< Number of supported LFSR polynomials, two per basestation #define LH2_SWEEP_COUNT 2 ///< Number of laser sweeps per basestations rotation diff --git a/bsp/lh2_checkpoints.h b/bsp/lh2_checkpoints.h new file mode 100644 index 0000000..ae24365 --- /dev/null +++ b/bsp/lh2_checkpoints.h @@ -0,0 +1,4353 @@ +#ifndef __LH2_CHECKPOINTS_H_ +#define __LH2_CHECKPOINTS_H_ + +/** + * @defgroup bsp_lh2_checkpoints LightHouse 2 decoder checkpoints + * @ingroup bsp_lh2 + * @brief Precomputed checkpoints for the LFSR index search + * + * @{ + * @file + * @author Said Alvarado-Marin + * @copyright Inria, 2025-present + * @} + */ + +#include "lh2.h" + +//=========================== defines ========================================= + +#define NUM_LSFR_COUNT_CHECKPOINTS 64 ///< How many lsfr checkpoints are per polynomial + +//=========================== variables ======================================== + +static const uint32_t _polynomials[LH2_POLYNOMIAL_COUNT] = { + 0x0001D258, + 0x00017E04, + 0x0001FF6B, + 0x00013F67, + 0x0001B9EE, + 0x000198D1, + 0x000178C7, + 0x00018A55, + 0x00015777, + 0x0001D911, + 0x00015769, + 0x0001991F, + 0x00012BD0, + 0x0001CF73, + 0x0001365D, + 0x000197F5, + 0x000194A0, + 0x0001B279, + 0x00013A34, + 0x0001AE41, + 0x000180D4, + 0x00017891, + 0x00012E64, + 0x00017C72, + 0x00019C6D, + 0x00013F32, + 0x0001AE14, + 0x00014E76, + 0x00013C97, + 0x000130CB, + 0x00013750, + 0x0001CB8D, +}; + +static const uint32_t _lfsr_hash_table[LH2_POLYNOMIAL_COUNT][NUM_LSFR_COUNT_CHECKPOINTS] = { + { + // Polynomial: 0 + 0b00000011000101111, // lfsr position: 104891 + 0b00000111011010111, // lfsr position: 22375 + 0b00001001000111101, // lfsr position: 89380 + 0b00001101010111100, // lfsr position: 82546 + 0b00010011100001100, // lfsr position: 72190 + 0b00010111101101110, // lfsr position: 94537 + 0b00011011000100100, // lfsr position: 17 + 0b00011100110001011, // lfsr position: 12032 + 0b00100001010001101, // lfsr position: 34419 + 0b00100110010100011, // lfsr position: 56719 + 0b00101010000111000, // lfsr position: 29233 + 0b00101110100100001, // lfsr position: 17173 + 0b00110011011101001, // lfsr position: 20667 + 0b00110110010000010, // lfsr position: 77346 + 0b00111001011011100, // lfsr position: 44727 + 0b00111110100101011, // lfsr position: 3402 + 0b01000001011100111, // lfsr position: 49868 + 0b01000100100110101, // lfsr position: 10311 + 0b01001011101110000, // lfsr position: 37782 + 0b01001110010100111, // lfsr position: 18911 + 0b01010000000101101, // lfsr position: 67022 + 0b01010100110000100, // lfsr position: 73904 + 0b01011000000001010, // lfsr position: 58419 + 0b01011111011110110, // lfsr position: 103115 + 0b01100010111011011, // lfsr position: 36092 + 0b01100100100000101, // lfsr position: 65320 + 0b01101011000110101, // lfsr position: 41248 + 0b01101100110110011, // lfsr position: 32679 + 0b01110001000100001, // lfsr position: 106588 + 0b01110111101000100, // lfsr position: 1726 + 0b01111000111000001, // lfsr position: 6841 + 0b01111100100100001, // lfsr position: 75584 + 0b10000001011110100, // lfsr position: 101425 + 0b10000110111101010, // lfsr position: 24050 + 0b10001000110011011, // lfsr position: 15502 + 0b10001101100101011, // lfsr position: 42982 + 0b10010010100110011, // lfsr position: 92856 + 0b10010100011011111, // lfsr position: 5160 + 0b10011000010011110, // lfsr position: 85898 + 0b10011111111011110, // lfsr position: 84222 + 0b10100000011111011, // lfsr position: 27537 + 0b10100110100000110, // lfsr position: 91095 + 0b10101001011100001, // lfsr position: 53274 + 0b10101100111101111, // lfsr position: 70482 + 0b10110000100100100, // lfsr position: 30938 + 0b10110100111000111, // lfsr position: 8573 + 0b10111000101011110, // lfsr position: 87677 + 0b10111111100010010, // lfsr position: 68731 + 0b11000001110100011, // lfsr position: 97961 + 0b11000110011101001, // lfsr position: 55047 + 0b11001000011000011, // lfsr position: 80804 + 0b11001110101000001, // lfsr position: 39509 + 0b11010010000000111, // lfsr position: 60154 + 0b11010101110111100, // lfsr position: 25783 + 0b11011011111001100, // lfsr position: 46401 + 0b11011101101100101, // lfsr position: 61913 + 0b11100000101000010, // lfsr position: 96262 + 0b11100101010010101, // lfsr position: 13740 + 0b11101001111110011, // lfsr position: 48081 + 0b11101111010111100, // lfsr position: 79041 + 0b11110001100100011, // lfsr position: 108275 + 0b11110111000100100, // lfsr position: 63605 + 0b11111001010110111, // lfsr position: 99663 + 0b11111100101011100, // lfsr position: 51548 + }, + { + // Polynomial: 1 + 0b00000000000001100, // lfsr position: 99695 + 0b00000110100010001, // lfsr position: 10285 + 0b00001001001000011, // lfsr position: 108302 + 0b00001111101110101, // lfsr position: 51581 + 0b00010011001001011, // lfsr position: 5167 + 0b00010101011101011, // lfsr position: 82518 + 0b00011000100010110, // lfsr position: 53274 + 0b00011100000110100, // lfsr position: 80760 + 0b00100001101011000, // lfsr position: 91102 + 0b00100110110010101, // lfsr position: 49833 + 0b00101010100011101, // lfsr position: 41 + 0b00101111110010011, // lfsr position: 58429 + 0b00110000110110111, // lfsr position: 68725 + 0b00110100010010000, // lfsr position: 67025 + 0b00111010110111110, // lfsr position: 72157 + 0b00111100100001100, // lfsr position: 106524 + 0b01000000110111100, // lfsr position: 36092 + 0b01000111011000111, // lfsr position: 63595 + 0b01001011010100011, // lfsr position: 1719 + 0b01001101110111010, // lfsr position: 13769 + 0b01010010110111100, // lfsr position: 18869 + 0b01010100100101101, // lfsr position: 84200 + 0b01011001111001001, // lfsr position: 42944 + 0b01011110110111011, // lfsr position: 25773 + 0b01100000100110011, // lfsr position: 15466 + 0b01100111100000100, // lfsr position: 22348 + 0b01101001101110111, // lfsr position: 34345 + 0b01101101011000000, // lfsr position: 56689 + 0b01110010110000101, // lfsr position: 32674 + 0b01110101000010001, // lfsr position: 39529 + 0b01111001101100110, // lfsr position: 6853 + 0b01111111111111111, // lfsr position: 73877 + 0b10000011011100101, // lfsr position: 87694 + 0b10000111111110111, // lfsr position: 12013 + 0b10001000010111110, // lfsr position: 94508 + 0b10001111111011010, // lfsr position: 54972 + 0b10010010111110011, // lfsr position: 92843 + 0b10010110000111100, // lfsr position: 60156 + 0b10011011111010100, // lfsr position: 46425 + 0b10011101110001111, // lfsr position: 17190 + 0b10100010010011101, // lfsr position: 103089 + 0b10100101000110001, // lfsr position: 3455 + 0b10101000011011111, // lfsr position: 77300 + 0b10101111110001010, // lfsr position: 96231 + 0b10110001011001010, // lfsr position: 29251 + 0b10110101010010001, // lfsr position: 44677 + 0b10111000111111011, // lfsr position: 37800 + 0b10111100110000111, // lfsr position: 89396 + 0b11000001110110101, // lfsr position: 104837 + 0b11000110001100010, // lfsr position: 27502 + 0b11001011100010100, // lfsr position: 61887 + 0b11001100011100001, // lfsr position: 20629 + 0b11010010001010010, // lfsr position: 70460 + 0b11010100101010101, // lfsr position: 85904 + 0b11011000100100011, // lfsr position: 41247 + 0b11011111101011011, // lfsr position: 8572 + 0b11100010111100100, // lfsr position: 65298 + 0b11100110101100011, // lfsr position: 30916 + 0b11101001011101010, // lfsr position: 101432 + 0b11101110101001011, // lfsr position: 97989 + 0b11110001100111110, // lfsr position: 24106 + 0b11110110011011010, // lfsr position: 75617 + 0b11111010110101001, // lfsr position: 48153 + 0b11111100001011100, // lfsr position: 79078 + }, + { + // Polynomial: 2 + 0b00000011110010010, // lfsr position: 82521 + 0b00000111010111000, // lfsr position: 32691 + 0b00001001100101101, // lfsr position: 97970 + 0b00001110000100101, // lfsr position: 92766 + 0b00010010101101111, // lfsr position: 39579 + 0b00010111011000110, // lfsr position: 34363 + 0b00011011010011101, // lfsr position: 25783 + 0b00011111101101001, // lfsr position: 61876 + 0b00100001100101100, // lfsr position: 108264 + 0b00100110000101010, // lfsr position: 46413 + 0b00101001100100100, // lfsr position: 30967 + 0b00101101000001100, // lfsr position: 5154 + 0b00110001101010111, // lfsr position: 10294 + 0b00110110010101010, // lfsr position: 72232 + 0b00111010000000111, // lfsr position: 73918 + 0b00111110110100101, // lfsr position: 18905 + 0b01000000001100000, // lfsr position: 3427 + 0b01000110000010100, // lfsr position: 63593 + 0b01001010001100101, // lfsr position: 91065 + 0b01001100111101000, // lfsr position: 106528 + 0b01010010101101000, // lfsr position: 67049 + 0b01010110111011010, // lfsr position: 55029 + 0b01011010011001101, // lfsr position: 85944 + 0b01011101110011100, // lfsr position: 84219 + 0b01100001110011101, // lfsr position: 13714 + 0b01100111010001111, // lfsr position: 87659 + 0b01101010101100101, // lfsr position: 94578 + 0b01101110110100110, // lfsr position: 51540 + 0b01110010001010110, // lfsr position: 43004 + 0b01110110000110100, // lfsr position: 89371 + 0b01111010101000101, // lfsr position: 49819 + 0b01111101011101110, // lfsr position: 70447 + 0b10000010101001101, // lfsr position: 60183 + 0b10000100110001011, // lfsr position: 75646 + 0b10001010101001000, // lfsr position: 79069 + 0b10001101110111000, // lfsr position: 8579 + 0b10010000110001000, // lfsr position: 101409 + 0b10010110100100100, // lfsr position: 96245 + 0b10011000101111111, // lfsr position: 1725 + 0b10011110010101000, // lfsr position: 29219 + 0b10100010000001001, // lfsr position: 37781 + 0b10100100000001101, // lfsr position: 17 + 0b10101001010000000, // lfsr position: 103108 + 0b10101110000101110, // lfsr position: 68750 + 0b10110001101110011, // lfsr position: 58473 + 0b10110101111101110, // lfsr position: 24073 + 0b10111010100001000, // lfsr position: 41259 + 0b10111111001111001, // lfsr position: 36073 + 0b11000011100110100, // lfsr position: 15458 + 0b11000110111110010, // lfsr position: 53277 + 0b11001000011000011, // lfsr position: 77355 + 0b11001111011000001, // lfsr position: 44717 + 0b11010001100010000, // lfsr position: 20596 + 0b11010111110000001, // lfsr position: 99670 + 0b11011000001001111, // lfsr position: 65279 + 0b11011110101100100, // lfsr position: 104895 + 0b11100001110000011, // lfsr position: 22362 + 0b11100110000101010, // lfsr position: 56765 + 0b11101011110110110, // lfsr position: 48136 + 0b11101100001111100, // lfsr position: 27500 + 0b11110001001010100, // lfsr position: 12050 + 0b11110100011010001, // lfsr position: 6856 + 0b11111010000010011, // lfsr position: 80759 + 0b11111100100101110, // lfsr position: 17210 + }, + { + // Polynomial: 3 + 0b00000000011001011, // lfsr position: 10313 + 0b00000111000010100, // lfsr position: 72196 + 0b00001011000011011, // lfsr position: 41232 + 0b00001100011111101, // lfsr position: 42977 + 0b00010010001111010, // lfsr position: 61847 + 0b00010101000011001, // lfsr position: 65302 + 0b00011010010000110, // lfsr position: 99687 + 0b00011111001100010, // lfsr position: 24044 + 0b00100001001100011, // lfsr position: 3424 + 0b00100110110001101, // lfsr position: 101405 + 0b00101011101000010, // lfsr position: 34377 + 0b00101101000001100, // lfsr position: 46383 + 0b00110011000011000, // lfsr position: 30951 + 0b00110100001111011, // lfsr position: 106545 + 0b00111010010000001, // lfsr position: 53273 + 0b00111100101000010, // lfsr position: 22366 + 0b01000010010100000, // lfsr position: 79090 + 0b01000110101110111, // lfsr position: 67039 + 0b01001010101001011, // lfsr position: 70469 + 0b01001110101010000, // lfsr position: 58392 + 0b01010011111000100, // lfsr position: 6897 + 0b01010100101101011, // lfsr position: 97952 + 0b01011011100110001, // lfsr position: 8588 + 0b01011101011000101, // lfsr position: 1736 + 0b01100000110001100, // lfsr position: 84227 + 0b01100111101011110, // lfsr position: 20627 + 0b01101000110000101, // lfsr position: 37851 + 0b01101111010100001, // lfsr position: 56681 + 0b01110010011001101, // lfsr position: 18937 + 0b01110100110101100, // lfsr position: 55003 + 0b01111010111010100, // lfsr position: 96285 + 0b01111111110010101, // lfsr position: 60172 + 0b10000010110010010, // lfsr position: 49830 + 0b10000100110111111, // lfsr position: 13727 + 0b10001011111100110, // lfsr position: 36098 + 0b10001110001001001, // lfsr position: 89347 + 0b10010011100000101, // lfsr position: 68751 + 0b10010110111011101, // lfsr position: 27484 + 0b10011010010111100, // lfsr position: 12008 + 0b10011101100001101, // lfsr position: 15483 + 0b10100010111110000, // lfsr position: 32660 + 0b10100110110100100, // lfsr position: 85943 + 0b10101011111101001, // lfsr position: 17214 + 0b10101110000010101, // lfsr position: 30 + 0b10110000110000001, // lfsr position: 44680 + 0b10110101111100100, // lfsr position: 103141 + 0b10111001100101110, // lfsr position: 51578 + 0b10111110100000101, // lfsr position: 82487 + 0b11000001011000110, // lfsr position: 25766 + 0b11000100110101001, // lfsr position: 75584 + 0b11001011010001101, // lfsr position: 29176 + 0b11001110000100100, // lfsr position: 91099 + 0b11010001011101010, // lfsr position: 73950 + 0b11010111110001001, // lfsr position: 108267 + 0b11011011101001111, // lfsr position: 104828 + 0b11011111100001111, // lfsr position: 63578 + 0b11100010010110001, // lfsr position: 87626 + 0b11100111001110100, // lfsr position: 94575 + 0b11101001110010101, // lfsr position: 39513 + 0b11101101100101111, // lfsr position: 77318 + 0b11110001101101001, // lfsr position: 92801 + 0b11110110101110100, // lfsr position: 80787 + 0b11111011001010001, // lfsr position: 5136 + 0b11111110011110111, // lfsr position: 48135 + }, + { + // Polynomial: 4 + 0b00000010011101011, // lfsr position: 60132 + 0b00000100111000010, // lfsr position: 63614 + 0b00001000100111001, // lfsr position: 48144 + 0b00001100000010101, // lfsr position: 10318 + 0b00010000110100000, // lfsr position: 36117 + 0b00010110010001001, // lfsr position: 25779 + 0b00011001110111111, // lfsr position: 99728 + 0b00011101111010100, // lfsr position: 85904 + 0b00100011110111000, // lfsr position: 18898 + 0b00100101001101011, // lfsr position: 82502 + 0b00101010001111010, // lfsr position: 61842 + 0b00101101111101111, // lfsr position: 44657 + 0b00110001000111110, // lfsr position: 3430 + 0b00110110111110100, // lfsr position: 92799 + 0b00111011111011111, // lfsr position: 68756 + 0b00111111010010110, // lfsr position: 46408 + 0b01000000000011001, // lfsr position: 89410 + 0b01000100100000111, // lfsr position: 37799 + 0b01001011100001110, // lfsr position: 73871 + 0b01001111010000000, // lfsr position: 17213 + 0b01010000000111110, // lfsr position: 87702 + 0b01010110011101011, // lfsr position: 91091 + 0b01011011000010010, // lfsr position: 5169 + 0b01011101000101101, // lfsr position: 37 + 0b01100001010001100, // lfsr position: 84238 + 0b01100101100000111, // lfsr position: 13738 + 0b01101011001001110, // lfsr position: 1710 + 0b01101110110010010, // lfsr position: 42960 + 0b01110010011010111, // lfsr position: 41228 + 0b01110111111011010, // lfsr position: 108283 + 0b01111001001111011, // lfsr position: 20628 + 0b01111101001110100, // lfsr position: 6852 + 0b10000011011000100, // lfsr position: 80746 + 0b10000101110000010, // lfsr position: 103117 + 0b10001010110001111, // lfsr position: 27463 + 0b10001111101101010, // lfsr position: 94520 + 0b10010010111010100, // lfsr position: 39518 + 0b10010110101111010, // lfsr position: 8613 + 0b10011000001101101, // lfsr position: 56739 + 0b10011111100101000, // lfsr position: 75661 + 0b10100011110111101, // lfsr position: 101370 + 0b10100100110100111, // lfsr position: 29259 + 0b10101011101000110, // lfsr position: 97967 + 0b10101100011010000, // lfsr position: 54981 + 0b10110011101110111, // lfsr position: 79037 + 0b10110100001010111, // lfsr position: 34379 + 0b10111001110111111, // lfsr position: 30963 + 0b10111111000100011, // lfsr position: 12043 + 0b11000010000000011, // lfsr position: 58477 + 0b11000111010000110, // lfsr position: 22369 + 0b11001011101101111, // lfsr position: 106581 + 0b11001110000101011, // lfsr position: 67027 + 0b11010010100101011, // lfsr position: 53256 + 0b11010101101001111, // lfsr position: 15454 + 0b11011001010010110, // lfsr position: 51547 + 0b11011100000100000, // lfsr position: 24030 + 0b11100000101101101, // lfsr position: 65317 + 0b11100110111101010, // lfsr position: 77304 + 0b11101011000100100, // lfsr position: 104849 + 0b11101110010001110, // lfsr position: 32631 + 0b11110010100011010, // lfsr position: 96250 + 0b11110100011000100, // lfsr position: 49853 + 0b11111011111101001, // lfsr position: 70472 + 0b11111101000001101, // lfsr position: 72152 + }, + { + // Polynomial: 5 + 0b00000000111011110, // lfsr position: 51571 + 0b00000101110000010, // lfsr position: 20646 + 0b00001011010001101, // lfsr position: 84217 + 0b00001101000110001, // lfsr position: 70471 + 0b00010010101100110, // lfsr position: 49890 + 0b00010100000100100, // lfsr position: 99709 + 0b00011001000000111, // lfsr position: 1678 + 0b00011110010000001, // lfsr position: 73953 + 0b00100000011000110, // lfsr position: 6907 + 0b00100110000101100, // lfsr position: 34407 + 0b00101011100100101, // lfsr position: 60157 + 0b00101111011001100, // lfsr position: 92830 + 0b00110000010000101, // lfsr position: 29264 + 0b00110111011001010, // lfsr position: 67020 + 0b00111011010111011, // lfsr position: 15466 + 0b00111110010111000, // lfsr position: 85954 + 0b01000010100110011, // lfsr position: 22360 + 0b01000100001100010, // lfsr position: 108296 + 0b01001001110011100, // lfsr position: 10312 + 0b01001101111010111, // lfsr position: 18892 + 0b01010001100001110, // lfsr position: 94547 + 0b01010100010011011, // lfsr position: 27502 + 0b01011001000100001, // lfsr position: 106567 + 0b01011100010010100, // lfsr position: 5128 + 0b01100000010000111, // lfsr position: 55031 + 0b01100101110100110, // lfsr position: 41251 + 0b01101000000000110, // lfsr position: 32646 + 0b01101110000111100, // lfsr position: 97969 + 0b01110001001010001, // lfsr position: 75626 + 0b01110100000100011, // lfsr position: 101397 + 0b01111000010111111, // lfsr position: 3430 + 0b01111100000100111, // lfsr position: 37793 + 0b10000011100011011, // lfsr position: 96211 + 0b10000100111001001, // lfsr position: 87686 + 0b10001011001111011, // lfsr position: 49 + 0b10001101101000011, // lfsr position: 44683 + 0b10010011011001011, // lfsr position: 36079 + 0b10010111010100110, // lfsr position: 58479 + 0b10011001011111010, // lfsr position: 68732 + 0b10011110110100100, // lfsr position: 80743 + 0b10100000011000001, // lfsr position: 103117 + 0b10100111000101000, // lfsr position: 89377 + 0b10101011011000011, // lfsr position: 63602 + 0b10101100100101110, // lfsr position: 61876 + 0b10110000111100000, // lfsr position: 39530 + 0b10110111111000000, // lfsr position: 13763 + 0b10111010101101010, // lfsr position: 104821 + 0b10111100011000000, // lfsr position: 77381 + 0b11000001101011111, // lfsr position: 8596 + 0b11000100011000101, // lfsr position: 56716 + 0b11001001110000110, // lfsr position: 65286 + 0b11001111100000011, // lfsr position: 25822 + 0b11010011110011011, // lfsr position: 79020 + 0b11010110110011110, // lfsr position: 82512 + 0b11011011101101111, // lfsr position: 24059 + 0b11011110001110101, // lfsr position: 46385 + 0b11100011100010110, // lfsr position: 17197 + 0b11100101010100001, // lfsr position: 12028 + 0b11101000001001101, // lfsr position: 72190 + 0b11101111001100100, // lfsr position: 53306 + 0b11110000110000000, // lfsr position: 91108 + 0b11110111110010000, // lfsr position: 48097 + 0b11111011110100111, // lfsr position: 30936 + 0b11111100100011101, // lfsr position: 42957 + }, + { + // Polynomial: 6 + 0b00000011111001010, // lfsr position: 42950 + 0b00000111010110101, // lfsr position: 106575 + 0b00001001010101000, // lfsr position: 82493 + 0b00001110101111010, // lfsr position: 51550 + 0b00010011011101111, // lfsr position: 17210 + 0b00010111000110011, // lfsr position: 70452 + 0b00011011110011111, // lfsr position: 99714 + 0b00011111001011010, // lfsr position: 49834 + 0b00100011010010111, // lfsr position: 84249 + 0b00100110111110010, // lfsr position: 68762 + 0b00101010111011111, // lfsr position: 46419 + 0b00101110110100011, // lfsr position: 56717 + 0b00110001001011010, // lfsr position: 25773 + 0b00110101010001000, // lfsr position: 15463 + 0b00111011011111001, // lfsr position: 8571 + 0b00111110111011000, // lfsr position: 89332 + 0b01000001001011001, // lfsr position: 48127 + 0b01000100011011110, // lfsr position: 58445 + 0b01001000010010110, // lfsr position: 12027 + 0b01001111010101011, // lfsr position: 77365 + 0b01010000010001000, // lfsr position: 60154 + 0b01010111101100000, // lfsr position: 3409 + 0b01011000111011010, // lfsr position: 20610 + 0b01011110001111111, // lfsr position: 75635 + 0b01100000010000011, // lfsr position: 53282 + 0b01100101001010100, // lfsr position: 61871 + 0b01101001111110101, // lfsr position: 34398 + 0b01101101010011010, // lfsr position: 24073 + 0b01110001011001110, // lfsr position: 36115 + 0b01110100011111000, // lfsr position: 41248 + 0b01111000110000011, // lfsr position: 27495 + 0b01111110101110000, // lfsr position: 10334 + 0b10000000111010001, // lfsr position: 91138 + 0b10000110101101000, // lfsr position: 55010 + 0b10001011011001101, // lfsr position: 96237 + 0b10001101010010001, // lfsr position: 101412 + 0b10010010111101010, // lfsr position: 85922 + 0b10010110011101101, // lfsr position: 5114 + 0b10011011100001101, // lfsr position: 44702 + 0b10011110101110111, // lfsr position: 6914 + 0b10100000011000000, // lfsr position: 1754 + 0b10100100010101101, // lfsr position: 21 + 0b10101010101110000, // lfsr position: 67047 + 0b10101110010000100, // lfsr position: 13714 + 0b10110011001101010, // lfsr position: 108303 + 0b10110111110100110, // lfsr position: 18906 + 0b10111011011101001, // lfsr position: 103127 + 0b10111101000111001, // lfsr position: 29195 + 0b11000011011000000, // lfsr position: 30944 + 0b11000110101111101, // lfsr position: 63577 + 0b11001011110001010, // lfsr position: 80788 + 0b11001111001010011, // lfsr position: 92817 + 0b11010011110011100, // lfsr position: 72176 + 0b11010111011011101, // lfsr position: 104838 + 0b11011001001001111, // lfsr position: 65346 + 0b11011110001001111, // lfsr position: 39528 + 0b11100001101111010, // lfsr position: 73906 + 0b11100101001110001, // lfsr position: 97953 + 0b11101000111111010, // lfsr position: 37814 + 0b11101100100111011, // lfsr position: 79101 + 0b11110001011011101, // lfsr position: 94532 + 0b11110111111000110, // lfsr position: 22350 + 0b11111011000100000, // lfsr position: 32617 + 0b11111101110101001, // lfsr position: 87655 + }, + { + // Polynomial: 7 + 0b00000010001011001, // lfsr position: 77297 + 0b00000100110001010, // lfsr position: 17175 + 0b00001010100010111, // lfsr position: 70460 + 0b00001101101010100, // lfsr position: 27486 + 0b00010001110001011, // lfsr position: 94515 + 0b00010100010001110, // lfsr position: 108291 + 0b00011011110111110, // lfsr position: 53278 + 0b00011100100111111, // lfsr position: 61891 + 0b00100010110000110, // lfsr position: 3431 + 0b00100110001100011, // lfsr position: 11995 + 0b00101010100100001, // lfsr position: 63596 + 0b00101101011100011, // lfsr position: 37 + 0b00110011000110010, // lfsr position: 99693 + 0b00110111110110111, // lfsr position: 25761 + 0b00111000110001011, // lfsr position: 84221 + 0b00111101111101101, // lfsr position: 15474 + 0b01000011001101101, // lfsr position: 96226 + 0b01000110010101111, // lfsr position: 44713 + 0b01001001111101100, // lfsr position: 67050 + 0b01001100110010000, // lfsr position: 37786 + 0b01010011101010010, // lfsr position: 91090 + 0b01010110101001111, // lfsr position: 20643 + 0b01011000111000001, // lfsr position: 58418 + 0b01011111010000100, // lfsr position: 42943 + 0b01100000000010111, // lfsr position: 85932 + 0b01100100000111001, // lfsr position: 1700 + 0b01101011000101111, // lfsr position: 103117 + 0b01101110011110100, // lfsr position: 87609 + 0b01110001000000111, // lfsr position: 65296 + 0b01110101011100100, // lfsr position: 82454 + 0b01111011110110010, // lfsr position: 5166 + 0b01111110100111111, // lfsr position: 32662 + 0b10000010100001101, // lfsr position: 92811 + 0b10000111111011011, // lfsr position: 72203 + 0b10001010011001010, // lfsr position: 8587 + 0b10001111100100001, // lfsr position: 75596 + 0b10010001000000000, // lfsr position: 24060 + 0b10010101010001100, // lfsr position: 29223 + 0b10011000101000001, // lfsr position: 22345 + 0b10011100001011100, // lfsr position: 73921 + 0b10100010000001100, // lfsr position: 104875 + 0b10100101111010101, // lfsr position: 97995 + 0b10101011000001010, // lfsr position: 48085 + 0b10101101000110100, // lfsr position: 55006 + 0b10110000110010010, // lfsr position: 41265 + 0b10110111110011100, // lfsr position: 10269 + 0b10111011001110010, // lfsr position: 60184 + 0b10111110000010110, // lfsr position: 68783 + 0b11000011110010100, // lfsr position: 30954 + 0b11000110111000000, // lfsr position: 106561 + 0b11001011000111000, // lfsr position: 36118 + 0b11001100010110110, // lfsr position: 51554 + 0b11010000111100110, // lfsr position: 56709 + 0b11010100011011110, // lfsr position: 18898 + 0b11011011001010011, // lfsr position: 89385 + 0b11011100000010000, // lfsr position: 34405 + 0b11100000110011101, // lfsr position: 6870 + 0b11100110111100011, // lfsr position: 80808 + 0b11101000101001101, // lfsr position: 49850 + 0b11101100101101010, // lfsr position: 101427 + 0b11110010110110100, // lfsr position: 13752 + 0b11110111000000001, // lfsr position: 79038 + 0b11111010010010011, // lfsr position: 39530 + 0b11111101011110011, // lfsr position: 46385 + }, + { + // Polynomial: 8 + 0b00000000000000001, // lfsr position: 0 + 0b00000100110101110, // lfsr position: 94551 + 0b00001010111101111, // lfsr position: 103154 + 0b00001100000110110, // lfsr position: 77345 + 0b00010010010011101, // lfsr position: 41253 + 0b00010101100111010, // lfsr position: 13710 + 0b00011011101000000, // lfsr position: 104810 + 0b00011111010001110, // lfsr position: 67051 + 0b00100000000111110, // lfsr position: 106585 + 0b00100111011001000, // lfsr position: 58399 + 0b00101011010101100, // lfsr position: 10302 + 0b00101101001111101, // lfsr position: 82499 + 0b00110000101010110, // lfsr position: 42979 + 0b00110110101101100, // lfsr position: 25787 + 0b00111000100001100, // lfsr position: 98004 + 0b00111111101111011, // lfsr position: 92795 + 0b01000001000001111, // lfsr position: 91104 + 0b01000110011001011, // lfsr position: 12074 + 0b01001011001011111, // lfsr position: 24060 + 0b01001111000011001, // lfsr position: 72207 + 0b01010011000000011, // lfsr position: 22345 + 0b01010110001001101, // lfsr position: 101450 + 0b01011010101010100, // lfsr position: 87663 + 0b01011101011001011, // lfsr position: 39532 + 0b01100010010100000, // lfsr position: 99647 + 0b01100101110101111, // lfsr position: 73895 + 0b01101011010101101, // lfsr position: 68768 + 0b01101110111100110, // lfsr position: 70446 + 0b01110000000000001, // lfsr position: 53290 + 0b01110101101010101, // lfsr position: 46427 + 0b01111011100011110, // lfsr position: 61905 + 0b01111110011110101, // lfsr position: 3407 + 0b10000011110111100, // lfsr position: 49819 + 0b10000110100111001, // lfsr position: 63583 + 0b10001011101000110, // lfsr position: 80740 + 0b10001110000000000, // lfsr position: 65301 + 0b10010001101001010, // lfsr position: 1684 + 0b10010100100010011, // lfsr position: 6877 + 0b10011011000111000, // lfsr position: 20629 + 0b10011101111010011, // lfsr position: 75598 + 0b10100001110100101, // lfsr position: 51575 + 0b10100110110100000, // lfsr position: 108258 + 0b10101001000111000, // lfsr position: 32626 + 0b10101110011000010, // lfsr position: 79055 + 0b10110001001101110, // lfsr position: 29196 + 0b10110110011010111, // lfsr position: 36089 + 0b10111011001100100, // lfsr position: 85908 + 0b10111100000101110, // lfsr position: 84242 + 0b11000010100001011, // lfsr position: 96278 + 0b11000100111111111, // lfsr position: 60139 + 0b11001010010010000, // lfsr position: 44661 + 0b11001101110100100, // lfsr position: 17173 + 0b11010000111101011, // lfsr position: 89379 + 0b11010101011001110, // lfsr position: 30953 + 0b11011001000001001, // lfsr position: 55044 + 0b11011111111010111, // lfsr position: 5149 + 0b11100001100010001, // lfsr position: 8599 + 0b11100101101111000, // lfsr position: 56699 + 0b11101001011010011, // lfsr position: 15505 + 0b11101101101110101, // lfsr position: 18939 + 0b11110001111111110, // lfsr position: 37811 + 0b11110101110010101, // lfsr position: 34389 + 0b11111010001100101, // lfsr position: 48104 + 0b11111111101000110, // lfsr position: 27541 + }, + { + // Polynomial: 9 + 0b00000010000100001, // lfsr position: 103076 + 0b00000100100010101, // lfsr position: 12028 + 0b00001011101000110, // lfsr position: 6907 + 0b00001100110101011, // lfsr position: 18917 + 0b00010011000101000, // lfsr position: 8592 + 0b00010110100110001, // lfsr position: 27508 + 0b00011001010100100, // lfsr position: 70488 + 0b00011110011011101, // lfsr position: 84191 + 0b00100011000011100, // lfsr position: 46431 + 0b00100101011000111, // lfsr position: 58414 + 0b00101010100110011, // lfsr position: 68715 + 0b00101101101101101, // lfsr position: 10322 + 0b00110000100010111, // lfsr position: 106544 + 0b00110110001011110, // lfsr position: 30924 + 0b00111011110000000, // lfsr position: 22342 + 0b00111100011110110, // lfsr position: 72214 + 0b01000010100110100, // lfsr position: 15507 + 0b01000101111000011, // lfsr position: 80732 + 0b01001010101010000, // lfsr position: 51601 + 0b01001101101001011, // lfsr position: 97971 + 0b01010011010100011, // lfsr position: 37827 + 0b01010100010000100, // lfsr position: 85941 + 0b01011000111011101, // lfsr position: 82519 + 0b01011111110010000, // lfsr position: 79014 + 0b01100010100010100, // lfsr position: 20646 + 0b01100100001010011, // lfsr position: 94516 + 0b01101000111111111, // lfsr position: 60144 + 0b01101110100111011, // lfsr position: 48103 + 0b01110000001111001, // lfsr position: 87646 + 0b01110100111000011, // lfsr position: 13752 + 0b01111010100100110, // lfsr position: 42942 + 0b01111111001011110, // lfsr position: 89390 + 0b10000001011000101, // lfsr position: 67051 + 0b10000111111110110, // lfsr position: 1771 + 0b10001011010100111, // lfsr position: 99701 + 0b10001111101111001, // lfsr position: 75594 + 0b10010011000100011, // lfsr position: 108283 + 0b10010100100111001, // lfsr position: 5171 + 0b10011010010110111, // lfsr position: 41 + 0b10011111101101011, // lfsr position: 39516 + 0b10100001101100111, // lfsr position: 32642 + 0b10100101110001110, // lfsr position: 96200 + 0b10101001010001111, // lfsr position: 3434 + 0b10101110111110010, // lfsr position: 29262 + 0b10110001000011000, // lfsr position: 56720 + 0b10110110000010001, // lfsr position: 73906 + 0b10111000111011000, // lfsr position: 77339 + 0b10111101011011110, // lfsr position: 55001 + 0b11000010110001011, // lfsr position: 41288 + 0b11000100111011001, // lfsr position: 49852 + 0b11001000001100111, // lfsr position: 44679 + 0b11001101001111100, // lfsr position: 92845 + 0b11010010010100111, // lfsr position: 101371 + 0b11010101010011101, // lfsr position: 63593 + 0b11011010110011000, // lfsr position: 34398 + 0b11011111101001001, // lfsr position: 36101 + 0b11100011111011011, // lfsr position: 24038 + 0b11100101100101000, // lfsr position: 17191 + 0b11101000001000111, // lfsr position: 91139 + 0b11101110001010110, // lfsr position: 53287 + 0b11110011111110101, // lfsr position: 25780 + 0b11110110010110010, // lfsr position: 61908 + 0b11111011100111011, // lfsr position: 104855 + 0b11111100010100101, // lfsr position: 65327 + }, + { + // Polynomial: 10 + 0b00000010001000001, // lfsr position: 68748 + 0b00000111011000001, // lfsr position: 56727 + 0b00001010011010110, // lfsr position: 60150 + 0b00001110111111111, // lfsr position: 70458 + 0b00010001011101111, // lfsr position: 29204 + 0b00010100110000001, // lfsr position: 8607 + 0b00011001001011101, // lfsr position: 79089 + 0b00011111100100011, // lfsr position: 37802 + 0b00100001100110101, // lfsr position: 46431 + 0b00100110100111000, // lfsr position: 12059 + 0b00101010011000110, // lfsr position: 20605 + 0b00101100111010101, // lfsr position: 108252 + 0b00110011101111011, // lfsr position: 27502 + 0b00110110001111110, // lfsr position: 101441 + 0b00111010110111000, // lfsr position: 42977 + 0b00111101111010000, // lfsr position: 58435 + 0b01000001111000101, // lfsr position: 103160 + 0b01000101111110110, // lfsr position: 97965 + 0b01001011101101111, // lfsr position: 51532 + 0b01001100000011111, // lfsr position: 84214 + 0b01010001010110001, // lfsr position: 1706 + 0b01010100101100001, // lfsr position: 17191 + 0b01011011011110000, // lfsr position: 65316 + 0b01011110011100100, // lfsr position: 48147 + 0b01100001000100000, // lfsr position: 55025 + 0b01100110100001010, // lfsr position: 99706 + 0b01101001110110011, // lfsr position: 32649 + 0b01101100010010110, // lfsr position: 36113 + 0b01110011111010001, // lfsr position: 77352 + 0b01110100101010011, // lfsr position: 6876 + 0b01111010100111110, // lfsr position: 73938 + 0b01111101111101111, // lfsr position: 72191 + 0b10000001100100111, // lfsr position: 3426 + 0b10000111110110011, // lfsr position: 10357 + 0b10001001000110111, // lfsr position: 18907 + 0b10001110111100010, // lfsr position: 63621 + 0b10010001101100010, // lfsr position: 22329 + 0b10010101100011100, // lfsr position: 92765 + 0b10011011000111110, // lfsr position: 61853 + 0b10011110011101000, // lfsr position: 96256 + 0b10100001100101001, // lfsr position: 104872 + 0b10100101100001110, // lfsr position: 44690 + 0b10101000111100110, // lfsr position: 39548 + 0b10101110010011111, // lfsr position: 82502 + 0b10110000000100011, // lfsr position: 80810 + 0b10110100000111110, // lfsr position: 5145 + 0b10111010011100101, // lfsr position: 41256 + 0b10111111100010000, // lfsr position: 24069 + 0b11000010010111000, // lfsr position: 53283 + 0b11000101111110011, // lfsr position: 89377 + 0b11001010111111101, // lfsr position: 67067 + 0b11001110100001110, // lfsr position: 85936 + 0b11010010110111011, // lfsr position: 106578 + 0b11010110110110100, // lfsr position: 15481 + 0b11011010100111110, // lfsr position: 13796 + 0b11011100111011010, // lfsr position: 87680 + 0b11100011110101111, // lfsr position: 49842 + 0b11100111100001010, // lfsr position: 91097 + 0b11101010111101110, // lfsr position: 43 + 0b11101101111011101, // lfsr position: 94527 + 0b11110001111111101, // lfsr position: 34359 + 0b11110101011100111, // lfsr position: 30922 + 0b11111000000011101, // lfsr position: 75621 + 0b11111101101000011, // lfsr position: 25781 + }, + { + // Polynomial: 11 + 0b00000010000100011, // lfsr position: 34336 + 0b00000110011001010, // lfsr position: 36090 + 0b00001000000010000, // lfsr position: 67048 + 0b00001110001111101, // lfsr position: 70460 + 0b00010001010000100, // lfsr position: 27521 + 0b00010100000011001, // lfsr position: 56713 + 0b00011001010011101, // lfsr position: 79065 + 0b00011101011110110, // lfsr position: 49833 + 0b00100001110100110, // lfsr position: 65307 + 0b00100111101100001, // lfsr position: 75629 + 0b00101010110011110, // lfsr position: 29190 + 0b00101110001111010, // lfsr position: 82496 + 0b00110010101001000, // lfsr position: 39513 + 0b00110110101011001, // lfsr position: 61880 + 0b00111000101011101, // lfsr position: 17167 + 0b00111101010001011, // lfsr position: 20650 + 0b01000000101111100, // lfsr position: 22365 + 0b01000111000110101, // lfsr position: 72226 + 0b01001001010110110, // lfsr position: 60167 + 0b01001110110111010, // lfsr position: 99693 + 0b01010000010100100, // lfsr position: 103134 + 0b01010110110100101, // lfsr position: 24022 + 0b01011011001011100, // lfsr position: 37794 + 0b01011101011010101, // lfsr position: 80793 + 0b01100000010010001, // lfsr position: 51533 + 0b01100101111100011, // lfsr position: 1746 + 0b01101000001111000, // lfsr position: 30936 + 0b01101111100001110, // lfsr position: 5158 + 0b01110000111111011, // lfsr position: 91089 + 0b01110101110010010, // lfsr position: 97954 + 0b01111000101000101, // lfsr position: 96246 + 0b01111101111011100, // lfsr position: 6918 + 0b10000001000110100, // lfsr position: 3449 + 0b10000111110010100, // lfsr position: 55019 + 0b10001000101001100, // lfsr position: 12053 + 0b10001101111010000, // lfsr position: 42977 + 0b10010001010110101, // lfsr position: 8627 + 0b10010100111111100, // lfsr position: 87678 + 0b10011001001111100, // lfsr position: 106558 + 0b10011111100001000, // lfsr position: 41268 + 0b10100011001011111, // lfsr position: 101396 + 0b10100110000000001, // lfsr position: 108310 + 0b10101000101101100, // lfsr position: 104869 + 0b10101101000001000, // lfsr position: 48127 + 0b10110011111010111, // lfsr position: 18909 + 0b10110101010000100, // lfsr position: 32631 + 0b10111011111000010, // lfsr position: 92789 + 0b10111101001011110, // lfsr position: 73939 + 0b11000011010100111, // lfsr position: 16 + 0b11000111100010111, // lfsr position: 44694 + 0b11001010010000101, // lfsr position: 53263 + 0b11001110110110010, // lfsr position: 10269 + 0b11010000111101110, // lfsr position: 68772 + 0b11010101000011111, // lfsr position: 89357 + 0b11011000000100001, // lfsr position: 63603 + 0b11011101011111101, // lfsr position: 94517 + 0b11100010110001100, // lfsr position: 77341 + 0b11100100110100010, // lfsr position: 13749 + 0b11101010011010110, // lfsr position: 84194 + 0b11101101010000101, // lfsr position: 46392 + 0b11110000000000110, // lfsr position: 15471 + 0b11110110010001101, // lfsr position: 25791 + 0b11111000100010101, // lfsr position: 85917 + 0b11111101111111001, // lfsr position: 58450 + }, + { + // Polynomial: 12 + 0b00000011001100010, // lfsr position: 82516 + 0b00000101001001111, // lfsr position: 10311 + 0b00001010010001010, // lfsr position: 63550 + 0b00001101001110011, // lfsr position: 91083 + 0b00010001011000100, // lfsr position: 24061 + 0b00010111001010110, // lfsr position: 68795 + 0b00011011110111010, // lfsr position: 27502 + 0b00011100101101011, // lfsr position: 30919 + 0b00100010111100011, // lfsr position: 49838 + 0b00100110100001100, // lfsr position: 75649 + 0b00101010000011000, // lfsr position: 34391 + 0b00101111001110001, // lfsr position: 65285 + 0b00110010101010000, // lfsr position: 79050 + 0b00110110101000100, // lfsr position: 85922 + 0b00111011111001001, // lfsr position: 60152 + 0b00111100101100011, // lfsr position: 104838 + 0b01000000110011011, // lfsr position: 15493 + 0b01000100101110111, // lfsr position: 6862 + 0b01001010011000101, // lfsr position: 8584 + 0b01001110010111001, // lfsr position: 44704 + 0b01010001000010010, // lfsr position: 49 + 0b01010100110000110, // lfsr position: 20626 + 0b01011010101101100, // lfsr position: 97968 + 0b01011100010000101, // lfsr position: 1735 + 0b01100001111110000, // lfsr position: 80788 + 0b01100100101101011, // lfsr position: 3405 + 0b01101011111111001, // lfsr position: 46415 + 0b01101100101011110, // lfsr position: 89363 + 0b01110010101000111, // lfsr position: 58452 + 0b01110100100110110, // lfsr position: 77339 + 0b01111000111000011, // lfsr position: 87656 + 0b01111111110111100, // lfsr position: 56707 + 0b10000000000011010, // lfsr position: 70460 + 0b10000110110110100, // lfsr position: 73902 + 0b10001010111100110, // lfsr position: 36047 + 0b10001110111110010, // lfsr position: 67078 + 0b10010011100110111, // lfsr position: 18929 + 0b10010100011000111, // lfsr position: 53277 + 0b10011011010110100, // lfsr position: 108275 + 0b10011100011100010, // lfsr position: 101383 + 0b10100000111001010, // lfsr position: 61885 + 0b10100100100011000, // lfsr position: 43008 + 0b10101000000000100, // lfsr position: 32651 + 0b10101101010100001, // lfsr position: 48135 + 0b10110011001001011, // lfsr position: 37829 + 0b10110111101000110, // lfsr position: 13764 + 0b10111000111001110, // lfsr position: 54955 + 0b10111110110110010, // lfsr position: 106562 + 0b11000010011110110, // lfsr position: 94563 + 0b11000100011101111, // lfsr position: 92804 + 0b11001011101001011, // lfsr position: 103096 + 0b11001111101101101, // lfsr position: 5171 + 0b11010000000100110, // lfsr position: 22373 + 0b11010101100110001, // lfsr position: 51587 + 0b11011011100001001, // lfsr position: 12013 + 0b11011110001100101, // lfsr position: 99663 + 0b11100010001001100, // lfsr position: 17153 + 0b11100110000000000, // lfsr position: 25747 + 0b11101010111100111, // lfsr position: 84216 + 0b11101110011110101, // lfsr position: 29223 + 0b11110001110011100, // lfsr position: 41245 + 0b11110110011100100, // lfsr position: 39502 + 0b11111010101000000, // lfsr position: 96247 + 0b11111101011000010, // lfsr position: 72149 + }, + { + // Polynomial: 13 + 0b00000011001111100, // lfsr position: 92847 + 0b00000111100101011, // lfsr position: 82504 + 0b00001010100111001, // lfsr position: 101392 + 0b00001110001100110, // lfsr position: 36111 + 0b00010010101000100, // lfsr position: 84221 + 0b00010110010110110, // lfsr position: 89331 + 0b00011010111100010, // lfsr position: 61902 + 0b00011101111001011, // lfsr position: 1674 + 0b00100011001111010, // lfsr position: 12027 + 0b00100100001000011, // lfsr position: 30921 + 0b00101011101101010, // lfsr position: 17196 + 0b00101110110101101, // lfsr position: 65277 + 0b00110011111000111, // lfsr position: 51521 + 0b00110100011110011, // lfsr position: 6861 + 0b00111010110011000, // lfsr position: 106606 + 0b00111100110110111, // lfsr position: 5113 + 0b01000010100010101, // lfsr position: 44680 + 0b01000111111111110, // lfsr position: 94487 + 0b01001011110100000, // lfsr position: 75638 + 0b01001111010001010, // lfsr position: 8616 + 0b01010010011011001, // lfsr position: 32645 + 0b01010100110011101, // lfsr position: 34372 + 0b01011011110011010, // lfsr position: 25819 + 0b01011100000111101, // lfsr position: 68746 + 0b01100010101011011, // lfsr position: 67033 + 0b01100110101101001, // lfsr position: 3425 + 0b01101001110011111, // lfsr position: 29226 + 0b01101100011011100, // lfsr position: 63604 + 0b01110011111110001, // lfsr position: 58419 + 0b01110110111000101, // lfsr position: 39527 + 0b01111010011011100, // lfsr position: 104838 + 0b01111100100011000, // lfsr position: 103161 + 0b10000010100111010, // lfsr position: 87692 + 0b10000100110011110, // lfsr position: 56727 + 0b10001011000011100, // lfsr position: 96246 + 0b10001101000000100, // lfsr position: 97964 + 0b10010000111010001, // lfsr position: 54982 + 0b10010110110000010, // lfsr position: 24038 + 0b10011001000111001, // lfsr position: 80780 + 0b10011100111111111, // lfsr position: 13796 + 0b10100010001000110, // lfsr position: 72203 + 0b10100100011001110, // lfsr position: 77364 + 0b10101010100100010, // lfsr position: 41275 + 0b10101110110011110, // lfsr position: 73938 + 0b10110001101001111, // lfsr position: 91062 + 0b10110100011110100, // lfsr position: 99671 + 0b10111011111000111, // lfsr position: 48116 + 0b10111110110011100, // lfsr position: 79086 + 0b11000000001100110, // lfsr position: 37788 + 0b11000110000111010, // lfsr position: 42961 + 0b11001010001001001, // lfsr position: 22347 + 0b11001111010111011, // lfsr position: 60117 + 0b11010010110101110, // lfsr position: 108291 + 0b11010110010011010, // lfsr position: 18879 + 0b11011011001110100, // lfsr position: 70474 + 0b11011100100110000, // lfsr position: 27506 + 0b11100011100110011, // lfsr position: 85945 + 0b11100111101111011, // lfsr position: 24 + 0b11101001001101111, // lfsr position: 10281 + 0b11101111001110111, // lfsr position: 20628 + 0b11110011101010000, // lfsr position: 46430 + 0b11110101001111000, // lfsr position: 49833 + 0b11111001010010000, // lfsr position: 15490 + 0b11111101110001101, // lfsr position: 53272 + }, + { + // Polynomial: 14 + 0b00000000101001111, // lfsr position: 80781 + 0b00000100101011010, // lfsr position: 1744 + 0b00001000000101101, // lfsr position: 106572 + 0b00001101001001001, // lfsr position: 87684 + 0b00010001111011110, // lfsr position: 91109 + 0b00010101000100110, // lfsr position: 108243 + 0b00011010011100100, // lfsr position: 3422 + 0b00011100101000001, // lfsr position: 104857 + 0b00100001101010011, // lfsr position: 32652 + 0b00100111001010000, // lfsr position: 46398 + 0b00101001110100011, // lfsr position: 96244 + 0b00101110001000110, // lfsr position: 82544 + 0b00110000100111101, // lfsr position: 53298 + 0b00110101100100001, // lfsr position: 15515 + 0b00111010010000000, // lfsr position: 6832 + 0b00111101111001100, // lfsr position: 30911 + 0b01000010101001010, // lfsr position: 41257 + 0b01000110110000011, // lfsr position: 8588 + 0b01001010101001110, // lfsr position: 42925 + 0b01001111111111011, // lfsr position: 79066 + 0b01010001000011101, // lfsr position: 84215 + 0b01010101110011110, // lfsr position: 97970 + 0b01011000001001111, // lfsr position: 73920 + 0b01011101010100111, // lfsr position: 27479 + 0b01100001011001101, // lfsr position: 49818 + 0b01100111101100000, // lfsr position: 48113 + 0b01101011001101100, // lfsr position: 29198 + 0b01101100111011001, // lfsr position: 72159 + 0b01110010110001111, // lfsr position: 75637 + 0b01110100110011110, // lfsr position: 20612 + 0b01111000111110000, // lfsr position: 103132 + 0b01111101100000011, // lfsr position: 5118 + 0b10000010111000011, // lfsr position: 10306 + 0b10000100111000011, // lfsr position: 60167 + 0b10001000101111011, // lfsr position: 89411 + 0b10001111000001100, // lfsr position: 18882 + 0b10010001010101110, // lfsr position: 36080 + 0b10010100111101000, // lfsr position: 77342 + 0b10011001000111100, // lfsr position: 55030 + 0b10011111011001001, // lfsr position: 68741 + 0b10100011001100100, // lfsr position: 34409 + 0b10100100100000000, // lfsr position: 25828 + 0b10101001110010000, // lfsr position: 65275 + 0b10101111011001001, // lfsr position: 44701 + 0b10110000100010010, // lfsr position: 101403 + 0b10110110000100110, // lfsr position: 24061 + 0b10111010110101101, // lfsr position: 58389 + 0b10111111110010110, // lfsr position: 92832 + 0b11000001001001111, // lfsr position: 85889 + 0b11000111000000011, // lfsr position: 13735 + 0b11001000110000000, // lfsr position: 23 + 0b11001111011001101, // lfsr position: 17195 + 0b11010000010010000, // lfsr position: 37824 + 0b11010111110010011, // lfsr position: 12034 + 0b11011000111101110, // lfsr position: 70490 + 0b11011111010110001, // lfsr position: 66983 + 0b11100010101000110, // lfsr position: 51564 + 0b11100100110010011, // lfsr position: 63620 + 0b11101001011110000, // lfsr position: 56727 + 0b11101111011111010, // lfsr position: 94566 + 0b11110000010100110, // lfsr position: 61870 + 0b11110110001110110, // lfsr position: 99646 + 0b11111000110001110, // lfsr position: 22316 + 0b11111111110101001, // lfsr position: 39544 + }, + { + // Polynomial: 15 + 0b00000011000110001, // lfsr position: 101404 + 0b00000100001011010, // lfsr position: 12041 + 0b00001010010110011, // lfsr position: 15452 + 0b00001101110111111, // lfsr position: 103132 + 0b00010000101111100, // lfsr position: 106583 + 0b00010100111010000, // lfsr position: 92764 + 0b00011010110111010, // lfsr position: 29212 + 0b00011100100000101, // lfsr position: 18933 + 0b00100010011111111, // lfsr position: 79082 + 0b00100111100011010, // lfsr position: 104834 + 0b00101011101101110, // lfsr position: 80792 + 0b00101111000110010, // lfsr position: 84232 + 0b00110001110001010, // lfsr position: 27537 + 0b00110111111100110, // lfsr position: 63641 + 0b00111011001100100, // lfsr position: 8580 + 0b00111101110101110, // lfsr position: 72180 + 0b01000000100101011, // lfsr position: 22340 + 0b01000100101001001, // lfsr position: 99695 + 0b01001000101100101, // lfsr position: 46419 + 0b01001110010100100, // lfsr position: 56705 + 0b01010010111100010, // lfsr position: 13721 + 0b01010111101001111, // lfsr position: 89364 + 0b01011010000011100, // lfsr position: 44694 + 0b01011110101111011, // lfsr position: 65333 + 0b01100000110110010, // lfsr position: 61858 + 0b01100111010101010, // lfsr position: 98011 + 0b01101010111001001, // lfsr position: 58418 + 0b01101110111001111, // lfsr position: 34381 + 0b01110011101001011, // lfsr position: 68708 + 0b01110110001110010, // lfsr position: 87629 + 0b01111001101111010, // lfsr position: 94527 + 0b01111110000111011, // lfsr position: 77351 + 0b10000001110111111, // lfsr position: 51571 + 0b10000111000010110, // lfsr position: 48131 + 0b10001010000011000, // lfsr position: 6850 + 0b10001101010011011, // lfsr position: 41262 + 0b10010000110001000, // lfsr position: 66994 + 0b10010111000000100, // lfsr position: 17171 + 0b10011010010111110, // lfsr position: 39522 + 0b10011101000001000, // lfsr position: 55004 + 0b10100011101011110, // lfsr position: 25752 + 0b10100110100010110, // lfsr position: 30933 + 0b10101011010001101, // lfsr position: 60157 + 0b10101101101000010, // lfsr position: 85910 + 0b10110000101111100, // lfsr position: 24051 + 0b10110100100010110, // lfsr position: 1736 + 0b10111011100101011, // lfsr position: 42984 + 0b10111110000010000, // lfsr position: 108283 + 0b11000011101011110, // lfsr position: 75631 + 0b11000101101001001, // lfsr position: 73938 + 0b11001010101110100, // lfsr position: 36045 + 0b11001100001000111, // lfsr position: 3454 + 0b11010000100100100, // lfsr position: 32630 + 0b11010111110111100, // lfsr position: 49831 + 0b11011010001000010, // lfsr position: 10328 + 0b11011111001101001, // lfsr position: 17 + 0b11100011101000000, // lfsr position: 5142 + 0b11100100011101111, // lfsr position: 53319 + 0b11101011101101110, // lfsr position: 96265 + 0b11101110100111010, // lfsr position: 91089 + 0b11110010001110100, // lfsr position: 20644 + 0b11110101101111010, // lfsr position: 70510 + 0b11111000110000010, // lfsr position: 37821 + 0b11111110110001110, // lfsr position: 82534 + }, + { + // Polynomial: 16 + 0b00000011100101100, // lfsr position: 82518 + 0b00000110101000011, // lfsr position: 72225 + 0b00001011100000110, // lfsr position: 56727 + 0b00001110111110011, // lfsr position: 85951 + 0b00010001110001101, // lfsr position: 27520 + 0b00010110010111110, // lfsr position: 51593 + 0b00011000111000110, // lfsr position: 34380 + 0b00011111011100111, // lfsr position: 15500 + 0b00100010000001010, // lfsr position: 48143 + 0b00100100000001100, // lfsr position: 73898 + 0b00101010010101011, // lfsr position: 22355 + 0b00101111010010101, // lfsr position: 94512 + 0b00110010011111111, // lfsr position: 101408 + 0b00110110001000011, // lfsr position: 36062 + 0b00111001010100100, // lfsr position: 8579 + 0b00111111011111111, // lfsr position: 3483 + 0b01000001011001001, // lfsr position: 53308 + 0b01000110100001001, // lfsr position: 17170 + 0b01001011100001000, // lfsr position: 35 + 0b01001101010010111, // lfsr position: 39535 + 0b01010010011100010, // lfsr position: 29193 + 0b01010110100000010, // lfsr position: 91056 + 0b01011001001100000, // lfsr position: 24089 + 0b01011101100000001, // lfsr position: 32671 + 0b01100010110000001, // lfsr position: 43005 + 0b01100111111001100, // lfsr position: 6896 + 0b01101001010111111, // lfsr position: 96258 + 0b01101110100110010, // lfsr position: 104846 + 0b01110011010011001, // lfsr position: 44665 + 0b01110101001111111, // lfsr position: 58406 + 0b01111000011100110, // lfsr position: 108263 + 0b01111111000011101, // lfsr position: 10344 + 0b10000011000111111, // lfsr position: 92790 + 0b10000100111111011, // lfsr position: 20666 + 0b10001001010100111, // lfsr position: 89394 + 0b10001110010010111, // lfsr position: 66985 + 0b10010011001011011, // lfsr position: 54981 + 0b10010101100101101, // lfsr position: 5187 + 0b10011000111111110, // lfsr position: 75606 + 0b10011110001010100, // lfsr position: 46395 + 0b10100000000111111, // lfsr position: 60184 + 0b10100100001001101, // lfsr position: 12002 + 0b10101000100001111, // lfsr position: 103084 + 0b10101111111111001, // lfsr position: 25775 + 0b10110011100101111, // lfsr position: 1691 + 0b10110110110111010, // lfsr position: 68756 + 0b10111010000011110, // lfsr position: 49869 + 0b10111100100011011, // lfsr position: 13755 + 0b11000001001110100, // lfsr position: 37809 + 0b11000111010101000, // lfsr position: 77384 + 0b11001010110100001, // lfsr position: 99660 + 0b11001101011100000, // lfsr position: 30914 + 0b11010010010010000, // lfsr position: 63619 + 0b11010101011000000, // lfsr position: 65305 + 0b11011011110000110, // lfsr position: 41286 + 0b11011110100101101, // lfsr position: 106545 + 0b11100000110000010, // lfsr position: 79052 + 0b11100110100010000, // lfsr position: 70499 + 0b11101010110111000, // lfsr position: 87653 + 0b11101110010101011, // lfsr position: 97952 + 0b11110010011001100, // lfsr position: 61896 + 0b11110101000111010, // lfsr position: 84194 + 0b11111011110010000, // lfsr position: 80742 + 0b11111101110101000, // lfsr position: 18909 + }, + { + // Polynomial: 17 + 0b00000000111110001, // lfsr position: 51596 + 0b00000100011101100, // lfsr position: 3447 + 0b00001010000100101, // lfsr position: 25814 + 0b00001100110100011, // lfsr position: 6879 + 0b00010010000000111, // lfsr position: 36102 + 0b00010100111100100, // lfsr position: 61878 + 0b00011001000011000, // lfsr position: 18938 + 0b00011111011111010, // lfsr position: 91056 + 0b00100010010111111, // lfsr position: 20622 + 0b00100110001010101, // lfsr position: 96238 + 0b00101011010010001, // lfsr position: 73878 + 0b00101100000111111, // lfsr position: 44690 + 0b00110010101000001, // lfsr position: 99658 + 0b00110111101100111, // lfsr position: 77350 + 0b00111000100101100, // lfsr position: 89366 + 0b00111110001100101, // lfsr position: 5128 + 0b01000001110010011, // lfsr position: 24064 + 0b01000100000000000, // lfsr position: 85902 + 0b01001000001101011, // lfsr position: 37841 + 0b01001100111001100, // lfsr position: 54984 + 0b01010010100101011, // lfsr position: 80828 + 0b01010111001110111, // lfsr position: 63589 + 0b01011001001101000, // lfsr position: 41257 + 0b01011111101001001, // lfsr position: 104851 + 0b01100011111110100, // lfsr position: 87688 + 0b01100111000001000, // lfsr position: 8584 + 0b01101011011001110, // lfsr position: 53293 + 0b01101101000101000, // lfsr position: 22332 + 0b01110011010011100, // lfsr position: 56723 + 0b01110110010001011, // lfsr position: 1759 + 0b01111011101010111, // lfsr position: 32628 + 0b01111101101011101, // lfsr position: 92828 + 0b10000010111100010, // lfsr position: 65315 + 0b10000110101001001, // lfsr position: 39524 + 0b10001011100111100, // lfsr position: 10321 + 0b10001100011000100, // lfsr position: 17200 + 0b10010001101101110, // lfsr position: 60172 + 0b10010111001000101, // lfsr position: 23 + 0b10011010111101000, // lfsr position: 29246 + 0b10011111101101000, // lfsr position: 34386 + 0b10100000000011100, // lfsr position: 97946 + 0b10100111000010111, // lfsr position: 48124 + 0b10101001011010111, // lfsr position: 11988 + 0b10101110000000101, // lfsr position: 42948 + 0b10110010101001001, // lfsr position: 79104 + 0b10110110000010101, // lfsr position: 94511 + 0b10111000010110101, // lfsr position: 13793 + 0b10111101010001111, // lfsr position: 68795 + 0b11000001111000101, // lfsr position: 27503 + 0b11000101000101100, // lfsr position: 15480 + 0b11001000011010110, // lfsr position: 70451 + 0b11001101001110011, // lfsr position: 49870 + 0b11010011110110010, // lfsr position: 46416 + 0b11010111100010011, // lfsr position: 67043 + 0b11011010111000111, // lfsr position: 75631 + 0b11011100101110100, // lfsr position: 108285 + 0b11100010001100110, // lfsr position: 72224 + 0b11100110000001011, // lfsr position: 106577 + 0b11101000010101001, // lfsr position: 84205 + 0b11101111111110000, // lfsr position: 103110 + 0b11110001010100001, // lfsr position: 101386 + 0b11110110010001011, // lfsr position: 58467 + 0b11111000011000101, // lfsr position: 30956 + 0b11111101110100001, // lfsr position: 82468 + }, + { + // Polynomial: 18 + 0b00000001100000101, // lfsr position: 79075 + 0b00000111011100100, // lfsr position: 42928 + 0b00001010111011101, // lfsr position: 39485 + 0b00001101110011011, // lfsr position: 36107 + 0b00010010000101100, // lfsr position: 60146 + 0b00010111111000011, // lfsr position: 68788 + 0b00011010011001110, // lfsr position: 87661 + 0b00011100111011110, // lfsr position: 13790 + 0b00100010000111011, // lfsr position: 56720 + 0b00100111100010111, // lfsr position: 106514 + 0b00101000111011100, // lfsr position: 58472 + 0b00101110001011001, // lfsr position: 30943 + 0b00110011011011011, // lfsr position: 51565 + 0b00110101000101011, // lfsr position: 108281 + 0b00111011101011100, // lfsr position: 96243 + 0b00111111010101111, // lfsr position: 6886 + 0b01000001101001010, // lfsr position: 43 + 0b01000110001101010, // lfsr position: 3483 + 0b01001010111001100, // lfsr position: 15439 + 0b01001111010111001, // lfsr position: 63573 + 0b01010001000100011, // lfsr position: 91124 + 0b01010101011000000, // lfsr position: 65314 + 0b01011010000000001, // lfsr position: 99695 + 0b01011110000011111, // lfsr position: 104874 + 0b01100011110101000, // lfsr position: 97948 + 0b01100101101011000, // lfsr position: 37847 + 0b01101011100001010, // lfsr position: 89345 + 0b01101100100001101, // lfsr position: 17182 + 0b01110000001110111, // lfsr position: 1744 + 0b01110101101001111, // lfsr position: 27469 + 0b01111010011011011, // lfsr position: 41236 + 0b01111110101000110, // lfsr position: 61857 + 0b10000001111110011, // lfsr position: 92795 + 0b10000100010111010, // lfsr position: 34378 + 0b10001001100001011, // lfsr position: 46424 + 0b10001110101000101, // lfsr position: 18938 + 0b10010001011110101, // lfsr position: 101397 + 0b10010110000111100, // lfsr position: 94549 + 0b10011010001011001, // lfsr position: 67036 + 0b10011100010000011, // lfsr position: 82514 + 0b10100000001001001, // lfsr position: 32635 + 0b10100110011111100, // lfsr position: 22309 + 0b10101001001011010, // lfsr position: 12054 + 0b10101100011000101, // lfsr position: 103115 + 0b10110000100110011, // lfsr position: 72142 + 0b10110110011010101, // lfsr position: 49837 + 0b10111001101000001, // lfsr position: 48147 + 0b10111101100100000, // lfsr position: 10321 + 0b11000010100100010, // lfsr position: 84192 + 0b11000110000011111, // lfsr position: 44691 + 0b11001010101110110, // lfsr position: 73908 + 0b11001101101111010, // lfsr position: 8555 + 0b11010000110100010, // lfsr position: 20626 + 0b11010110010000100, // lfsr position: 85987 + 0b11011000010100101, // lfsr position: 75631 + 0b11011110000100101, // lfsr position: 5149 + 0b11100010111000110, // lfsr position: 77358 + 0b11100101001101000, // lfsr position: 80768 + 0b11101000110100001, // lfsr position: 55004 + 0b11101111011001101, // lfsr position: 25791 + 0b11110010011101011, // lfsr position: 53244 + 0b11110101001001111, // lfsr position: 70440 + 0b11111000101101100, // lfsr position: 29180 + 0b11111101001101101, // lfsr position: 24021 + }, + { + // Polynomial: 19 + 0b00000010111111011, // lfsr position: 46364 + 0b00000110111111010, // lfsr position: 8586 + 0b00001011110101101, // lfsr position: 55013 + 0b00001111111010011, // lfsr position: 12 + 0b00010001111101010, // lfsr position: 53239 + 0b00010110101111001, // lfsr position: 37816 + 0b00011010100101110, // lfsr position: 44654 + 0b00011100011010011, // lfsr position: 3468 + 0b00100001011010001, // lfsr position: 70458 + 0b00100101110111101, // lfsr position: 89360 + 0b00101011001101000, // lfsr position: 92851 + 0b00101101101001110, // lfsr position: 36063 + 0b00110011110100111, // lfsr position: 22353 + 0b00110101110100010, // lfsr position: 30922 + 0b00111001000010001, // lfsr position: 80741 + 0b00111110000000010, // lfsr position: 91096 + 0b01000010010011110, // lfsr position: 103112 + 0b01000100111001101, // lfsr position: 67001 + 0b01001010111111110, // lfsr position: 1686 + 0b01001101011101010, // lfsr position: 34337 + 0b01010010110110011, // lfsr position: 32672 + 0b01010101111000100, // lfsr position: 48144 + 0b01011010101000111, // lfsr position: 27478 + 0b01011111010001101, // lfsr position: 68743 + 0b01100010101110011, // lfsr position: 73866 + 0b01100101101011101, // lfsr position: 84182 + 0b01101000000111101, // lfsr position: 42959 + 0b01101111001111100, // lfsr position: 41287 + 0b01110011101101111, // lfsr position: 97942 + 0b01110110111011011, // lfsr position: 24073 + 0b01111011101000010, // lfsr position: 101435 + 0b01111100100101010, // lfsr position: 96244 + 0b10000011110001111, // lfsr position: 12025 + 0b10000101011001101, // lfsr position: 65325 + 0b10001000010110100, // lfsr position: 18916 + 0b10001111011001010, // lfsr position: 60178 + 0b10010001100010011, // lfsr position: 51583 + 0b10010100101001101, // lfsr position: 39533 + 0b10011001100100011, // lfsr position: 61896 + 0b10011101011110111, // lfsr position: 99682 + 0b10100000011001110, // lfsr position: 5144 + 0b10100111010011101, // lfsr position: 58441 + 0b10101011100001000, // lfsr position: 106596 + 0b10101100001111000, // lfsr position: 72188 + 0b10110000111010101, // lfsr position: 20635 + 0b10110110010001101, // lfsr position: 82509 + 0b10111010111010011, // lfsr position: 87663 + 0b10111101001100001, // lfsr position: 63605 + 0b11000001101110011, // lfsr position: 17219 + 0b11000110110101001, // lfsr position: 29185 + 0b11001000110001100, // lfsr position: 49818 + 0b11001101000110000, // lfsr position: 25779 + 0b11010001100110010, // lfsr position: 15463 + 0b11010101001111101, // lfsr position: 13728 + 0b11011000110111101, // lfsr position: 10324 + 0b11011101010100010, // lfsr position: 108305 + 0b11100001000100110, // lfsr position: 75616 + 0b11100110011110001, // lfsr position: 104877 + 0b11101011011011100, // lfsr position: 85903 + 0b11101100011000010, // lfsr position: 6883 + 0b11110011010100010, // lfsr position: 79059 + 0b11110101011010101, // lfsr position: 56706 + 0b11111001001010111, // lfsr position: 94499 + 0b11111101000011000, // lfsr position: 77371 + }, + { + // Polynomial: 20 + 0b00000010110111001, // lfsr position: 25804 + 0b00000110011011000, // lfsr position: 101376 + 0b00001001100011100, // lfsr position: 84232 + 0b00001111000011110, // lfsr position: 39547 + 0b00010000101111001, // lfsr position: 46418 + 0b00010110011001100, // lfsr position: 5130 + 0b00011011011101010, // lfsr position: 6895 + 0b00011111101011010, // lfsr position: 32666 + 0b00100001101101000, // lfsr position: 79073 + 0b00100110001011000, // lfsr position: 1735 + 0b00101000110100100, // lfsr position: 67017 + 0b00101110100011001, // lfsr position: 80768 + 0b00110000001111111, // lfsr position: 97980 + 0b00110100101100100, // lfsr position: 12004 + 0b00111000000101101, // lfsr position: 3447 + 0b00111111011100100, // lfsr position: 77298 + 0b01000001000110101, // lfsr position: 91096 + 0b01000100001001011, // lfsr position: 56703 + 0b01001001110111100, // lfsr position: 96223 + 0b01001100000101101, // lfsr position: 61843 + 0b01010000001110111, // lfsr position: 36112 + 0b01010110000100111, // lfsr position: 41225 + 0b01011011011111100, // lfsr position: 73862 + 0b01011110011001111, // lfsr position: 37809 + 0b01100011001010011, // lfsr position: 48125 + 0b01100100010001111, // lfsr position: 36 + 0b01101000011000010, // lfsr position: 87675 + 0b01101110011101000, // lfsr position: 103123 + 0b01110001101010100, // lfsr position: 60191 + 0b01110111001000000, // lfsr position: 49825 + 0b01111000110100111, // lfsr position: 104850 + 0b01111110011100100, // lfsr position: 18926 + 0b10000010011100110, // lfsr position: 58417 + 0b10000101111100000, // lfsr position: 22325 + 0b10001010101011101, // lfsr position: 53277 + 0b10001111001110110, // lfsr position: 44674 + 0b10010000100110001, // lfsr position: 29217 + 0b10010111011110101, // lfsr position: 85965 + 0b10011001000101010, // lfsr position: 27515 + 0b10011101100001101, // lfsr position: 68719 + 0b10100011000110010, // lfsr position: 63562 + 0b10100101001011111, // lfsr position: 108325 + 0b10101000101110111, // lfsr position: 70459 + 0b10101111000000111, // lfsr position: 42923 + 0b10110010011010011, // lfsr position: 92816 + 0b10110111000000111, // lfsr position: 8585 + 0b10111001100011000, // lfsr position: 13752 + 0b10111111111000100, // lfsr position: 82524 + 0b11000000101011001, // lfsr position: 89402 + 0b11000111011111001, // lfsr position: 24096 + 0b11001011100000001, // lfsr position: 99699 + 0b11001111011110010, // lfsr position: 30934 + 0b11010001011100011, // lfsr position: 65324 + 0b11010101000111110, // lfsr position: 17193 + 0b11011001010001111, // lfsr position: 72181 + 0b11011101101010000, // lfsr position: 75598 + 0b11100011101101101, // lfsr position: 51551 + 0b11100100011010001, // lfsr position: 20614 + 0b11101011111001101, // lfsr position: 94501 + 0b11101110000101000, // lfsr position: 10309 + 0b11110010010111110, // lfsr position: 15446 + 0b11110111000001000, // lfsr position: 106541 + 0b11111011110111011, // lfsr position: 34391 + 0b11111100100110110, // lfsr position: 55000 + }, + { + // Polynomial: 21 + 0b00000011110100001, // lfsr position: 10341 + 0b00000110010100101, // lfsr position: 87613 + 0b00001000011011100, // lfsr position: 97984 + 0b00001110011110101, // lfsr position: 39534 + 0b00010000101100111, // lfsr position: 92810 + 0b00010100111101011, // lfsr position: 13732 + 0b00011010001000111, // lfsr position: 37776 + 0b00011111101111010, // lfsr position: 46370 + 0b00100001110101110, // lfsr position: 25777 + 0b00100100110101010, // lfsr position: 103139 + 0b00101001100110111, // lfsr position: 18897 + 0b00101110100000000, // lfsr position: 60170 + 0b00110011101010001, // lfsr position: 72171 + 0b00110111000010001, // lfsr position: 75660 + 0b00111010000010101, // lfsr position: 12051 + 0b00111101101001010, // lfsr position: 84246 + 0b01000011110011101, // lfsr position: 49843 + 0b01000111111000101, // lfsr position: 65326 + 0b01001011110111011, // lfsr position: 27500 + 0b01001111100111010, // lfsr position: 58424 + 0b01010000101011111, // lfsr position: 44666 + 0b01010111000101110, // lfsr position: 101423 + 0b01011010100010011, // lfsr position: 67016 + 0b01011100101110011, // lfsr position: 85943 + 0b01100000100101000, // lfsr position: 8571 + 0b01100101001011001, // lfsr position: 96249 + 0b01101001001011101, // lfsr position: 3408 + 0b01101110001101000, // lfsr position: 30956 + 0b01110000101010010, // lfsr position: 20613 + 0b01110110110100000, // lfsr position: 51568 + 0b01111011101100000, // lfsr position: 6875 + 0b01111111000010100, // lfsr position: 41266 + 0b10000010111110000, // lfsr position: 17209 + 0b10000111110000100, // lfsr position: 104874 + 0b10001011111110000, // lfsr position: 77353 + 0b10001111010110110, // lfsr position: 79039 + 0b10010001010100000, // lfsr position: 70429 + 0b10010100110111110, // lfsr position: 22358 + 0b10011001110100100, // lfsr position: 108264 + 0b10011101111110111, // lfsr position: 82522 + 0b10100011001111101, // lfsr position: 63582 + 0b10100110110110111, // lfsr position: 36100 + 0b10101000011110110, // lfsr position: 29188 + 0b10101111100110010, // lfsr position: 73931 + 0b10110000101001000, // lfsr position: 34367 + 0b10110100110100101, // lfsr position: 1717 + 0b10111000110111010, // lfsr position: 56754 + 0b10111111011010100, // lfsr position: 15466 + 0b11000011011111000, // lfsr position: 42990 + 0b11000110010101010, // lfsr position: 32636 + 0b11001001101110000, // lfsr position: 91062 + 0b11001100100010110, // lfsr position: 94525 + 0b11010001111101001, // lfsr position: 19 + 0b11010100100011111, // lfsr position: 48132 + 0b11011011010010011, // lfsr position: 5207 + 0b11011100000110010, // lfsr position: 89351 + 0b11100000101001101, // lfsr position: 106550 + 0b11100101010100011, // lfsr position: 24053 + 0b11101001001011100, // lfsr position: 80788 + 0b11101100101101011, // lfsr position: 54980 + 0b11110011110111100, // lfsr position: 68768 + 0b11110100110011100, // lfsr position: 53320 + 0b11111010111100010, // lfsr position: 61925 + 0b11111110011100100, // lfsr position: 99688 + }, + { + // Polynomial: 22 + 0b00000001110101011, // lfsr position: 82509 + 0b00000100100100100, // lfsr position: 15477 + 0b00001000100010111, // lfsr position: 103090 + 0b00001110011011000, // lfsr position: 92774 + 0b00010010101000101, // lfsr position: 61849 + 0b00010111111101110, // lfsr position: 6907 + 0b00011010011100010, // lfsr position: 29225 + 0b00011111001110110, // lfsr position: 8573 + 0b00100011101010000, // lfsr position: 79096 + 0b00100100010111010, // lfsr position: 14 + 0b00101010100001011, // lfsr position: 97948 + 0b00101110000010000, // lfsr position: 94517 + 0b00110000111110111, // lfsr position: 56681 + 0b00110101010001010, // lfsr position: 67049 + 0b00111010001111110, // lfsr position: 80774 + 0b00111101011010110, // lfsr position: 85979 + 0b01000011111101001, // lfsr position: 12036 + 0b01000111001100100, // lfsr position: 77318 + 0b01001000000110110, // lfsr position: 58436 + 0b01001100011110001, // lfsr position: 75624 + 0b01010001010000010, // lfsr position: 68772 + 0b01010100001111101, // lfsr position: 63608 + 0b01011001000001000, // lfsr position: 36087 + 0b01011110110010100, // lfsr position: 72207 + 0b01100001000010100, // lfsr position: 91083 + 0b01100100001011001, // lfsr position: 17230 + 0b01101010110011011, // lfsr position: 27492 + 0b01101111011101101, // lfsr position: 99688 + 0b01110001011110001, // lfsr position: 34361 + 0b01110111100011100, // lfsr position: 5186 + 0b01111011001010101, // lfsr position: 32696 + 0b01111110011110101, // lfsr position: 70444 + 0b10000000110100010, // lfsr position: 44690 + 0b10000110000011111, // lfsr position: 20622 + 0b10001001101011100, // lfsr position: 49852 + 0b10001101001000010, // lfsr position: 106515 + 0b10010011001111011, // lfsr position: 18944 + 0b10010101111010101, // lfsr position: 46427 + 0b10011011010110111, // lfsr position: 1696 + 0b10011111010111010, // lfsr position: 39567 + 0b10100011100111101, // lfsr position: 51534 + 0b10100111111011001, // lfsr position: 22301 + 0b10101001000001111, // lfsr position: 10307 + 0b10101110000001000, // lfsr position: 65326 + 0b10110010110110100, // lfsr position: 60108 + 0b10110101000111010, // lfsr position: 30938 + 0b10111001000010001, // lfsr position: 53267 + 0b10111100001011010, // lfsr position: 89334 + 0b11000001011111011, // lfsr position: 25783 + 0b11000100011000010, // lfsr position: 24058 + 0b11001001101110001, // lfsr position: 48136 + 0b11001101011011100, // lfsr position: 3414 + 0b11010011001101001, // lfsr position: 73909 + 0b11010101011001010, // lfsr position: 87639 + 0b11011010010001101, // lfsr position: 43008 + 0b11011110011100010, // lfsr position: 84233 + 0b11100000110000001, // lfsr position: 108258 + 0b11100111100000011, // lfsr position: 41275 + 0b11101000111110000, // lfsr position: 96227 + 0b11101111101111000, // lfsr position: 54999 + 0b11110010100101100, // lfsr position: 101417 + 0b11110101101100110, // lfsr position: 13766 + 0b11111010010010000, // lfsr position: 104835 + 0b11111100101010000, // lfsr position: 37799 + }, + { + // Polynomial: 23 + 0b00000011011111100, // lfsr position: 58414 + 0b00000101011111100, // lfsr position: 70453 + 0b00001010011001000, // lfsr position: 108296 + 0b00001110001100111, // lfsr position: 24048 + 0b00010000100100001, // lfsr position: 49876 + 0b00010101101101110, // lfsr position: 85902 + 0b00011000111111001, // lfsr position: 32633 + 0b00011110101001000, // lfsr position: 39519 + 0b00100000101111000, // lfsr position: 41208 + 0b00100110100000001, // lfsr position: 77326 + 0b00101010110111100, // lfsr position: 92795 + 0b00101100001000110, // lfsr position: 18926 + 0b00110001111000001, // lfsr position: 22354 + 0b00110100010100010, // lfsr position: 89368 + 0b00111001011010101, // lfsr position: 94522 + 0b00111111001110011, // lfsr position: 1729 + 0b01000010100110011, // lfsr position: 96250 + 0b01000110000010001, // lfsr position: 63606 + 0b01001011111010001, // lfsr position: 61899 + 0b01001100110111010, // lfsr position: 54975 + 0b01010001111110010, // lfsr position: 99676 + 0b01010110101111011, // lfsr position: 80772 + 0b01011011110001001, // lfsr position: 17 + 0b01011110000011001, // lfsr position: 53237 + 0b01100000010000111, // lfsr position: 15454 + 0b01100111000100110, // lfsr position: 65304 + 0b01101001111000011, // lfsr position: 10304 + 0b01101111000111110, // lfsr position: 25795 + 0b01110010111100010, // lfsr position: 101385 + 0b01110101010101101, // lfsr position: 75595 + 0b01111000011100000, // lfsr position: 48079 + 0b01111111010001001, // lfsr position: 44689 + 0b10000010110111011, // lfsr position: 82508 + 0b10000111111101101, // lfsr position: 34394 + 0b10001000011110010, // lfsr position: 87656 + 0b10001101100100100, // lfsr position: 29189 + 0b10010011110100110, // lfsr position: 84200 + 0b10010101110111101, // lfsr position: 12031 + 0b10011010110010101, // lfsr position: 17186 + 0b10011100011101011, // lfsr position: 72232 + 0b10100010100011000, // lfsr position: 3461 + 0b10100101101100001, // lfsr position: 30896 + 0b10101000011100010, // lfsr position: 13751 + 0b10101111000001011, // lfsr position: 46408 + 0b10110000111110110, // lfsr position: 8589 + 0b10110111101011010, // lfsr position: 106596 + 0b10111010000101101, // lfsr position: 79079 + 0b10111100010111000, // lfsr position: 36088 + 0b11000010100111010, // lfsr position: 56754 + 0b11000110100100001, // lfsr position: 51607 + 0b11001011010111001, // lfsr position: 42977 + 0b11001110111011011, // lfsr position: 104823 + 0b11010001101011010, // lfsr position: 68771 + 0b11010100000110110, // lfsr position: 73894 + 0b11011010101101000, // lfsr position: 66992 + 0b11011111011011010, // lfsr position: 103153 + 0b11100000001010011, // lfsr position: 5166 + 0b11100110111110000, // lfsr position: 91071 + 0b11101000101100010, // lfsr position: 60145 + 0b11101100001101010, // lfsr position: 6888 + 0b11110011111011100, // lfsr position: 37812 + 0b11110101110111100, // lfsr position: 97942 + 0b11111010010011001, // lfsr position: 20627 + 0b11111100010110100, // lfsr position: 27485 + }, + { + // Polynomial: 24 + 0b00000000010101110, // lfsr position: 94577 + 0b00000111000000110, // lfsr position: 11 + 0b00001011111001001, // lfsr position: 44702 + 0b00001111001100010, // lfsr position: 17189 + 0b00010010000110111, // lfsr position: 91089 + 0b00010111111011011, // lfsr position: 58442 + 0b00011011010001000, // lfsr position: 67054 + 0b00011100001110011, // lfsr position: 96282 + 0b00100010010001111, // lfsr position: 34380 + 0b00100111110010101, // lfsr position: 12005 + 0b00101010011101010, // lfsr position: 53265 + 0b00101101011011101, // lfsr position: 39544 + 0b00110010100100010, // lfsr position: 61894 + 0b00110100111000101, // lfsr position: 20624 + 0b00111010111111000, // lfsr position: 103132 + 0b00111111101110110, // lfsr position: 48101 + 0b01000011101000010, // lfsr position: 85935 + 0b01000101010000111, // lfsr position: 79022 + 0b01001000000010000, // lfsr position: 108270 + 0b01001111001011011, // lfsr position: 3408 + 0b01010000100110111, // lfsr position: 32666 + 0b01010101011111110, // lfsr position: 42971 + 0b01011010001101111, // lfsr position: 106553 + 0b01011101110000101, // lfsr position: 10344 + 0b01100000011001000, // lfsr position: 37772 + 0b01100100011100110, // lfsr position: 6874 + 0b01101011001110110, // lfsr position: 104885 + 0b01101111110000001, // lfsr position: 8587 + 0b01110010111010000, // lfsr position: 97983 + 0b01110111101100011, // lfsr position: 80774 + 0b01111011000001011, // lfsr position: 49821 + 0b01111101100110000, // lfsr position: 46390 + 0b10000001110111100, // lfsr position: 77342 + 0b10000111010011000, // lfsr position: 51538 + 0b10001001010111110, // lfsr position: 29220 + 0b10001101101100101, // lfsr position: 101409 + 0b10010001010101010, // lfsr position: 68779 + 0b10010100000000110, // lfsr position: 13713 + 0b10011010011011011, // lfsr position: 75627 + 0b10011101111000010, // lfsr position: 15471 + 0b10100000100000100, // lfsr position: 70424 + 0b10100111110101110, // lfsr position: 1725 + 0b10101000100110000, // lfsr position: 41240 + 0b10101111001101110, // lfsr position: 87646 + 0b10110001110111111, // lfsr position: 18913 + 0b10110110011111111, // lfsr position: 82511 + 0b10111001001010110, // lfsr position: 27535 + 0b10111110011100100, // lfsr position: 99668 + 0b11000000110110011, // lfsr position: 89386 + 0b11000100110000001, // lfsr position: 73904 + 0b11001000010000010, // lfsr position: 25781 + 0b11001101101111101, // lfsr position: 60153 + 0b11010001100001000, // lfsr position: 92807 + 0b11010101111011101, // lfsr position: 72179 + 0b11011011110010011, // lfsr position: 30935 + 0b11011110101100010, // lfsr position: 36062 + 0b11100001100001101, // lfsr position: 5156 + 0b11100100001110000, // lfsr position: 22333 + 0b11101011001110111, // lfsr position: 55019 + 0b11101100001110001, // lfsr position: 56716 + 0b11110011000001100, // lfsr position: 65281 + 0b11110100110010001, // lfsr position: 63631 + 0b11111000100010011, // lfsr position: 24058 + 0b11111100111110101, // lfsr position: 84221 + }, + { + // Polynomial: 25 + 0b00000001010110110, // lfsr position: 30946 + 0b00000100001001001, // lfsr position: 103087 + 0b00001001101000110, // lfsr position: 106578 + 0b00001100100101101, // lfsr position: 36084 + 0b00010000001011100, // lfsr position: 92818 + 0b00010110101110111, // lfsr position: 1704 + 0b00011011111001111, // lfsr position: 48127 + 0b00011111000010011, // lfsr position: 67021 + 0b00100010001000101, // lfsr position: 72206 + 0b00100100101111011, // lfsr position: 97986 + 0b00101011001001011, // lfsr position: 14 + 0b00101110110001110, // lfsr position: 101389 + 0b00110011100101010, // lfsr position: 12033 + 0b00110111101110100, // lfsr position: 24079 + 0b00111010011000001, // lfsr position: 44700 + 0b00111101010011000, // lfsr position: 18898 + 0b01000011101011001, // lfsr position: 91082 + 0b01000101011001111, // lfsr position: 77315 + 0b01001011111100100, // lfsr position: 51600 + 0b01001111001011111, // lfsr position: 108269 + 0b01010000110000000, // lfsr position: 82477 + 0b01010111110001010, // lfsr position: 80793 + 0b01011000100111010, // lfsr position: 8608 + 0b01011110010101101, // lfsr position: 46370 + 0b01100011111101000, // lfsr position: 25744 + 0b01100110100101001, // lfsr position: 70503 + 0b01101000100011001, // lfsr position: 75607 + 0b01101100100001100, // lfsr position: 15492 + 0b01110010110110001, // lfsr position: 53253 + 0b01110101110001011, // lfsr position: 39566 + 0b01111001110011100, // lfsr position: 58438 + 0b01111101111010111, // lfsr position: 85934 + 0b10000001000111101, // lfsr position: 94540 + 0b10000101001100100, // lfsr position: 65317 + 0b10001000000001010, // lfsr position: 22333 + 0b10001111000011010, // lfsr position: 61903 + 0b10010001010111101, // lfsr position: 17171 + 0b10010100000110001, // lfsr position: 13740 + 0b10011001001111010, // lfsr position: 87648 + 0b10011100111000101, // lfsr position: 49863 + 0b10100001101100011, // lfsr position: 10311 + 0b10100100010011010, // lfsr position: 63567 + 0b10101000011110101, // lfsr position: 20660 + 0b10101111000010000, // lfsr position: 32677 + 0b10110010100001000, // lfsr position: 29226 + 0b10110111101001100, // lfsr position: 68752 + 0b10111010000101001, // lfsr position: 73915 + 0b10111111011011011, // lfsr position: 42982 + 0b11000000100101011, // lfsr position: 99692 + 0b11000100100101011, // lfsr position: 27477 + 0b11001010110001110, // lfsr position: 37807 + 0b11001101101001000, // lfsr position: 41245 + 0b11010000000100101, // lfsr position: 104878 + 0b11010101001000110, // lfsr position: 6869 + 0b11011000001110010, // lfsr position: 60155 + 0b11011110110110011, // lfsr position: 5131 + 0b11100001010100001, // lfsr position: 79053 + 0b11100101100111010, // lfsr position: 56721 + 0b11101011111100111, // lfsr position: 96248 + 0b11101100101011111, // lfsr position: 84259 + 0b11110010101001100, // lfsr position: 89417 + 0b11110110110101100, // lfsr position: 34385 + 0b11111000011011011, // lfsr position: 3452 + 0b11111101111101100, // lfsr position: 55011 + }, + { + // Polynomial: 26 + 0b00000001100000011, // lfsr position: 92853 + 0b00000110101001011, // lfsr position: 96241 + 0b00001010010100001, // lfsr position: 10298 + 0b00001101110000000, // lfsr position: 13775 + 0b00010011000111111, // lfsr position: 37820 + 0b00010101110010110, // lfsr position: 17226 + 0b00011000001100100, // lfsr position: 108323 + 0b00011101101010111, // lfsr position: 103135 + 0b00100010111110110, // lfsr position: 48105 + 0b00100101100100011, // lfsr position: 14 + 0b00101000100111100, // lfsr position: 63610 + 0b00101110101001110, // lfsr position: 79065 + 0b00110001000011010, // lfsr position: 54973 + 0b00110101011010000, // lfsr position: 70451 + 0b00111000001001011, // lfsr position: 41272 + 0b00111100100000001, // lfsr position: 49816 + 0b01000000101001110, // lfsr position: 3390 + 0b01000101100101001, // lfsr position: 42936 + 0b01001011100111101, // lfsr position: 91143 + 0b01001111111000110, // lfsr position: 56742 + 0b01010011010010010, // lfsr position: 24064 + 0b01010100111000101, // lfsr position: 12078 + 0b01011001101011000, // lfsr position: 60193 + 0b01011111100010110, // lfsr position: 5110 + 0b01100000111100101, // lfsr position: 30954 + 0b01100101010111111, // lfsr position: 46393 + 0b01101000101011000, // lfsr position: 80741 + 0b01101110100100100, // lfsr position: 27459 + 0b01110001110000001, // lfsr position: 34374 + 0b01110110010100011, // lfsr position: 15466 + 0b01111000101011010, // lfsr position: 61853 + 0b01111111101001101, // lfsr position: 89369 + 0b10000000100011101, // lfsr position: 8633 + 0b10000111110101000, // lfsr position: 51535 + 0b10001001010010110, // lfsr position: 101372 + 0b10001110110100000, // lfsr position: 85918 + 0b10010000111010100, // lfsr position: 36072 + 0b10010111010110101, // lfsr position: 84210 + 0b10011000110111010, // lfsr position: 6864 + 0b10011110010001101, // lfsr position: 44708 + 0b10100010111010101, // lfsr position: 99695 + 0b10100111111011111, // lfsr position: 32654 + 0b10101001101101001, // lfsr position: 72206 + 0b10101111000101100, // lfsr position: 18880 + 0b10110011110111101, // lfsr position: 73862 + 0b10110110111101111, // lfsr position: 75624 + 0b10111000111010110, // lfsr position: 25786 + 0b10111101000101011, // lfsr position: 67049 + 0b11000000111110000, // lfsr position: 22391 + 0b11000110101101100, // lfsr position: 29197 + 0b11001011011010111, // lfsr position: 53265 + 0b11001101001011010, // lfsr position: 1713 + 0b11010011011011110, // lfsr position: 65319 + 0b11010111101000010, // lfsr position: 77366 + 0b11011011111110000, // lfsr position: 68753 + 0b11011111010001110, // lfsr position: 39501 + 0b11100010010010000, // lfsr position: 94532 + 0b11100101010001011, // lfsr position: 58457 + 0b11101010111000000, // lfsr position: 104802 + 0b11101110111010010, // lfsr position: 82537 + 0b11110001101100101, // lfsr position: 97991 + 0b11110100111001100, // lfsr position: 106599 + 0b11111001101011000, // lfsr position: 87643 + 0b11111101001111100, // lfsr position: 20622 + }, + { + // Polynomial: 27 + 0b00000010000011110, // lfsr position: 60151 + 0b00000110111011000, // lfsr position: 41273 + 0b00001011110111001, // lfsr position: 25766 + 0b00001110000011111, // lfsr position: 58435 + 0b00010000111000011, // lfsr position: 70479 + 0b00010111110000001, // lfsr position: 13 + 0b00011011000010010, // lfsr position: 73918 + 0b00011111001010010, // lfsr position: 68778 + 0b00100011111111011, // lfsr position: 82522 + 0b00100101101010001, // lfsr position: 49870 + 0b00101011010110111, // lfsr position: 84213 + 0b00101101011011011, // lfsr position: 36098 + 0b00110001001111100, // lfsr position: 85912 + 0b00110110001100110, // lfsr position: 13755 + 0b00111000010000101, // lfsr position: 65294 + 0b00111111100111011, // lfsr position: 29214 + 0b01000000100111011, // lfsr position: 108285 + 0b01000111011110100, // lfsr position: 24055 + 0b01001000000010101, // lfsr position: 79088 + 0b01001110011111100, // lfsr position: 106571 + 0b01010010011001100, // lfsr position: 54999 + 0b01010100110011110, // lfsr position: 77360 + 0b01011011100010100, // lfsr position: 5190 + 0b01011111000000101, // lfsr position: 63576 + 0b01100001110010111, // lfsr position: 61874 + 0b01100101100001110, // lfsr position: 1711 + 0b01101000111111010, // lfsr position: 103112 + 0b01101100110100110, // lfsr position: 104879 + 0b01110000011011001, // lfsr position: 15513 + 0b01110110100110110, // lfsr position: 96237 + 0b01111001001110101, // lfsr position: 91085 + 0b01111110111010001, // lfsr position: 34361 + 0b10000011000111011, // lfsr position: 6849 + 0b10000101011001110, // lfsr position: 20618 + 0b10001010000010011, // lfsr position: 97968 + 0b10001101100001001, // lfsr position: 30973 + 0b10010010110010000, // lfsr position: 53300 + 0b10010110101100010, // lfsr position: 46408 + 0b10011010011100011, // lfsr position: 10316 + 0b10011110010000001, // lfsr position: 27469 + 0b10100000100000111, // lfsr position: 22360 + 0b10100111001101101, // lfsr position: 80776 + 0b10101000000001110, // lfsr position: 3430 + 0b10101111111011000, // lfsr position: 32665 + 0b10110010011100110, // lfsr position: 12019 + 0b10110101010001110, // lfsr position: 37769 + 0b10111011001001111, // lfsr position: 56724 + 0b10111100101000001, // lfsr position: 51548 + 0b11000001010001011, // lfsr position: 92781 + 0b11000110011000001, // lfsr position: 44721 + 0b11001011011111110, // lfsr position: 101414 + 0b11001111011110110, // lfsr position: 94541 + 0b11010000001011101, // lfsr position: 89372 + 0b11010111110111011, // lfsr position: 87652 + 0b11011010010011010, // lfsr position: 17170 + 0b11011111100010011, // lfsr position: 42970 + 0b11100000101100010, // lfsr position: 99705 + 0b11100111110011000, // lfsr position: 18907 + 0b11101010100001101, // lfsr position: 75625 + 0b11101110001011001, // lfsr position: 67020 + 0b11110011000100100, // lfsr position: 8597 + 0b11110110100011010, // lfsr position: 48171 + 0b11111011000000001, // lfsr position: 39532 + 0b11111101100000000, // lfsr position: 72153 + }, + { + // Polynomial: 28 + 0b00000011101101101, // lfsr position: 15434 + 0b00000111110001010, // lfsr position: 103095 + 0b00001001100000101, // lfsr position: 39544 + 0b00001111100001000, // lfsr position: 12019 + 0b00010011111100000, // lfsr position: 68773 + 0b00010101000111100, // lfsr position: 27501 + 0b00011010100001111, // lfsr position: 94495 + 0b00011111011101000, // lfsr position: 46372 + 0b00100000011111000, // lfsr position: 10307 + 0b00100110100010101, // lfsr position: 72209 + 0b00101011001111100, // lfsr position: 29210 + 0b00101111011101101, // lfsr position: 65309 + 0b00110011110000100, // lfsr position: 87633 + 0b00110101010111010, // lfsr position: 20612 + 0b00111001111100010, // lfsr position: 34380 + 0b00111101011101100, // lfsr position: 24096 + 0b01000011110000010, // lfsr position: 6847 + 0b01000110110110101, // lfsr position: 32635 + 0b01001010110111100, // lfsr position: 48134 + 0b01001100100101100, // lfsr position: 80810 + 0b01010011010100011, // lfsr position: 104870 + 0b01010111101111100, // lfsr position: 82513 + 0b01011001001100101, // lfsr position: 13763 + 0b01011111011001101, // lfsr position: 70477 + 0b01100010111111110, // lfsr position: 99695 + 0b01100100010111000, // lfsr position: 53263 + 0b01101011111001011, // lfsr position: 44721 + 0b01101111110001100, // lfsr position: 63637 + 0b01110010111111110, // lfsr position: 60124 + 0b01110101000011101, // lfsr position: 27 + 0b01111001010011101, // lfsr position: 25769 + 0b01111111001000010, // lfsr position: 67038 + 0b10000001110001111, // lfsr position: 75585 + 0b10000111110111011, // lfsr position: 89350 + 0b10001001101110110, // lfsr position: 56679 + 0b10001100111111110, // lfsr position: 84206 + 0b10010000001001101, // lfsr position: 92811 + 0b10010111001111011, // lfsr position: 42960 + 0b10011000010110110, // lfsr position: 3465 + 0b10011100001001011, // lfsr position: 108250 + 0b10100000000000101, // lfsr position: 5152 + 0b10100110111001000, // lfsr position: 98010 + 0b10101011111001111, // lfsr position: 30893 + 0b10101110101010011, // lfsr position: 73885 + 0b10110000010010011, // lfsr position: 96217 + 0b10110111100011111, // lfsr position: 1699 + 0b10111000111101111, // lfsr position: 36062 + 0b10111110001000010, // lfsr position: 91063 + 0b11000010111111000, // lfsr position: 77378 + 0b11000101111101001, // lfsr position: 79053 + 0b11001000100101110, // lfsr position: 101423 + 0b11001100000100111, // lfsr position: 58452 + 0b11010010000111100, // lfsr position: 37796 + 0b11010100010001000, // lfsr position: 18913 + 0b11011010011110100, // lfsr position: 106543 + 0b11011101001111101, // lfsr position: 85903 + 0b11100011010111010, // lfsr position: 8598 + 0b11100101010100000, // lfsr position: 22353 + 0b11101000100110010, // lfsr position: 55047 + 0b11101101111001100, // lfsr position: 17159 + 0b11110010100110000, // lfsr position: 41262 + 0b11110110001111001, // lfsr position: 61912 + 0b11111001101100010, // lfsr position: 51539 + 0b11111100010111000, // lfsr position: 49808 + }, + { + // Polynomial: 29 + 0b00000010000111000, // lfsr position: 82506 + 0b00000100111010001, // lfsr position: 96232 + 0b00001010011010001, // lfsr position: 36083 + 0b00001100111001101, // lfsr position: 20661 + 0b00010001011000101, // lfsr position: 15465 + 0b00010111010001100, // lfsr position: 43 + 0b00011011000000111, // lfsr position: 89388 + 0b00011110011011010, // lfsr position: 70459 + 0b00100011101100100, // lfsr position: 99722 + 0b00100110101010011, // lfsr position: 87637 + 0b00101010011101110, // lfsr position: 79022 + 0b00101111000100011, // lfsr position: 6888 + 0b00110000000111110, // lfsr position: 103079 + 0b00110100111100100, // lfsr position: 13704 + 0b00111011111010000, // lfsr position: 37808 + 0b00111100011101101, // lfsr position: 29259 + 0b01000000111110100, // lfsr position: 32655 + 0b01000111111011011, // lfsr position: 80796 + 0b01001011111111011, // lfsr position: 46445 + 0b01001100011101011, // lfsr position: 18863 + 0b01010001001010011, // lfsr position: 60187 + 0b01010110101100001, // lfsr position: 73913 + 0b01011001011110000, // lfsr position: 77348 + 0b01011110110001111, // lfsr position: 44718 + 0b01100011101110001, // lfsr position: 24043 + 0b01100111101011110, // lfsr position: 53264 + 0b01101011001011011, // lfsr position: 5170 + 0b01101100110101000, // lfsr position: 56714 + 0b01110001000101010, // lfsr position: 58428 + 0b01110101001100000, // lfsr position: 61904 + 0b01111011001001101, // lfsr position: 27522 + 0b01111111010101111, // lfsr position: 92795 + 0b10000011111110010, // lfsr position: 48114 + 0b10000111011010001, // lfsr position: 94542 + 0b10001001111101101, // lfsr position: 63592 + 0b10001101000010000, // lfsr position: 42954 + 0b10010010001111110, // lfsr position: 75668 + 0b10010111100100101, // lfsr position: 104842 + 0b10011000010110111, // lfsr position: 106529 + 0b10011100101010001, // lfsr position: 10318 + 0b10100000111101110, // lfsr position: 17161 + 0b10100101001000100, // lfsr position: 84221 + 0b10101001001000001, // lfsr position: 11991 + 0b10101111100100000, // lfsr position: 108285 + 0b10110001011111011, // lfsr position: 30927 + 0b10110111000101000, // lfsr position: 91052 + 0b10111011001011010, // lfsr position: 97996 + 0b10111101001110011, // lfsr position: 25793 + 0b11000010100101000, // lfsr position: 49824 + 0b11000111111010000, // lfsr position: 22301 + 0b11001000001110110, // lfsr position: 3469 + 0b11001101001000111, // lfsr position: 39544 + 0b11010010101100011, // lfsr position: 8612 + 0b11010100101101111, // lfsr position: 67015 + 0b11011001000010111, // lfsr position: 34335 + 0b11011111111100001, // lfsr position: 41233 + 0b11100010000110000, // lfsr position: 55011 + 0b11100101110001110, // lfsr position: 65336 + 0b11101000000111110, // lfsr position: 101392 + 0b11101111110101110, // lfsr position: 72201 + 0b11110000000100111, // lfsr position: 51524 + 0b11110110101111110, // lfsr position: 85939 + 0b11111000000011010, // lfsr position: 1731 + 0b11111101001001100, // lfsr position: 68731 + }, + { + // Polynomial: 30 + 0b00000011100011111, // lfsr position: 22385 + 0b00000100001010101, // lfsr position: 11 + 0b00001001101011101, // lfsr position: 106601 + 0b00001101101000011, // lfsr position: 27537 + 0b00010010001011010, // lfsr position: 36101 + 0b00010101101000011, // lfsr position: 97930 + 0b00011010001101110, // lfsr position: 30961 + 0b00011111110111100, // lfsr position: 1708 + 0b00100010111110101, // lfsr position: 72232 + 0b00100111100011010, // lfsr position: 48142 + 0b00101010010010010, // lfsr position: 10306 + 0b00101101000111011, // lfsr position: 17230 + 0b00110001110100000, // lfsr position: 67034 + 0b00110100111110011, // lfsr position: 3444 + 0b00111011110010010, // lfsr position: 101398 + 0b00111100010100000, // lfsr position: 96221 + 0b01000011010100101, // lfsr position: 103155 + 0b01000111110101000, // lfsr position: 49868 + 0b01001000111000011, // lfsr position: 61891 + 0b01001101001110111, // lfsr position: 92855 + 0b01010010111101111, // lfsr position: 75670 + 0b01010111100110000, // lfsr position: 70462 + 0b01011001110101110, // lfsr position: 68751 + 0b01011100101100000, // lfsr position: 41211 + 0b01100011101001101, // lfsr position: 65326 + 0b01100100001010110, // lfsr position: 39522 + 0b01101001110101111, // lfsr position: 58428 + 0b01101110100010011, // lfsr position: 51588 + 0b01110001001111001, // lfsr position: 8634 + 0b01110110000010111, // lfsr position: 46357 + 0b01111010000101110, // lfsr position: 94517 + 0b01111110001110000, // lfsr position: 63558 + 0b10000010011101011, // lfsr position: 37805 + 0b10000111110000001, // lfsr position: 73921 + 0b10001000111000101, // lfsr position: 15477 + 0b10001100110100111, // lfsr position: 87660 + 0b10010001111111101, // lfsr position: 12021 + 0b10010110110001100, // lfsr position: 56684 + 0b10011001110110100, // lfsr position: 42990 + 0b10011100010000111, // lfsr position: 44661 + 0b10100011000010010, // lfsr position: 32661 + 0b10100100010100011, // lfsr position: 25762 + 0b10101001111000010, // lfsr position: 84205 + 0b10101110010001011, // lfsr position: 85968 + 0b10110011100101001, // lfsr position: 99697 + 0b10110100101111100, // lfsr position: 6908 + 0b10111000100010011, // lfsr position: 108262 + 0b10111110001110000, // lfsr position: 89337 + 0b11000000000011011, // lfsr position: 20598 + 0b11000110010100011, // lfsr position: 5175 + 0b11001001001001001, // lfsr position: 60183 + 0b11001101110101101, // lfsr position: 24022 + 0b11010000101001000, // lfsr position: 79043 + 0b11010101010011100, // lfsr position: 82504 + 0b11011011011101011, // lfsr position: 80786 + 0b11011100011010010, // lfsr position: 55031 + 0b11100000001001000, // lfsr position: 18932 + 0b11100111010101010, // lfsr position: 29242 + 0b11101000100111001, // lfsr position: 104876 + 0b11101110011100010, // lfsr position: 13735 + 0b11110001111010100, // lfsr position: 91066 + 0b11110110101010100, // lfsr position: 53279 + 0b11111011001001011, // lfsr position: 34406 + 0b11111100111001001, // lfsr position: 77335 + }, + { + // Polynomial: 31 + 0b00000010101101100, // lfsr position: 72162 + 0b00000101010111100, // lfsr position: 22338 + 0b00001001101011101, // lfsr position: 49849 + 0b00001110010001010, // lfsr position: 25776 + 0b00010000111100100, // lfsr position: 82504 + 0b00010100101000101, // lfsr position: 42968 + 0b00011000011010010, // lfsr position: 60180 + 0b00011111101001110, // lfsr position: 39526 + 0b00100001101101000, // lfsr position: 70436 + 0b00100111111101100, // lfsr position: 3444 + 0b00101000011100011, // lfsr position: 30925 + 0b00101101011010100, // lfsr position: 56741 + 0b00110000111110011, // lfsr position: 8591 + 0b00110111010101000, // lfsr position: 101402 + 0b00111000010101010, // lfsr position: 103151 + 0b00111110111011111, // lfsr position: 5135 + 0b01000001000111010, // lfsr position: 32660 + 0b01000110111000010, // lfsr position: 36113 + 0b01001011001101011, // lfsr position: 65295 + 0b01001111100010000, // lfsr position: 1714 + 0b01010000100010110, // lfsr position: 67026 + 0b01010110001100110, // lfsr position: 106559 + 0b01011001101100001, // lfsr position: 80787 + 0b01011100110001110, // lfsr position: 104873 + 0b01100011001001010, // lfsr position: 68762 + 0b01100110110100011, // lfsr position: 43 + 0b01101011001000110, // lfsr position: 51552 + 0b01101110010001011, // lfsr position: 92826 + 0b01110011110100000, // lfsr position: 63577 + 0b01110101111111001, // lfsr position: 44645 + 0b01111000101110100, // lfsr position: 108245 + 0b01111101100010010, // lfsr position: 27486 + 0b10000010011011100, // lfsr position: 89379 + 0b10000101101111100, // lfsr position: 18907 + 0b10001000110001010, // lfsr position: 46407 + 0b10001110000000110, // lfsr position: 17204 + 0b10010010111110001, // lfsr position: 12036 + 0b10010110100111110, // lfsr position: 97960 + 0b10011001011001000, // lfsr position: 61863 + 0b10011110110010001, // lfsr position: 6863 + 0b10100000100100101, // lfsr position: 85948 + 0b10100100111010000, // lfsr position: 29221 + 0b10101001100000001, // lfsr position: 91094 + 0b10101111001010100, // lfsr position: 10302 + 0b10110010011111100, // lfsr position: 34388 + 0b10110110001011111, // lfsr position: 96267 + 0b10111011001001100, // lfsr position: 48140 + 0b10111111100110101, // lfsr position: 84224 + 0b11000000010100011, // lfsr position: 58470 + 0b11000100011001001, // lfsr position: 54969 + 0b11001000011001011, // lfsr position: 73927 + 0b11001101110111010, // lfsr position: 75637 + 0b11010011110011000, // lfsr position: 37812 + 0b11010100101100001, // lfsr position: 79060 + 0b11011000000000100, // lfsr position: 77330 + 0b11011110010110101, // lfsr position: 15453 + 0b11100010001000101, // lfsr position: 13780 + 0b11100100100000111, // lfsr position: 94529 + 0b11101010110011110, // lfsr position: 20634 + 0b11101111101111111, // lfsr position: 87695 + 0b11110010000011101, // lfsr position: 24035 + 0b11110111001010001, // lfsr position: 53307 + 0b11111010000011011, // lfsr position: 99680 + 0b11111100111011101, // lfsr position: 41223 + }, +}; + +static const uint32_t _lfsr_index_table[LH2_POLYNOMIAL_COUNT][NUM_LSFR_COUNT_CHECKPOINTS] = { + { + // Polynomial: 0 + 104891, // lfsr bits: 0b00000011000101111 + 22375, // lfsr bits: 0b00000111011010111 + 89380, // lfsr bits: 0b00001001000111101 + 82546, // lfsr bits: 0b00001101010111100 + 72190, // lfsr bits: 0b00010011100001100 + 94537, // lfsr bits: 0b00010111101101110 + 17, // lfsr bits: 0b00011011000100100 + 12032, // lfsr bits: 0b00011100110001011 + 34419, // lfsr bits: 0b00100001010001101 + 56719, // lfsr bits: 0b00100110010100011 + 29233, // lfsr bits: 0b00101010000111000 + 17173, // lfsr bits: 0b00101110100100001 + 20667, // lfsr bits: 0b00110011011101001 + 77346, // lfsr bits: 0b00110110010000010 + 44727, // lfsr bits: 0b00111001011011100 + 3402, // lfsr bits: 0b00111110100101011 + 49868, // lfsr bits: 0b01000001011100111 + 10311, // lfsr bits: 0b01000100100110101 + 37782, // lfsr bits: 0b01001011101110000 + 18911, // lfsr bits: 0b01001110010100111 + 67022, // lfsr bits: 0b01010000000101101 + 73904, // lfsr bits: 0b01010100110000100 + 58419, // lfsr bits: 0b01011000000001010 + 103115, // lfsr bits: 0b01011111011110110 + 36092, // lfsr bits: 0b01100010111011011 + 65320, // lfsr bits: 0b01100100100000101 + 41248, // lfsr bits: 0b01101011000110101 + 32679, // lfsr bits: 0b01101100110110011 + 106588, // lfsr bits: 0b01110001000100001 + 1726, // lfsr bits: 0b01110111101000100 + 6841, // lfsr bits: 0b01111000111000001 + 75584, // lfsr bits: 0b01111100100100001 + 101425, // lfsr bits: 0b10000001011110100 + 24050, // lfsr bits: 0b10000110111101010 + 15502, // lfsr bits: 0b10001000110011011 + 42982, // lfsr bits: 0b10001101100101011 + 92856, // lfsr bits: 0b10010010100110011 + 5160, // lfsr bits: 0b10010100011011111 + 85898, // lfsr bits: 0b10011000010011110 + 84222, // lfsr bits: 0b10011111111011110 + 27537, // lfsr bits: 0b10100000011111011 + 91095, // lfsr bits: 0b10100110100000110 + 53274, // lfsr bits: 0b10101001011100001 + 70482, // lfsr bits: 0b10101100111101111 + 30938, // lfsr bits: 0b10110000100100100 + 8573, // lfsr bits: 0b10110100111000111 + 87677, // lfsr bits: 0b10111000101011110 + 68731, // lfsr bits: 0b10111111100010010 + 97961, // lfsr bits: 0b11000001110100011 + 55047, // lfsr bits: 0b11000110011101001 + 80804, // lfsr bits: 0b11001000011000011 + 39509, // lfsr bits: 0b11001110101000001 + 60154, // lfsr bits: 0b11010010000000111 + 25783, // lfsr bits: 0b11010101110111100 + 46401, // lfsr bits: 0b11011011111001100 + 61913, // lfsr bits: 0b11011101101100101 + 96262, // lfsr bits: 0b11100000101000010 + 13740, // lfsr bits: 0b11100101010010101 + 48081, // lfsr bits: 0b11101001111110011 + 79041, // lfsr bits: 0b11101111010111100 + 108275, // lfsr bits: 0b11110001100100011 + 63605, // lfsr bits: 0b11110111000100100 + 99663, // lfsr bits: 0b11111001010110111 + 51548, // lfsr bits: 0b11111100101011100 + }, + { + // Polynomial: 1 + 99695, // lfsr bits: 0b00000000000001100 + 10285, // lfsr bits: 0b00000110100010001 + 108302, // lfsr bits: 0b00001001001000011 + 51581, // lfsr bits: 0b00001111101110101 + 5167, // lfsr bits: 0b00010011001001011 + 82518, // lfsr bits: 0b00010101011101011 + 53274, // lfsr bits: 0b00011000100010110 + 80760, // lfsr bits: 0b00011100000110100 + 91102, // lfsr bits: 0b00100001101011000 + 49833, // lfsr bits: 0b00100110110010101 + 41, // lfsr bits: 0b00101010100011101 + 58429, // lfsr bits: 0b00101111110010011 + 68725, // lfsr bits: 0b00110000110110111 + 67025, // lfsr bits: 0b00110100010010000 + 72157, // lfsr bits: 0b00111010110111110 + 106524, // lfsr bits: 0b00111100100001100 + 36092, // lfsr bits: 0b01000000110111100 + 63595, // lfsr bits: 0b01000111011000111 + 1719, // lfsr bits: 0b01001011010100011 + 13769, // lfsr bits: 0b01001101110111010 + 18869, // lfsr bits: 0b01010010110111100 + 84200, // lfsr bits: 0b01010100100101101 + 42944, // lfsr bits: 0b01011001111001001 + 25773, // lfsr bits: 0b01011110110111011 + 15466, // lfsr bits: 0b01100000100110011 + 22348, // lfsr bits: 0b01100111100000100 + 34345, // lfsr bits: 0b01101001101110111 + 56689, // lfsr bits: 0b01101101011000000 + 32674, // lfsr bits: 0b01110010110000101 + 39529, // lfsr bits: 0b01110101000010001 + 6853, // lfsr bits: 0b01111001101100110 + 73877, // lfsr bits: 0b01111111111111111 + 87694, // lfsr bits: 0b10000011011100101 + 12013, // lfsr bits: 0b10000111111110111 + 94508, // lfsr bits: 0b10001000010111110 + 54972, // lfsr bits: 0b10001111111011010 + 92843, // lfsr bits: 0b10010010111110011 + 60156, // lfsr bits: 0b10010110000111100 + 46425, // lfsr bits: 0b10011011111010100 + 17190, // lfsr bits: 0b10011101110001111 + 103089, // lfsr bits: 0b10100010010011101 + 3455, // lfsr bits: 0b10100101000110001 + 77300, // lfsr bits: 0b10101000011011111 + 96231, // lfsr bits: 0b10101111110001010 + 29251, // lfsr bits: 0b10110001011001010 + 44677, // lfsr bits: 0b10110101010010001 + 37800, // lfsr bits: 0b10111000111111011 + 89396, // lfsr bits: 0b10111100110000111 + 104837, // lfsr bits: 0b11000001110110101 + 27502, // lfsr bits: 0b11000110001100010 + 61887, // lfsr bits: 0b11001011100010100 + 20629, // lfsr bits: 0b11001100011100001 + 70460, // lfsr bits: 0b11010010001010010 + 85904, // lfsr bits: 0b11010100101010101 + 41247, // lfsr bits: 0b11011000100100011 + 8572, // lfsr bits: 0b11011111101011011 + 65298, // lfsr bits: 0b11100010111100100 + 30916, // lfsr bits: 0b11100110101100011 + 101432, // lfsr bits: 0b11101001011101010 + 97989, // lfsr bits: 0b11101110101001011 + 24106, // lfsr bits: 0b11110001100111110 + 75617, // lfsr bits: 0b11110110011011010 + 48153, // lfsr bits: 0b11111010110101001 + 79078, // lfsr bits: 0b11111100001011100 + }, + { + // Polynomial: 2 + 82521, // lfsr bits: 0b00000011110010010 + 32691, // lfsr bits: 0b00000111010111000 + 97970, // lfsr bits: 0b00001001100101101 + 92766, // lfsr bits: 0b00001110000100101 + 39579, // lfsr bits: 0b00010010101101111 + 34363, // lfsr bits: 0b00010111011000110 + 25783, // lfsr bits: 0b00011011010011101 + 61876, // lfsr bits: 0b00011111101101001 + 108264, // lfsr bits: 0b00100001100101100 + 46413, // lfsr bits: 0b00100110000101010 + 30967, // lfsr bits: 0b00101001100100100 + 5154, // lfsr bits: 0b00101101000001100 + 10294, // lfsr bits: 0b00110001101010111 + 72232, // lfsr bits: 0b00110110010101010 + 73918, // lfsr bits: 0b00111010000000111 + 18905, // lfsr bits: 0b00111110110100101 + 3427, // lfsr bits: 0b01000000001100000 + 63593, // lfsr bits: 0b01000110000010100 + 91065, // lfsr bits: 0b01001010001100101 + 106528, // lfsr bits: 0b01001100111101000 + 67049, // lfsr bits: 0b01010010101101000 + 55029, // lfsr bits: 0b01010110111011010 + 85944, // lfsr bits: 0b01011010011001101 + 84219, // lfsr bits: 0b01011101110011100 + 13714, // lfsr bits: 0b01100001110011101 + 87659, // lfsr bits: 0b01100111010001111 + 94578, // lfsr bits: 0b01101010101100101 + 51540, // lfsr bits: 0b01101110110100110 + 43004, // lfsr bits: 0b01110010001010110 + 89371, // lfsr bits: 0b01110110000110100 + 49819, // lfsr bits: 0b01111010101000101 + 70447, // lfsr bits: 0b01111101011101110 + 60183, // lfsr bits: 0b10000010101001101 + 75646, // lfsr bits: 0b10000100110001011 + 79069, // lfsr bits: 0b10001010101001000 + 8579, // lfsr bits: 0b10001101110111000 + 101409, // lfsr bits: 0b10010000110001000 + 96245, // lfsr bits: 0b10010110100100100 + 1725, // lfsr bits: 0b10011000101111111 + 29219, // lfsr bits: 0b10011110010101000 + 37781, // lfsr bits: 0b10100010000001001 + 17, // lfsr bits: 0b10100100000001101 + 103108, // lfsr bits: 0b10101001010000000 + 68750, // lfsr bits: 0b10101110000101110 + 58473, // lfsr bits: 0b10110001101110011 + 24073, // lfsr bits: 0b10110101111101110 + 41259, // lfsr bits: 0b10111010100001000 + 36073, // lfsr bits: 0b10111111001111001 + 15458, // lfsr bits: 0b11000011100110100 + 53277, // lfsr bits: 0b11000110111110010 + 77355, // lfsr bits: 0b11001000011000011 + 44717, // lfsr bits: 0b11001111011000001 + 20596, // lfsr bits: 0b11010001100010000 + 99670, // lfsr bits: 0b11010111110000001 + 65279, // lfsr bits: 0b11011000001001111 + 104895, // lfsr bits: 0b11011110101100100 + 22362, // lfsr bits: 0b11100001110000011 + 56765, // lfsr bits: 0b11100110000101010 + 48136, // lfsr bits: 0b11101011110110110 + 27500, // lfsr bits: 0b11101100001111100 + 12050, // lfsr bits: 0b11110001001010100 + 6856, // lfsr bits: 0b11110100011010001 + 80759, // lfsr bits: 0b11111010000010011 + 17210, // lfsr bits: 0b11111100100101110 + }, + { + // Polynomial: 3 + 10313, // lfsr bits: 0b00000000011001011 + 72196, // lfsr bits: 0b00000111000010100 + 41232, // lfsr bits: 0b00001011000011011 + 42977, // lfsr bits: 0b00001100011111101 + 61847, // lfsr bits: 0b00010010001111010 + 65302, // lfsr bits: 0b00010101000011001 + 99687, // lfsr bits: 0b00011010010000110 + 24044, // lfsr bits: 0b00011111001100010 + 3424, // lfsr bits: 0b00100001001100011 + 101405, // lfsr bits: 0b00100110110001101 + 34377, // lfsr bits: 0b00101011101000010 + 46383, // lfsr bits: 0b00101101000001100 + 30951, // lfsr bits: 0b00110011000011000 + 106545, // lfsr bits: 0b00110100001111011 + 53273, // lfsr bits: 0b00111010010000001 + 22366, // lfsr bits: 0b00111100101000010 + 79090, // lfsr bits: 0b01000010010100000 + 67039, // lfsr bits: 0b01000110101110111 + 70469, // lfsr bits: 0b01001010101001011 + 58392, // lfsr bits: 0b01001110101010000 + 6897, // lfsr bits: 0b01010011111000100 + 97952, // lfsr bits: 0b01010100101101011 + 8588, // lfsr bits: 0b01011011100110001 + 1736, // lfsr bits: 0b01011101011000101 + 84227, // lfsr bits: 0b01100000110001100 + 20627, // lfsr bits: 0b01100111101011110 + 37851, // lfsr bits: 0b01101000110000101 + 56681, // lfsr bits: 0b01101111010100001 + 18937, // lfsr bits: 0b01110010011001101 + 55003, // lfsr bits: 0b01110100110101100 + 96285, // lfsr bits: 0b01111010111010100 + 60172, // lfsr bits: 0b01111111110010101 + 49830, // lfsr bits: 0b10000010110010010 + 13727, // lfsr bits: 0b10000100110111111 + 36098, // lfsr bits: 0b10001011111100110 + 89347, // lfsr bits: 0b10001110001001001 + 68751, // lfsr bits: 0b10010011100000101 + 27484, // lfsr bits: 0b10010110111011101 + 12008, // lfsr bits: 0b10011010010111100 + 15483, // lfsr bits: 0b10011101100001101 + 32660, // lfsr bits: 0b10100010111110000 + 85943, // lfsr bits: 0b10100110110100100 + 17214, // lfsr bits: 0b10101011111101001 + 30, // lfsr bits: 0b10101110000010101 + 44680, // lfsr bits: 0b10110000110000001 + 103141, // lfsr bits: 0b10110101111100100 + 51578, // lfsr bits: 0b10111001100101110 + 82487, // lfsr bits: 0b10111110100000101 + 25766, // lfsr bits: 0b11000001011000110 + 75584, // lfsr bits: 0b11000100110101001 + 29176, // lfsr bits: 0b11001011010001101 + 91099, // lfsr bits: 0b11001110000100100 + 73950, // lfsr bits: 0b11010001011101010 + 108267, // lfsr bits: 0b11010111110001001 + 104828, // lfsr bits: 0b11011011101001111 + 63578, // lfsr bits: 0b11011111100001111 + 87626, // lfsr bits: 0b11100010010110001 + 94575, // lfsr bits: 0b11100111001110100 + 39513, // lfsr bits: 0b11101001110010101 + 77318, // lfsr bits: 0b11101101100101111 + 92801, // lfsr bits: 0b11110001101101001 + 80787, // lfsr bits: 0b11110110101110100 + 5136, // lfsr bits: 0b11111011001010001 + 48135, // lfsr bits: 0b11111110011110111 + }, + { + // Polynomial: 4 + 60132, // lfsr bits: 0b00000010011101011 + 63614, // lfsr bits: 0b00000100111000010 + 48144, // lfsr bits: 0b00001000100111001 + 10318, // lfsr bits: 0b00001100000010101 + 36117, // lfsr bits: 0b00010000110100000 + 25779, // lfsr bits: 0b00010110010001001 + 99728, // lfsr bits: 0b00011001110111111 + 85904, // lfsr bits: 0b00011101111010100 + 18898, // lfsr bits: 0b00100011110111000 + 82502, // lfsr bits: 0b00100101001101011 + 61842, // lfsr bits: 0b00101010001111010 + 44657, // lfsr bits: 0b00101101111101111 + 3430, // lfsr bits: 0b00110001000111110 + 92799, // lfsr bits: 0b00110110111110100 + 68756, // lfsr bits: 0b00111011111011111 + 46408, // lfsr bits: 0b00111111010010110 + 89410, // lfsr bits: 0b01000000000011001 + 37799, // lfsr bits: 0b01000100100000111 + 73871, // lfsr bits: 0b01001011100001110 + 17213, // lfsr bits: 0b01001111010000000 + 87702, // lfsr bits: 0b01010000000111110 + 91091, // lfsr bits: 0b01010110011101011 + 5169, // lfsr bits: 0b01011011000010010 + 37, // lfsr bits: 0b01011101000101101 + 84238, // lfsr bits: 0b01100001010001100 + 13738, // lfsr bits: 0b01100101100000111 + 1710, // lfsr bits: 0b01101011001001110 + 42960, // lfsr bits: 0b01101110110010010 + 41228, // lfsr bits: 0b01110010011010111 + 108283, // lfsr bits: 0b01110111111011010 + 20628, // lfsr bits: 0b01111001001111011 + 6852, // lfsr bits: 0b01111101001110100 + 80746, // lfsr bits: 0b10000011011000100 + 103117, // lfsr bits: 0b10000101110000010 + 27463, // lfsr bits: 0b10001010110001111 + 94520, // lfsr bits: 0b10001111101101010 + 39518, // lfsr bits: 0b10010010111010100 + 8613, // lfsr bits: 0b10010110101111010 + 56739, // lfsr bits: 0b10011000001101101 + 75661, // lfsr bits: 0b10011111100101000 + 101370, // lfsr bits: 0b10100011110111101 + 29259, // lfsr bits: 0b10100100110100111 + 97967, // lfsr bits: 0b10101011101000110 + 54981, // lfsr bits: 0b10101100011010000 + 79037, // lfsr bits: 0b10110011101110111 + 34379, // lfsr bits: 0b10110100001010111 + 30963, // lfsr bits: 0b10111001110111111 + 12043, // lfsr bits: 0b10111111000100011 + 58477, // lfsr bits: 0b11000010000000011 + 22369, // lfsr bits: 0b11000111010000110 + 106581, // lfsr bits: 0b11001011101101111 + 67027, // lfsr bits: 0b11001110000101011 + 53256, // lfsr bits: 0b11010010100101011 + 15454, // lfsr bits: 0b11010101101001111 + 51547, // lfsr bits: 0b11011001010010110 + 24030, // lfsr bits: 0b11011100000100000 + 65317, // lfsr bits: 0b11100000101101101 + 77304, // lfsr bits: 0b11100110111101010 + 104849, // lfsr bits: 0b11101011000100100 + 32631, // lfsr bits: 0b11101110010001110 + 96250, // lfsr bits: 0b11110010100011010 + 49853, // lfsr bits: 0b11110100011000100 + 70472, // lfsr bits: 0b11111011111101001 + 72152, // lfsr bits: 0b11111101000001101 + }, + { + // Polynomial: 5 + 51571, // lfsr bits: 0b00000000111011110 + 20646, // lfsr bits: 0b00000101110000010 + 84217, // lfsr bits: 0b00001011010001101 + 70471, // lfsr bits: 0b00001101000110001 + 49890, // lfsr bits: 0b00010010101100110 + 99709, // lfsr bits: 0b00010100000100100 + 1678, // lfsr bits: 0b00011001000000111 + 73953, // lfsr bits: 0b00011110010000001 + 6907, // lfsr bits: 0b00100000011000110 + 34407, // lfsr bits: 0b00100110000101100 + 60157, // lfsr bits: 0b00101011100100101 + 92830, // lfsr bits: 0b00101111011001100 + 29264, // lfsr bits: 0b00110000010000101 + 67020, // lfsr bits: 0b00110111011001010 + 15466, // lfsr bits: 0b00111011010111011 + 85954, // lfsr bits: 0b00111110010111000 + 22360, // lfsr bits: 0b01000010100110011 + 108296, // lfsr bits: 0b01000100001100010 + 10312, // lfsr bits: 0b01001001110011100 + 18892, // lfsr bits: 0b01001101111010111 + 94547, // lfsr bits: 0b01010001100001110 + 27502, // lfsr bits: 0b01010100010011011 + 106567, // lfsr bits: 0b01011001000100001 + 5128, // lfsr bits: 0b01011100010010100 + 55031, // lfsr bits: 0b01100000010000111 + 41251, // lfsr bits: 0b01100101110100110 + 32646, // lfsr bits: 0b01101000000000110 + 97969, // lfsr bits: 0b01101110000111100 + 75626, // lfsr bits: 0b01110001001010001 + 101397, // lfsr bits: 0b01110100000100011 + 3430, // lfsr bits: 0b01111000010111111 + 37793, // lfsr bits: 0b01111100000100111 + 96211, // lfsr bits: 0b10000011100011011 + 87686, // lfsr bits: 0b10000100111001001 + 49, // lfsr bits: 0b10001011001111011 + 44683, // lfsr bits: 0b10001101101000011 + 36079, // lfsr bits: 0b10010011011001011 + 58479, // lfsr bits: 0b10010111010100110 + 68732, // lfsr bits: 0b10011001011111010 + 80743, // lfsr bits: 0b10011110110100100 + 103117, // lfsr bits: 0b10100000011000001 + 89377, // lfsr bits: 0b10100111000101000 + 63602, // lfsr bits: 0b10101011011000011 + 61876, // lfsr bits: 0b10101100100101110 + 39530, // lfsr bits: 0b10110000111100000 + 13763, // lfsr bits: 0b10110111111000000 + 104821, // lfsr bits: 0b10111010101101010 + 77381, // lfsr bits: 0b10111100011000000 + 8596, // lfsr bits: 0b11000001101011111 + 56716, // lfsr bits: 0b11000100011000101 + 65286, // lfsr bits: 0b11001001110000110 + 25822, // lfsr bits: 0b11001111100000011 + 79020, // lfsr bits: 0b11010011110011011 + 82512, // lfsr bits: 0b11010110110011110 + 24059, // lfsr bits: 0b11011011101101111 + 46385, // lfsr bits: 0b11011110001110101 + 17197, // lfsr bits: 0b11100011100010110 + 12028, // lfsr bits: 0b11100101010100001 + 72190, // lfsr bits: 0b11101000001001101 + 53306, // lfsr bits: 0b11101111001100100 + 91108, // lfsr bits: 0b11110000110000000 + 48097, // lfsr bits: 0b11110111110010000 + 30936, // lfsr bits: 0b11111011110100111 + 42957, // lfsr bits: 0b11111100100011101 + }, + { + // Polynomial: 6 + 42950, // lfsr bits: 0b00000011111001010 + 106575, // lfsr bits: 0b00000111010110101 + 82493, // lfsr bits: 0b00001001010101000 + 51550, // lfsr bits: 0b00001110101111010 + 17210, // lfsr bits: 0b00010011011101111 + 70452, // lfsr bits: 0b00010111000110011 + 99714, // lfsr bits: 0b00011011110011111 + 49834, // lfsr bits: 0b00011111001011010 + 84249, // lfsr bits: 0b00100011010010111 + 68762, // lfsr bits: 0b00100110111110010 + 46419, // lfsr bits: 0b00101010111011111 + 56717, // lfsr bits: 0b00101110110100011 + 25773, // lfsr bits: 0b00110001001011010 + 15463, // lfsr bits: 0b00110101010001000 + 8571, // lfsr bits: 0b00111011011111001 + 89332, // lfsr bits: 0b00111110111011000 + 48127, // lfsr bits: 0b01000001001011001 + 58445, // lfsr bits: 0b01000100011011110 + 12027, // lfsr bits: 0b01001000010010110 + 77365, // lfsr bits: 0b01001111010101011 + 60154, // lfsr bits: 0b01010000010001000 + 3409, // lfsr bits: 0b01010111101100000 + 20610, // lfsr bits: 0b01011000111011010 + 75635, // lfsr bits: 0b01011110001111111 + 53282, // lfsr bits: 0b01100000010000011 + 61871, // lfsr bits: 0b01100101001010100 + 34398, // lfsr bits: 0b01101001111110101 + 24073, // lfsr bits: 0b01101101010011010 + 36115, // lfsr bits: 0b01110001011001110 + 41248, // lfsr bits: 0b01110100011111000 + 27495, // lfsr bits: 0b01111000110000011 + 10334, // lfsr bits: 0b01111110101110000 + 91138, // lfsr bits: 0b10000000111010001 + 55010, // lfsr bits: 0b10000110101101000 + 96237, // lfsr bits: 0b10001011011001101 + 101412, // lfsr bits: 0b10001101010010001 + 85922, // lfsr bits: 0b10010010111101010 + 5114, // lfsr bits: 0b10010110011101101 + 44702, // lfsr bits: 0b10011011100001101 + 6914, // lfsr bits: 0b10011110101110111 + 1754, // lfsr bits: 0b10100000011000000 + 21, // lfsr bits: 0b10100100010101101 + 67047, // lfsr bits: 0b10101010101110000 + 13714, // lfsr bits: 0b10101110010000100 + 108303, // lfsr bits: 0b10110011001101010 + 18906, // lfsr bits: 0b10110111110100110 + 103127, // lfsr bits: 0b10111011011101001 + 29195, // lfsr bits: 0b10111101000111001 + 30944, // lfsr bits: 0b11000011011000000 + 63577, // lfsr bits: 0b11000110101111101 + 80788, // lfsr bits: 0b11001011110001010 + 92817, // lfsr bits: 0b11001111001010011 + 72176, // lfsr bits: 0b11010011110011100 + 104838, // lfsr bits: 0b11010111011011101 + 65346, // lfsr bits: 0b11011001001001111 + 39528, // lfsr bits: 0b11011110001001111 + 73906, // lfsr bits: 0b11100001101111010 + 97953, // lfsr bits: 0b11100101001110001 + 37814, // lfsr bits: 0b11101000111111010 + 79101, // lfsr bits: 0b11101100100111011 + 94532, // lfsr bits: 0b11110001011011101 + 22350, // lfsr bits: 0b11110111111000110 + 32617, // lfsr bits: 0b11111011000100000 + 87655, // lfsr bits: 0b11111101110101001 + }, + { + // Polynomial: 7 + 77297, // lfsr bits: 0b00000010001011001 + 17175, // lfsr bits: 0b00000100110001010 + 70460, // lfsr bits: 0b00001010100010111 + 27486, // lfsr bits: 0b00001101101010100 + 94515, // lfsr bits: 0b00010001110001011 + 108291, // lfsr bits: 0b00010100010001110 + 53278, // lfsr bits: 0b00011011110111110 + 61891, // lfsr bits: 0b00011100100111111 + 3431, // lfsr bits: 0b00100010110000110 + 11995, // lfsr bits: 0b00100110001100011 + 63596, // lfsr bits: 0b00101010100100001 + 37, // lfsr bits: 0b00101101011100011 + 99693, // lfsr bits: 0b00110011000110010 + 25761, // lfsr bits: 0b00110111110110111 + 84221, // lfsr bits: 0b00111000110001011 + 15474, // lfsr bits: 0b00111101111101101 + 96226, // lfsr bits: 0b01000011001101101 + 44713, // lfsr bits: 0b01000110010101111 + 67050, // lfsr bits: 0b01001001111101100 + 37786, // lfsr bits: 0b01001100110010000 + 91090, // lfsr bits: 0b01010011101010010 + 20643, // lfsr bits: 0b01010110101001111 + 58418, // lfsr bits: 0b01011000111000001 + 42943, // lfsr bits: 0b01011111010000100 + 85932, // lfsr bits: 0b01100000000010111 + 1700, // lfsr bits: 0b01100100000111001 + 103117, // lfsr bits: 0b01101011000101111 + 87609, // lfsr bits: 0b01101110011110100 + 65296, // lfsr bits: 0b01110001000000111 + 82454, // lfsr bits: 0b01110101011100100 + 5166, // lfsr bits: 0b01111011110110010 + 32662, // lfsr bits: 0b01111110100111111 + 92811, // lfsr bits: 0b10000010100001101 + 72203, // lfsr bits: 0b10000111111011011 + 8587, // lfsr bits: 0b10001010011001010 + 75596, // lfsr bits: 0b10001111100100001 + 24060, // lfsr bits: 0b10010001000000000 + 29223, // lfsr bits: 0b10010101010001100 + 22345, // lfsr bits: 0b10011000101000001 + 73921, // lfsr bits: 0b10011100001011100 + 104875, // lfsr bits: 0b10100010000001100 + 97995, // lfsr bits: 0b10100101111010101 + 48085, // lfsr bits: 0b10101011000001010 + 55006, // lfsr bits: 0b10101101000110100 + 41265, // lfsr bits: 0b10110000110010010 + 10269, // lfsr bits: 0b10110111110011100 + 60184, // lfsr bits: 0b10111011001110010 + 68783, // lfsr bits: 0b10111110000010110 + 30954, // lfsr bits: 0b11000011110010100 + 106561, // lfsr bits: 0b11000110111000000 + 36118, // lfsr bits: 0b11001011000111000 + 51554, // lfsr bits: 0b11001100010110110 + 56709, // lfsr bits: 0b11010000111100110 + 18898, // lfsr bits: 0b11010100011011110 + 89385, // lfsr bits: 0b11011011001010011 + 34405, // lfsr bits: 0b11011100000010000 + 6870, // lfsr bits: 0b11100000110011101 + 80808, // lfsr bits: 0b11100110111100011 + 49850, // lfsr bits: 0b11101000101001101 + 101427, // lfsr bits: 0b11101100101101010 + 13752, // lfsr bits: 0b11110010110110100 + 79038, // lfsr bits: 0b11110111000000001 + 39530, // lfsr bits: 0b11111010010010011 + 46385, // lfsr bits: 0b11111101011110011 + }, + { + // Polynomial: 8 + 0, // lfsr bits: 0b00000000000000001 + 94551, // lfsr bits: 0b00000100110101110 + 103154, // lfsr bits: 0b00001010111101111 + 77345, // lfsr bits: 0b00001100000110110 + 41253, // lfsr bits: 0b00010010010011101 + 13710, // lfsr bits: 0b00010101100111010 + 104810, // lfsr bits: 0b00011011101000000 + 67051, // lfsr bits: 0b00011111010001110 + 106585, // lfsr bits: 0b00100000000111110 + 58399, // lfsr bits: 0b00100111011001000 + 10302, // lfsr bits: 0b00101011010101100 + 82499, // lfsr bits: 0b00101101001111101 + 42979, // lfsr bits: 0b00110000101010110 + 25787, // lfsr bits: 0b00110110101101100 + 98004, // lfsr bits: 0b00111000100001100 + 92795, // lfsr bits: 0b00111111101111011 + 91104, // lfsr bits: 0b01000001000001111 + 12074, // lfsr bits: 0b01000110011001011 + 24060, // lfsr bits: 0b01001011001011111 + 72207, // lfsr bits: 0b01001111000011001 + 22345, // lfsr bits: 0b01010011000000011 + 101450, // lfsr bits: 0b01010110001001101 + 87663, // lfsr bits: 0b01011010101010100 + 39532, // lfsr bits: 0b01011101011001011 + 99647, // lfsr bits: 0b01100010010100000 + 73895, // lfsr bits: 0b01100101110101111 + 68768, // lfsr bits: 0b01101011010101101 + 70446, // lfsr bits: 0b01101110111100110 + 53290, // lfsr bits: 0b01110000000000001 + 46427, // lfsr bits: 0b01110101101010101 + 61905, // lfsr bits: 0b01111011100011110 + 3407, // lfsr bits: 0b01111110011110101 + 49819, // lfsr bits: 0b10000011110111100 + 63583, // lfsr bits: 0b10000110100111001 + 80740, // lfsr bits: 0b10001011101000110 + 65301, // lfsr bits: 0b10001110000000000 + 1684, // lfsr bits: 0b10010001101001010 + 6877, // lfsr bits: 0b10010100100010011 + 20629, // lfsr bits: 0b10011011000111000 + 75598, // lfsr bits: 0b10011101111010011 + 51575, // lfsr bits: 0b10100001110100101 + 108258, // lfsr bits: 0b10100110110100000 + 32626, // lfsr bits: 0b10101001000111000 + 79055, // lfsr bits: 0b10101110011000010 + 29196, // lfsr bits: 0b10110001001101110 + 36089, // lfsr bits: 0b10110110011010111 + 85908, // lfsr bits: 0b10111011001100100 + 84242, // lfsr bits: 0b10111100000101110 + 96278, // lfsr bits: 0b11000010100001011 + 60139, // lfsr bits: 0b11000100111111111 + 44661, // lfsr bits: 0b11001010010010000 + 17173, // lfsr bits: 0b11001101110100100 + 89379, // lfsr bits: 0b11010000111101011 + 30953, // lfsr bits: 0b11010101011001110 + 55044, // lfsr bits: 0b11011001000001001 + 5149, // lfsr bits: 0b11011111111010111 + 8599, // lfsr bits: 0b11100001100010001 + 56699, // lfsr bits: 0b11100101101111000 + 15505, // lfsr bits: 0b11101001011010011 + 18939, // lfsr bits: 0b11101101101110101 + 37811, // lfsr bits: 0b11110001111111110 + 34389, // lfsr bits: 0b11110101110010101 + 48104, // lfsr bits: 0b11111010001100101 + 27541, // lfsr bits: 0b11111111101000110 + }, + { + // Polynomial: 9 + 103076, // lfsr bits: 0b00000010000100001 + 12028, // lfsr bits: 0b00000100100010101 + 6907, // lfsr bits: 0b00001011101000110 + 18917, // lfsr bits: 0b00001100110101011 + 8592, // lfsr bits: 0b00010011000101000 + 27508, // lfsr bits: 0b00010110100110001 + 70488, // lfsr bits: 0b00011001010100100 + 84191, // lfsr bits: 0b00011110011011101 + 46431, // lfsr bits: 0b00100011000011100 + 58414, // lfsr bits: 0b00100101011000111 + 68715, // lfsr bits: 0b00101010100110011 + 10322, // lfsr bits: 0b00101101101101101 + 106544, // lfsr bits: 0b00110000100010111 + 30924, // lfsr bits: 0b00110110001011110 + 22342, // lfsr bits: 0b00111011110000000 + 72214, // lfsr bits: 0b00111100011110110 + 15507, // lfsr bits: 0b01000010100110100 + 80732, // lfsr bits: 0b01000101111000011 + 51601, // lfsr bits: 0b01001010101010000 + 97971, // lfsr bits: 0b01001101101001011 + 37827, // lfsr bits: 0b01010011010100011 + 85941, // lfsr bits: 0b01010100010000100 + 82519, // lfsr bits: 0b01011000111011101 + 79014, // lfsr bits: 0b01011111110010000 + 20646, // lfsr bits: 0b01100010100010100 + 94516, // lfsr bits: 0b01100100001010011 + 60144, // lfsr bits: 0b01101000111111111 + 48103, // lfsr bits: 0b01101110100111011 + 87646, // lfsr bits: 0b01110000001111001 + 13752, // lfsr bits: 0b01110100111000011 + 42942, // lfsr bits: 0b01111010100100110 + 89390, // lfsr bits: 0b01111111001011110 + 67051, // lfsr bits: 0b10000001011000101 + 1771, // lfsr bits: 0b10000111111110110 + 99701, // lfsr bits: 0b10001011010100111 + 75594, // lfsr bits: 0b10001111101111001 + 108283, // lfsr bits: 0b10010011000100011 + 5171, // lfsr bits: 0b10010100100111001 + 41, // lfsr bits: 0b10011010010110111 + 39516, // lfsr bits: 0b10011111101101011 + 32642, // lfsr bits: 0b10100001101100111 + 96200, // lfsr bits: 0b10100101110001110 + 3434, // lfsr bits: 0b10101001010001111 + 29262, // lfsr bits: 0b10101110111110010 + 56720, // lfsr bits: 0b10110001000011000 + 73906, // lfsr bits: 0b10110110000010001 + 77339, // lfsr bits: 0b10111000111011000 + 55001, // lfsr bits: 0b10111101011011110 + 41288, // lfsr bits: 0b11000010110001011 + 49852, // lfsr bits: 0b11000100111011001 + 44679, // lfsr bits: 0b11001000001100111 + 92845, // lfsr bits: 0b11001101001111100 + 101371, // lfsr bits: 0b11010010010100111 + 63593, // lfsr bits: 0b11010101010011101 + 34398, // lfsr bits: 0b11011010110011000 + 36101, // lfsr bits: 0b11011111101001001 + 24038, // lfsr bits: 0b11100011111011011 + 17191, // lfsr bits: 0b11100101100101000 + 91139, // lfsr bits: 0b11101000001000111 + 53287, // lfsr bits: 0b11101110001010110 + 25780, // lfsr bits: 0b11110011111110101 + 61908, // lfsr bits: 0b11110110010110010 + 104855, // lfsr bits: 0b11111011100111011 + 65327, // lfsr bits: 0b11111100010100101 + }, + { + // Polynomial: 10 + 68748, // lfsr bits: 0b00000010001000001 + 56727, // lfsr bits: 0b00000111011000001 + 60150, // lfsr bits: 0b00001010011010110 + 70458, // lfsr bits: 0b00001110111111111 + 29204, // lfsr bits: 0b00010001011101111 + 8607, // lfsr bits: 0b00010100110000001 + 79089, // lfsr bits: 0b00011001001011101 + 37802, // lfsr bits: 0b00011111100100011 + 46431, // lfsr bits: 0b00100001100110101 + 12059, // lfsr bits: 0b00100110100111000 + 20605, // lfsr bits: 0b00101010011000110 + 108252, // lfsr bits: 0b00101100111010101 + 27502, // lfsr bits: 0b00110011101111011 + 101441, // lfsr bits: 0b00110110001111110 + 42977, // lfsr bits: 0b00111010110111000 + 58435, // lfsr bits: 0b00111101111010000 + 103160, // lfsr bits: 0b01000001111000101 + 97965, // lfsr bits: 0b01000101111110110 + 51532, // lfsr bits: 0b01001011101101111 + 84214, // lfsr bits: 0b01001100000011111 + 1706, // lfsr bits: 0b01010001010110001 + 17191, // lfsr bits: 0b01010100101100001 + 65316, // lfsr bits: 0b01011011011110000 + 48147, // lfsr bits: 0b01011110011100100 + 55025, // lfsr bits: 0b01100001000100000 + 99706, // lfsr bits: 0b01100110100001010 + 32649, // lfsr bits: 0b01101001110110011 + 36113, // lfsr bits: 0b01101100010010110 + 77352, // lfsr bits: 0b01110011111010001 + 6876, // lfsr bits: 0b01110100101010011 + 73938, // lfsr bits: 0b01111010100111110 + 72191, // lfsr bits: 0b01111101111101111 + 3426, // lfsr bits: 0b10000001100100111 + 10357, // lfsr bits: 0b10000111110110011 + 18907, // lfsr bits: 0b10001001000110111 + 63621, // lfsr bits: 0b10001110111100010 + 22329, // lfsr bits: 0b10010001101100010 + 92765, // lfsr bits: 0b10010101100011100 + 61853, // lfsr bits: 0b10011011000111110 + 96256, // lfsr bits: 0b10011110011101000 + 104872, // lfsr bits: 0b10100001100101001 + 44690, // lfsr bits: 0b10100101100001110 + 39548, // lfsr bits: 0b10101000111100110 + 82502, // lfsr bits: 0b10101110010011111 + 80810, // lfsr bits: 0b10110000000100011 + 5145, // lfsr bits: 0b10110100000111110 + 41256, // lfsr bits: 0b10111010011100101 + 24069, // lfsr bits: 0b10111111100010000 + 53283, // lfsr bits: 0b11000010010111000 + 89377, // lfsr bits: 0b11000101111110011 + 67067, // lfsr bits: 0b11001010111111101 + 85936, // lfsr bits: 0b11001110100001110 + 106578, // lfsr bits: 0b11010010110111011 + 15481, // lfsr bits: 0b11010110110110100 + 13796, // lfsr bits: 0b11011010100111110 + 87680, // lfsr bits: 0b11011100111011010 + 49842, // lfsr bits: 0b11100011110101111 + 91097, // lfsr bits: 0b11100111100001010 + 43, // lfsr bits: 0b11101010111101110 + 94527, // lfsr bits: 0b11101101111011101 + 34359, // lfsr bits: 0b11110001111111101 + 30922, // lfsr bits: 0b11110101011100111 + 75621, // lfsr bits: 0b11111000000011101 + 25781, // lfsr bits: 0b11111101101000011 + }, + { + // Polynomial: 11 + 34336, // lfsr bits: 0b00000010000100011 + 36090, // lfsr bits: 0b00000110011001010 + 67048, // lfsr bits: 0b00001000000010000 + 70460, // lfsr bits: 0b00001110001111101 + 27521, // lfsr bits: 0b00010001010000100 + 56713, // lfsr bits: 0b00010100000011001 + 79065, // lfsr bits: 0b00011001010011101 + 49833, // lfsr bits: 0b00011101011110110 + 65307, // lfsr bits: 0b00100001110100110 + 75629, // lfsr bits: 0b00100111101100001 + 29190, // lfsr bits: 0b00101010110011110 + 82496, // lfsr bits: 0b00101110001111010 + 39513, // lfsr bits: 0b00110010101001000 + 61880, // lfsr bits: 0b00110110101011001 + 17167, // lfsr bits: 0b00111000101011101 + 20650, // lfsr bits: 0b00111101010001011 + 22365, // lfsr bits: 0b01000000101111100 + 72226, // lfsr bits: 0b01000111000110101 + 60167, // lfsr bits: 0b01001001010110110 + 99693, // lfsr bits: 0b01001110110111010 + 103134, // lfsr bits: 0b01010000010100100 + 24022, // lfsr bits: 0b01010110110100101 + 37794, // lfsr bits: 0b01011011001011100 + 80793, // lfsr bits: 0b01011101011010101 + 51533, // lfsr bits: 0b01100000010010001 + 1746, // lfsr bits: 0b01100101111100011 + 30936, // lfsr bits: 0b01101000001111000 + 5158, // lfsr bits: 0b01101111100001110 + 91089, // lfsr bits: 0b01110000111111011 + 97954, // lfsr bits: 0b01110101110010010 + 96246, // lfsr bits: 0b01111000101000101 + 6918, // lfsr bits: 0b01111101111011100 + 3449, // lfsr bits: 0b10000001000110100 + 55019, // lfsr bits: 0b10000111110010100 + 12053, // lfsr bits: 0b10001000101001100 + 42977, // lfsr bits: 0b10001101111010000 + 8627, // lfsr bits: 0b10010001010110101 + 87678, // lfsr bits: 0b10010100111111100 + 106558, // lfsr bits: 0b10011001001111100 + 41268, // lfsr bits: 0b10011111100001000 + 101396, // lfsr bits: 0b10100011001011111 + 108310, // lfsr bits: 0b10100110000000001 + 104869, // lfsr bits: 0b10101000101101100 + 48127, // lfsr bits: 0b10101101000001000 + 18909, // lfsr bits: 0b10110011111010111 + 32631, // lfsr bits: 0b10110101010000100 + 92789, // lfsr bits: 0b10111011111000010 + 73939, // lfsr bits: 0b10111101001011110 + 16, // lfsr bits: 0b11000011010100111 + 44694, // lfsr bits: 0b11000111100010111 + 53263, // lfsr bits: 0b11001010010000101 + 10269, // lfsr bits: 0b11001110110110010 + 68772, // lfsr bits: 0b11010000111101110 + 89357, // lfsr bits: 0b11010101000011111 + 63603, // lfsr bits: 0b11011000000100001 + 94517, // lfsr bits: 0b11011101011111101 + 77341, // lfsr bits: 0b11100010110001100 + 13749, // lfsr bits: 0b11100100110100010 + 84194, // lfsr bits: 0b11101010011010110 + 46392, // lfsr bits: 0b11101101010000101 + 15471, // lfsr bits: 0b11110000000000110 + 25791, // lfsr bits: 0b11110110010001101 + 85917, // lfsr bits: 0b11111000100010101 + 58450, // lfsr bits: 0b11111101111111001 + }, + { + // Polynomial: 12 + 82516, // lfsr bits: 0b00000011001100010 + 10311, // lfsr bits: 0b00000101001001111 + 63550, // lfsr bits: 0b00001010010001010 + 91083, // lfsr bits: 0b00001101001110011 + 24061, // lfsr bits: 0b00010001011000100 + 68795, // lfsr bits: 0b00010111001010110 + 27502, // lfsr bits: 0b00011011110111010 + 30919, // lfsr bits: 0b00011100101101011 + 49838, // lfsr bits: 0b00100010111100011 + 75649, // lfsr bits: 0b00100110100001100 + 34391, // lfsr bits: 0b00101010000011000 + 65285, // lfsr bits: 0b00101111001110001 + 79050, // lfsr bits: 0b00110010101010000 + 85922, // lfsr bits: 0b00110110101000100 + 60152, // lfsr bits: 0b00111011111001001 + 104838, // lfsr bits: 0b00111100101100011 + 15493, // lfsr bits: 0b01000000110011011 + 6862, // lfsr bits: 0b01000100101110111 + 8584, // lfsr bits: 0b01001010011000101 + 44704, // lfsr bits: 0b01001110010111001 + 49, // lfsr bits: 0b01010001000010010 + 20626, // lfsr bits: 0b01010100110000110 + 97968, // lfsr bits: 0b01011010101101100 + 1735, // lfsr bits: 0b01011100010000101 + 80788, // lfsr bits: 0b01100001111110000 + 3405, // lfsr bits: 0b01100100101101011 + 46415, // lfsr bits: 0b01101011111111001 + 89363, // lfsr bits: 0b01101100101011110 + 58452, // lfsr bits: 0b01110010101000111 + 77339, // lfsr bits: 0b01110100100110110 + 87656, // lfsr bits: 0b01111000111000011 + 56707, // lfsr bits: 0b01111111110111100 + 70460, // lfsr bits: 0b10000000000011010 + 73902, // lfsr bits: 0b10000110110110100 + 36047, // lfsr bits: 0b10001010111100110 + 67078, // lfsr bits: 0b10001110111110010 + 18929, // lfsr bits: 0b10010011100110111 + 53277, // lfsr bits: 0b10010100011000111 + 108275, // lfsr bits: 0b10011011010110100 + 101383, // lfsr bits: 0b10011100011100010 + 61885, // lfsr bits: 0b10100000111001010 + 43008, // lfsr bits: 0b10100100100011000 + 32651, // lfsr bits: 0b10101000000000100 + 48135, // lfsr bits: 0b10101101010100001 + 37829, // lfsr bits: 0b10110011001001011 + 13764, // lfsr bits: 0b10110111101000110 + 54955, // lfsr bits: 0b10111000111001110 + 106562, // lfsr bits: 0b10111110110110010 + 94563, // lfsr bits: 0b11000010011110110 + 92804, // lfsr bits: 0b11000100011101111 + 103096, // lfsr bits: 0b11001011101001011 + 5171, // lfsr bits: 0b11001111101101101 + 22373, // lfsr bits: 0b11010000000100110 + 51587, // lfsr bits: 0b11010101100110001 + 12013, // lfsr bits: 0b11011011100001001 + 99663, // lfsr bits: 0b11011110001100101 + 17153, // lfsr bits: 0b11100010001001100 + 25747, // lfsr bits: 0b11100110000000000 + 84216, // lfsr bits: 0b11101010111100111 + 29223, // lfsr bits: 0b11101110011110101 + 41245, // lfsr bits: 0b11110001110011100 + 39502, // lfsr bits: 0b11110110011100100 + 96247, // lfsr bits: 0b11111010101000000 + 72149, // lfsr bits: 0b11111101011000010 + }, + { + // Polynomial: 13 + 92847, // lfsr bits: 0b00000011001111100 + 82504, // lfsr bits: 0b00000111100101011 + 101392, // lfsr bits: 0b00001010100111001 + 36111, // lfsr bits: 0b00001110001100110 + 84221, // lfsr bits: 0b00010010101000100 + 89331, // lfsr bits: 0b00010110010110110 + 61902, // lfsr bits: 0b00011010111100010 + 1674, // lfsr bits: 0b00011101111001011 + 12027, // lfsr bits: 0b00100011001111010 + 30921, // lfsr bits: 0b00100100001000011 + 17196, // lfsr bits: 0b00101011101101010 + 65277, // lfsr bits: 0b00101110110101101 + 51521, // lfsr bits: 0b00110011111000111 + 6861, // lfsr bits: 0b00110100011110011 + 106606, // lfsr bits: 0b00111010110011000 + 5113, // lfsr bits: 0b00111100110110111 + 44680, // lfsr bits: 0b01000010100010101 + 94487, // lfsr bits: 0b01000111111111110 + 75638, // lfsr bits: 0b01001011110100000 + 8616, // lfsr bits: 0b01001111010001010 + 32645, // lfsr bits: 0b01010010011011001 + 34372, // lfsr bits: 0b01010100110011101 + 25819, // lfsr bits: 0b01011011110011010 + 68746, // lfsr bits: 0b01011100000111101 + 67033, // lfsr bits: 0b01100010101011011 + 3425, // lfsr bits: 0b01100110101101001 + 29226, // lfsr bits: 0b01101001110011111 + 63604, // lfsr bits: 0b01101100011011100 + 58419, // lfsr bits: 0b01110011111110001 + 39527, // lfsr bits: 0b01110110111000101 + 104838, // lfsr bits: 0b01111010011011100 + 103161, // lfsr bits: 0b01111100100011000 + 87692, // lfsr bits: 0b10000010100111010 + 56727, // lfsr bits: 0b10000100110011110 + 96246, // lfsr bits: 0b10001011000011100 + 97964, // lfsr bits: 0b10001101000000100 + 54982, // lfsr bits: 0b10010000111010001 + 24038, // lfsr bits: 0b10010110110000010 + 80780, // lfsr bits: 0b10011001000111001 + 13796, // lfsr bits: 0b10011100111111111 + 72203, // lfsr bits: 0b10100010001000110 + 77364, // lfsr bits: 0b10100100011001110 + 41275, // lfsr bits: 0b10101010100100010 + 73938, // lfsr bits: 0b10101110110011110 + 91062, // lfsr bits: 0b10110001101001111 + 99671, // lfsr bits: 0b10110100011110100 + 48116, // lfsr bits: 0b10111011111000111 + 79086, // lfsr bits: 0b10111110110011100 + 37788, // lfsr bits: 0b11000000001100110 + 42961, // lfsr bits: 0b11000110000111010 + 22347, // lfsr bits: 0b11001010001001001 + 60117, // lfsr bits: 0b11001111010111011 + 108291, // lfsr bits: 0b11010010110101110 + 18879, // lfsr bits: 0b11010110010011010 + 70474, // lfsr bits: 0b11011011001110100 + 27506, // lfsr bits: 0b11011100100110000 + 85945, // lfsr bits: 0b11100011100110011 + 24, // lfsr bits: 0b11100111101111011 + 10281, // lfsr bits: 0b11101001001101111 + 20628, // lfsr bits: 0b11101111001110111 + 46430, // lfsr bits: 0b11110011101010000 + 49833, // lfsr bits: 0b11110101001111000 + 15490, // lfsr bits: 0b11111001010010000 + 53272, // lfsr bits: 0b11111101110001101 + }, + { + // Polynomial: 14 + 80781, // lfsr bits: 0b00000000101001111 + 1744, // lfsr bits: 0b00000100101011010 + 106572, // lfsr bits: 0b00001000000101101 + 87684, // lfsr bits: 0b00001101001001001 + 91109, // lfsr bits: 0b00010001111011110 + 108243, // lfsr bits: 0b00010101000100110 + 3422, // lfsr bits: 0b00011010011100100 + 104857, // lfsr bits: 0b00011100101000001 + 32652, // lfsr bits: 0b00100001101010011 + 46398, // lfsr bits: 0b00100111001010000 + 96244, // lfsr bits: 0b00101001110100011 + 82544, // lfsr bits: 0b00101110001000110 + 53298, // lfsr bits: 0b00110000100111101 + 15515, // lfsr bits: 0b00110101100100001 + 6832, // lfsr bits: 0b00111010010000000 + 30911, // lfsr bits: 0b00111101111001100 + 41257, // lfsr bits: 0b01000010101001010 + 8588, // lfsr bits: 0b01000110110000011 + 42925, // lfsr bits: 0b01001010101001110 + 79066, // lfsr bits: 0b01001111111111011 + 84215, // lfsr bits: 0b01010001000011101 + 97970, // lfsr bits: 0b01010101110011110 + 73920, // lfsr bits: 0b01011000001001111 + 27479, // lfsr bits: 0b01011101010100111 + 49818, // lfsr bits: 0b01100001011001101 + 48113, // lfsr bits: 0b01100111101100000 + 29198, // lfsr bits: 0b01101011001101100 + 72159, // lfsr bits: 0b01101100111011001 + 75637, // lfsr bits: 0b01110010110001111 + 20612, // lfsr bits: 0b01110100110011110 + 103132, // lfsr bits: 0b01111000111110000 + 5118, // lfsr bits: 0b01111101100000011 + 10306, // lfsr bits: 0b10000010111000011 + 60167, // lfsr bits: 0b10000100111000011 + 89411, // lfsr bits: 0b10001000101111011 + 18882, // lfsr bits: 0b10001111000001100 + 36080, // lfsr bits: 0b10010001010101110 + 77342, // lfsr bits: 0b10010100111101000 + 55030, // lfsr bits: 0b10011001000111100 + 68741, // lfsr bits: 0b10011111011001001 + 34409, // lfsr bits: 0b10100011001100100 + 25828, // lfsr bits: 0b10100100100000000 + 65275, // lfsr bits: 0b10101001110010000 + 44701, // lfsr bits: 0b10101111011001001 + 101403, // lfsr bits: 0b10110000100010010 + 24061, // lfsr bits: 0b10110110000100110 + 58389, // lfsr bits: 0b10111010110101101 + 92832, // lfsr bits: 0b10111111110010110 + 85889, // lfsr bits: 0b11000001001001111 + 13735, // lfsr bits: 0b11000111000000011 + 23, // lfsr bits: 0b11001000110000000 + 17195, // lfsr bits: 0b11001111011001101 + 37824, // lfsr bits: 0b11010000010010000 + 12034, // lfsr bits: 0b11010111110010011 + 70490, // lfsr bits: 0b11011000111101110 + 66983, // lfsr bits: 0b11011111010110001 + 51564, // lfsr bits: 0b11100010101000110 + 63620, // lfsr bits: 0b11100100110010011 + 56727, // lfsr bits: 0b11101001011110000 + 94566, // lfsr bits: 0b11101111011111010 + 61870, // lfsr bits: 0b11110000010100110 + 99646, // lfsr bits: 0b11110110001110110 + 22316, // lfsr bits: 0b11111000110001110 + 39544, // lfsr bits: 0b11111111110101001 + }, + { + // Polynomial: 15 + 101404, // lfsr bits: 0b00000011000110001 + 12041, // lfsr bits: 0b00000100001011010 + 15452, // lfsr bits: 0b00001010010110011 + 103132, // lfsr bits: 0b00001101110111111 + 106583, // lfsr bits: 0b00010000101111100 + 92764, // lfsr bits: 0b00010100111010000 + 29212, // lfsr bits: 0b00011010110111010 + 18933, // lfsr bits: 0b00011100100000101 + 79082, // lfsr bits: 0b00100010011111111 + 104834, // lfsr bits: 0b00100111100011010 + 80792, // lfsr bits: 0b00101011101101110 + 84232, // lfsr bits: 0b00101111000110010 + 27537, // lfsr bits: 0b00110001110001010 + 63641, // lfsr bits: 0b00110111111100110 + 8580, // lfsr bits: 0b00111011001100100 + 72180, // lfsr bits: 0b00111101110101110 + 22340, // lfsr bits: 0b01000000100101011 + 99695, // lfsr bits: 0b01000100101001001 + 46419, // lfsr bits: 0b01001000101100101 + 56705, // lfsr bits: 0b01001110010100100 + 13721, // lfsr bits: 0b01010010111100010 + 89364, // lfsr bits: 0b01010111101001111 + 44694, // lfsr bits: 0b01011010000011100 + 65333, // lfsr bits: 0b01011110101111011 + 61858, // lfsr bits: 0b01100000110110010 + 98011, // lfsr bits: 0b01100111010101010 + 58418, // lfsr bits: 0b01101010111001001 + 34381, // lfsr bits: 0b01101110111001111 + 68708, // lfsr bits: 0b01110011101001011 + 87629, // lfsr bits: 0b01110110001110010 + 94527, // lfsr bits: 0b01111001101111010 + 77351, // lfsr bits: 0b01111110000111011 + 51571, // lfsr bits: 0b10000001110111111 + 48131, // lfsr bits: 0b10000111000010110 + 6850, // lfsr bits: 0b10001010000011000 + 41262, // lfsr bits: 0b10001101010011011 + 66994, // lfsr bits: 0b10010000110001000 + 17171, // lfsr bits: 0b10010111000000100 + 39522, // lfsr bits: 0b10011010010111110 + 55004, // lfsr bits: 0b10011101000001000 + 25752, // lfsr bits: 0b10100011101011110 + 30933, // lfsr bits: 0b10100110100010110 + 60157, // lfsr bits: 0b10101011010001101 + 85910, // lfsr bits: 0b10101101101000010 + 24051, // lfsr bits: 0b10110000101111100 + 1736, // lfsr bits: 0b10110100100010110 + 42984, // lfsr bits: 0b10111011100101011 + 108283, // lfsr bits: 0b10111110000010000 + 75631, // lfsr bits: 0b11000011101011110 + 73938, // lfsr bits: 0b11000101101001001 + 36045, // lfsr bits: 0b11001010101110100 + 3454, // lfsr bits: 0b11001100001000111 + 32630, // lfsr bits: 0b11010000100100100 + 49831, // lfsr bits: 0b11010111110111100 + 10328, // lfsr bits: 0b11011010001000010 + 17, // lfsr bits: 0b11011111001101001 + 5142, // lfsr bits: 0b11100011101000000 + 53319, // lfsr bits: 0b11100100011101111 + 96265, // lfsr bits: 0b11101011101101110 + 91089, // lfsr bits: 0b11101110100111010 + 20644, // lfsr bits: 0b11110010001110100 + 70510, // lfsr bits: 0b11110101101111010 + 37821, // lfsr bits: 0b11111000110000010 + 82534, // lfsr bits: 0b11111110110001110 + }, + { + // Polynomial: 16 + 82518, // lfsr bits: 0b00000011100101100 + 72225, // lfsr bits: 0b00000110101000011 + 56727, // lfsr bits: 0b00001011100000110 + 85951, // lfsr bits: 0b00001110111110011 + 27520, // lfsr bits: 0b00010001110001101 + 51593, // lfsr bits: 0b00010110010111110 + 34380, // lfsr bits: 0b00011000111000110 + 15500, // lfsr bits: 0b00011111011100111 + 48143, // lfsr bits: 0b00100010000001010 + 73898, // lfsr bits: 0b00100100000001100 + 22355, // lfsr bits: 0b00101010010101011 + 94512, // lfsr bits: 0b00101111010010101 + 101408, // lfsr bits: 0b00110010011111111 + 36062, // lfsr bits: 0b00110110001000011 + 8579, // lfsr bits: 0b00111001010100100 + 3483, // lfsr bits: 0b00111111011111111 + 53308, // lfsr bits: 0b01000001011001001 + 17170, // lfsr bits: 0b01000110100001001 + 35, // lfsr bits: 0b01001011100001000 + 39535, // lfsr bits: 0b01001101010010111 + 29193, // lfsr bits: 0b01010010011100010 + 91056, // lfsr bits: 0b01010110100000010 + 24089, // lfsr bits: 0b01011001001100000 + 32671, // lfsr bits: 0b01011101100000001 + 43005, // lfsr bits: 0b01100010110000001 + 6896, // lfsr bits: 0b01100111111001100 + 96258, // lfsr bits: 0b01101001010111111 + 104846, // lfsr bits: 0b01101110100110010 + 44665, // lfsr bits: 0b01110011010011001 + 58406, // lfsr bits: 0b01110101001111111 + 108263, // lfsr bits: 0b01111000011100110 + 10344, // lfsr bits: 0b01111111000011101 + 92790, // lfsr bits: 0b10000011000111111 + 20666, // lfsr bits: 0b10000100111111011 + 89394, // lfsr bits: 0b10001001010100111 + 66985, // lfsr bits: 0b10001110010010111 + 54981, // lfsr bits: 0b10010011001011011 + 5187, // lfsr bits: 0b10010101100101101 + 75606, // lfsr bits: 0b10011000111111110 + 46395, // lfsr bits: 0b10011110001010100 + 60184, // lfsr bits: 0b10100000000111111 + 12002, // lfsr bits: 0b10100100001001101 + 103084, // lfsr bits: 0b10101000100001111 + 25775, // lfsr bits: 0b10101111111111001 + 1691, // lfsr bits: 0b10110011100101111 + 68756, // lfsr bits: 0b10110110110111010 + 49869, // lfsr bits: 0b10111010000011110 + 13755, // lfsr bits: 0b10111100100011011 + 37809, // lfsr bits: 0b11000001001110100 + 77384, // lfsr bits: 0b11000111010101000 + 99660, // lfsr bits: 0b11001010110100001 + 30914, // lfsr bits: 0b11001101011100000 + 63619, // lfsr bits: 0b11010010010010000 + 65305, // lfsr bits: 0b11010101011000000 + 41286, // lfsr bits: 0b11011011110000110 + 106545, // lfsr bits: 0b11011110100101101 + 79052, // lfsr bits: 0b11100000110000010 + 70499, // lfsr bits: 0b11100110100010000 + 87653, // lfsr bits: 0b11101010110111000 + 97952, // lfsr bits: 0b11101110010101011 + 61896, // lfsr bits: 0b11110010011001100 + 84194, // lfsr bits: 0b11110101000111010 + 80742, // lfsr bits: 0b11111011110010000 + 18909, // lfsr bits: 0b11111101110101000 + }, + { + // Polynomial: 17 + 51596, // lfsr bits: 0b00000000111110001 + 3447, // lfsr bits: 0b00000100011101100 + 25814, // lfsr bits: 0b00001010000100101 + 6879, // lfsr bits: 0b00001100110100011 + 36102, // lfsr bits: 0b00010010000000111 + 61878, // lfsr bits: 0b00010100111100100 + 18938, // lfsr bits: 0b00011001000011000 + 91056, // lfsr bits: 0b00011111011111010 + 20622, // lfsr bits: 0b00100010010111111 + 96238, // lfsr bits: 0b00100110001010101 + 73878, // lfsr bits: 0b00101011010010001 + 44690, // lfsr bits: 0b00101100000111111 + 99658, // lfsr bits: 0b00110010101000001 + 77350, // lfsr bits: 0b00110111101100111 + 89366, // lfsr bits: 0b00111000100101100 + 5128, // lfsr bits: 0b00111110001100101 + 24064, // lfsr bits: 0b01000001110010011 + 85902, // lfsr bits: 0b01000100000000000 + 37841, // lfsr bits: 0b01001000001101011 + 54984, // lfsr bits: 0b01001100111001100 + 80828, // lfsr bits: 0b01010010100101011 + 63589, // lfsr bits: 0b01010111001110111 + 41257, // lfsr bits: 0b01011001001101000 + 104851, // lfsr bits: 0b01011111101001001 + 87688, // lfsr bits: 0b01100011111110100 + 8584, // lfsr bits: 0b01100111000001000 + 53293, // lfsr bits: 0b01101011011001110 + 22332, // lfsr bits: 0b01101101000101000 + 56723, // lfsr bits: 0b01110011010011100 + 1759, // lfsr bits: 0b01110110010001011 + 32628, // lfsr bits: 0b01111011101010111 + 92828, // lfsr bits: 0b01111101101011101 + 65315, // lfsr bits: 0b10000010111100010 + 39524, // lfsr bits: 0b10000110101001001 + 10321, // lfsr bits: 0b10001011100111100 + 17200, // lfsr bits: 0b10001100011000100 + 60172, // lfsr bits: 0b10010001101101110 + 23, // lfsr bits: 0b10010111001000101 + 29246, // lfsr bits: 0b10011010111101000 + 34386, // lfsr bits: 0b10011111101101000 + 97946, // lfsr bits: 0b10100000000011100 + 48124, // lfsr bits: 0b10100111000010111 + 11988, // lfsr bits: 0b10101001011010111 + 42948, // lfsr bits: 0b10101110000000101 + 79104, // lfsr bits: 0b10110010101001001 + 94511, // lfsr bits: 0b10110110000010101 + 13793, // lfsr bits: 0b10111000010110101 + 68795, // lfsr bits: 0b10111101010001111 + 27503, // lfsr bits: 0b11000001111000101 + 15480, // lfsr bits: 0b11000101000101100 + 70451, // lfsr bits: 0b11001000011010110 + 49870, // lfsr bits: 0b11001101001110011 + 46416, // lfsr bits: 0b11010011110110010 + 67043, // lfsr bits: 0b11010111100010011 + 75631, // lfsr bits: 0b11011010111000111 + 108285, // lfsr bits: 0b11011100101110100 + 72224, // lfsr bits: 0b11100010001100110 + 106577, // lfsr bits: 0b11100110000001011 + 84205, // lfsr bits: 0b11101000010101001 + 103110, // lfsr bits: 0b11101111111110000 + 101386, // lfsr bits: 0b11110001010100001 + 58467, // lfsr bits: 0b11110110010001011 + 30956, // lfsr bits: 0b11111000011000101 + 82468, // lfsr bits: 0b11111101110100001 + }, + { + // Polynomial: 18 + 79075, // lfsr bits: 0b00000001100000101 + 42928, // lfsr bits: 0b00000111011100100 + 39485, // lfsr bits: 0b00001010111011101 + 36107, // lfsr bits: 0b00001101110011011 + 60146, // lfsr bits: 0b00010010000101100 + 68788, // lfsr bits: 0b00010111111000011 + 87661, // lfsr bits: 0b00011010011001110 + 13790, // lfsr bits: 0b00011100111011110 + 56720, // lfsr bits: 0b00100010000111011 + 106514, // lfsr bits: 0b00100111100010111 + 58472, // lfsr bits: 0b00101000111011100 + 30943, // lfsr bits: 0b00101110001011001 + 51565, // lfsr bits: 0b00110011011011011 + 108281, // lfsr bits: 0b00110101000101011 + 96243, // lfsr bits: 0b00111011101011100 + 6886, // lfsr bits: 0b00111111010101111 + 43, // lfsr bits: 0b01000001101001010 + 3483, // lfsr bits: 0b01000110001101010 + 15439, // lfsr bits: 0b01001010111001100 + 63573, // lfsr bits: 0b01001111010111001 + 91124, // lfsr bits: 0b01010001000100011 + 65314, // lfsr bits: 0b01010101011000000 + 99695, // lfsr bits: 0b01011010000000001 + 104874, // lfsr bits: 0b01011110000011111 + 97948, // lfsr bits: 0b01100011110101000 + 37847, // lfsr bits: 0b01100101101011000 + 89345, // lfsr bits: 0b01101011100001010 + 17182, // lfsr bits: 0b01101100100001101 + 1744, // lfsr bits: 0b01110000001110111 + 27469, // lfsr bits: 0b01110101101001111 + 41236, // lfsr bits: 0b01111010011011011 + 61857, // lfsr bits: 0b01111110101000110 + 92795, // lfsr bits: 0b10000001111110011 + 34378, // lfsr bits: 0b10000100010111010 + 46424, // lfsr bits: 0b10001001100001011 + 18938, // lfsr bits: 0b10001110101000101 + 101397, // lfsr bits: 0b10010001011110101 + 94549, // lfsr bits: 0b10010110000111100 + 67036, // lfsr bits: 0b10011010001011001 + 82514, // lfsr bits: 0b10011100010000011 + 32635, // lfsr bits: 0b10100000001001001 + 22309, // lfsr bits: 0b10100110011111100 + 12054, // lfsr bits: 0b10101001001011010 + 103115, // lfsr bits: 0b10101100011000101 + 72142, // lfsr bits: 0b10110000100110011 + 49837, // lfsr bits: 0b10110110011010101 + 48147, // lfsr bits: 0b10111001101000001 + 10321, // lfsr bits: 0b10111101100100000 + 84192, // lfsr bits: 0b11000010100100010 + 44691, // lfsr bits: 0b11000110000011111 + 73908, // lfsr bits: 0b11001010101110110 + 8555, // lfsr bits: 0b11001101101111010 + 20626, // lfsr bits: 0b11010000110100010 + 85987, // lfsr bits: 0b11010110010000100 + 75631, // lfsr bits: 0b11011000010100101 + 5149, // lfsr bits: 0b11011110000100101 + 77358, // lfsr bits: 0b11100010111000110 + 80768, // lfsr bits: 0b11100101001101000 + 55004, // lfsr bits: 0b11101000110100001 + 25791, // lfsr bits: 0b11101111011001101 + 53244, // lfsr bits: 0b11110010011101011 + 70440, // lfsr bits: 0b11110101001001111 + 29180, // lfsr bits: 0b11111000101101100 + 24021, // lfsr bits: 0b11111101001101101 + }, + { + // Polynomial: 19 + 46364, // lfsr bits: 0b00000010111111011 + 8586, // lfsr bits: 0b00000110111111010 + 55013, // lfsr bits: 0b00001011110101101 + 12, // lfsr bits: 0b00001111111010011 + 53239, // lfsr bits: 0b00010001111101010 + 37816, // lfsr bits: 0b00010110101111001 + 44654, // lfsr bits: 0b00011010100101110 + 3468, // lfsr bits: 0b00011100011010011 + 70458, // lfsr bits: 0b00100001011010001 + 89360, // lfsr bits: 0b00100101110111101 + 92851, // lfsr bits: 0b00101011001101000 + 36063, // lfsr bits: 0b00101101101001110 + 22353, // lfsr bits: 0b00110011110100111 + 30922, // lfsr bits: 0b00110101110100010 + 80741, // lfsr bits: 0b00111001000010001 + 91096, // lfsr bits: 0b00111110000000010 + 103112, // lfsr bits: 0b01000010010011110 + 67001, // lfsr bits: 0b01000100111001101 + 1686, // lfsr bits: 0b01001010111111110 + 34337, // lfsr bits: 0b01001101011101010 + 32672, // lfsr bits: 0b01010010110110011 + 48144, // lfsr bits: 0b01010101111000100 + 27478, // lfsr bits: 0b01011010101000111 + 68743, // lfsr bits: 0b01011111010001101 + 73866, // lfsr bits: 0b01100010101110011 + 84182, // lfsr bits: 0b01100101101011101 + 42959, // lfsr bits: 0b01101000000111101 + 41287, // lfsr bits: 0b01101111001111100 + 97942, // lfsr bits: 0b01110011101101111 + 24073, // lfsr bits: 0b01110110111011011 + 101435, // lfsr bits: 0b01111011101000010 + 96244, // lfsr bits: 0b01111100100101010 + 12025, // lfsr bits: 0b10000011110001111 + 65325, // lfsr bits: 0b10000101011001101 + 18916, // lfsr bits: 0b10001000010110100 + 60178, // lfsr bits: 0b10001111011001010 + 51583, // lfsr bits: 0b10010001100010011 + 39533, // lfsr bits: 0b10010100101001101 + 61896, // lfsr bits: 0b10011001100100011 + 99682, // lfsr bits: 0b10011101011110111 + 5144, // lfsr bits: 0b10100000011001110 + 58441, // lfsr bits: 0b10100111010011101 + 106596, // lfsr bits: 0b10101011100001000 + 72188, // lfsr bits: 0b10101100001111000 + 20635, // lfsr bits: 0b10110000111010101 + 82509, // lfsr bits: 0b10110110010001101 + 87663, // lfsr bits: 0b10111010111010011 + 63605, // lfsr bits: 0b10111101001100001 + 17219, // lfsr bits: 0b11000001101110011 + 29185, // lfsr bits: 0b11000110110101001 + 49818, // lfsr bits: 0b11001000110001100 + 25779, // lfsr bits: 0b11001101000110000 + 15463, // lfsr bits: 0b11010001100110010 + 13728, // lfsr bits: 0b11010101001111101 + 10324, // lfsr bits: 0b11011000110111101 + 108305, // lfsr bits: 0b11011101010100010 + 75616, // lfsr bits: 0b11100001000100110 + 104877, // lfsr bits: 0b11100110011110001 + 85903, // lfsr bits: 0b11101011011011100 + 6883, // lfsr bits: 0b11101100011000010 + 79059, // lfsr bits: 0b11110011010100010 + 56706, // lfsr bits: 0b11110101011010101 + 94499, // lfsr bits: 0b11111001001010111 + 77371, // lfsr bits: 0b11111101000011000 + }, + { + // Polynomial: 20 + 25804, // lfsr bits: 0b00000010110111001 + 101376, // lfsr bits: 0b00000110011011000 + 84232, // lfsr bits: 0b00001001100011100 + 39547, // lfsr bits: 0b00001111000011110 + 46418, // lfsr bits: 0b00010000101111001 + 5130, // lfsr bits: 0b00010110011001100 + 6895, // lfsr bits: 0b00011011011101010 + 32666, // lfsr bits: 0b00011111101011010 + 79073, // lfsr bits: 0b00100001101101000 + 1735, // lfsr bits: 0b00100110001011000 + 67017, // lfsr bits: 0b00101000110100100 + 80768, // lfsr bits: 0b00101110100011001 + 97980, // lfsr bits: 0b00110000001111111 + 12004, // lfsr bits: 0b00110100101100100 + 3447, // lfsr bits: 0b00111000000101101 + 77298, // lfsr bits: 0b00111111011100100 + 91096, // lfsr bits: 0b01000001000110101 + 56703, // lfsr bits: 0b01000100001001011 + 96223, // lfsr bits: 0b01001001110111100 + 61843, // lfsr bits: 0b01001100000101101 + 36112, // lfsr bits: 0b01010000001110111 + 41225, // lfsr bits: 0b01010110000100111 + 73862, // lfsr bits: 0b01011011011111100 + 37809, // lfsr bits: 0b01011110011001111 + 48125, // lfsr bits: 0b01100011001010011 + 36, // lfsr bits: 0b01100100010001111 + 87675, // lfsr bits: 0b01101000011000010 + 103123, // lfsr bits: 0b01101110011101000 + 60191, // lfsr bits: 0b01110001101010100 + 49825, // lfsr bits: 0b01110111001000000 + 104850, // lfsr bits: 0b01111000110100111 + 18926, // lfsr bits: 0b01111110011100100 + 58417, // lfsr bits: 0b10000010011100110 + 22325, // lfsr bits: 0b10000101111100000 + 53277, // lfsr bits: 0b10001010101011101 + 44674, // lfsr bits: 0b10001111001110110 + 29217, // lfsr bits: 0b10010000100110001 + 85965, // lfsr bits: 0b10010111011110101 + 27515, // lfsr bits: 0b10011001000101010 + 68719, // lfsr bits: 0b10011101100001101 + 63562, // lfsr bits: 0b10100011000110010 + 108325, // lfsr bits: 0b10100101001011111 + 70459, // lfsr bits: 0b10101000101110111 + 42923, // lfsr bits: 0b10101111000000111 + 92816, // lfsr bits: 0b10110010011010011 + 8585, // lfsr bits: 0b10110111000000111 + 13752, // lfsr bits: 0b10111001100011000 + 82524, // lfsr bits: 0b10111111111000100 + 89402, // lfsr bits: 0b11000000101011001 + 24096, // lfsr bits: 0b11000111011111001 + 99699, // lfsr bits: 0b11001011100000001 + 30934, // lfsr bits: 0b11001111011110010 + 65324, // lfsr bits: 0b11010001011100011 + 17193, // lfsr bits: 0b11010101000111110 + 72181, // lfsr bits: 0b11011001010001111 + 75598, // lfsr bits: 0b11011101101010000 + 51551, // lfsr bits: 0b11100011101101101 + 20614, // lfsr bits: 0b11100100011010001 + 94501, // lfsr bits: 0b11101011111001101 + 10309, // lfsr bits: 0b11101110000101000 + 15446, // lfsr bits: 0b11110010010111110 + 106541, // lfsr bits: 0b11110111000001000 + 34391, // lfsr bits: 0b11111011110111011 + 55000, // lfsr bits: 0b11111100100110110 + }, + { + // Polynomial: 21 + 10341, // lfsr bits: 0b00000011110100001 + 87613, // lfsr bits: 0b00000110010100101 + 97984, // lfsr bits: 0b00001000011011100 + 39534, // lfsr bits: 0b00001110011110101 + 92810, // lfsr bits: 0b00010000101100111 + 13732, // lfsr bits: 0b00010100111101011 + 37776, // lfsr bits: 0b00011010001000111 + 46370, // lfsr bits: 0b00011111101111010 + 25777, // lfsr bits: 0b00100001110101110 + 103139, // lfsr bits: 0b00100100110101010 + 18897, // lfsr bits: 0b00101001100110111 + 60170, // lfsr bits: 0b00101110100000000 + 72171, // lfsr bits: 0b00110011101010001 + 75660, // lfsr bits: 0b00110111000010001 + 12051, // lfsr bits: 0b00111010000010101 + 84246, // lfsr bits: 0b00111101101001010 + 49843, // lfsr bits: 0b01000011110011101 + 65326, // lfsr bits: 0b01000111111000101 + 27500, // lfsr bits: 0b01001011110111011 + 58424, // lfsr bits: 0b01001111100111010 + 44666, // lfsr bits: 0b01010000101011111 + 101423, // lfsr bits: 0b01010111000101110 + 67016, // lfsr bits: 0b01011010100010011 + 85943, // lfsr bits: 0b01011100101110011 + 8571, // lfsr bits: 0b01100000100101000 + 96249, // lfsr bits: 0b01100101001011001 + 3408, // lfsr bits: 0b01101001001011101 + 30956, // lfsr bits: 0b01101110001101000 + 20613, // lfsr bits: 0b01110000101010010 + 51568, // lfsr bits: 0b01110110110100000 + 6875, // lfsr bits: 0b01111011101100000 + 41266, // lfsr bits: 0b01111111000010100 + 17209, // lfsr bits: 0b10000010111110000 + 104874, // lfsr bits: 0b10000111110000100 + 77353, // lfsr bits: 0b10001011111110000 + 79039, // lfsr bits: 0b10001111010110110 + 70429, // lfsr bits: 0b10010001010100000 + 22358, // lfsr bits: 0b10010100110111110 + 108264, // lfsr bits: 0b10011001110100100 + 82522, // lfsr bits: 0b10011101111110111 + 63582, // lfsr bits: 0b10100011001111101 + 36100, // lfsr bits: 0b10100110110110111 + 29188, // lfsr bits: 0b10101000011110110 + 73931, // lfsr bits: 0b10101111100110010 + 34367, // lfsr bits: 0b10110000101001000 + 1717, // lfsr bits: 0b10110100110100101 + 56754, // lfsr bits: 0b10111000110111010 + 15466, // lfsr bits: 0b10111111011010100 + 42990, // lfsr bits: 0b11000011011111000 + 32636, // lfsr bits: 0b11000110010101010 + 91062, // lfsr bits: 0b11001001101110000 + 94525, // lfsr bits: 0b11001100100010110 + 19, // lfsr bits: 0b11010001111101001 + 48132, // lfsr bits: 0b11010100100011111 + 5207, // lfsr bits: 0b11011011010010011 + 89351, // lfsr bits: 0b11011100000110010 + 106550, // lfsr bits: 0b11100000101001101 + 24053, // lfsr bits: 0b11100101010100011 + 80788, // lfsr bits: 0b11101001001011100 + 54980, // lfsr bits: 0b11101100101101011 + 68768, // lfsr bits: 0b11110011110111100 + 53320, // lfsr bits: 0b11110100110011100 + 61925, // lfsr bits: 0b11111010111100010 + 99688, // lfsr bits: 0b11111110011100100 + }, + { + // Polynomial: 22 + 82509, // lfsr bits: 0b00000001110101011 + 15477, // lfsr bits: 0b00000100100100100 + 103090, // lfsr bits: 0b00001000100010111 + 92774, // lfsr bits: 0b00001110011011000 + 61849, // lfsr bits: 0b00010010101000101 + 6907, // lfsr bits: 0b00010111111101110 + 29225, // lfsr bits: 0b00011010011100010 + 8573, // lfsr bits: 0b00011111001110110 + 79096, // lfsr bits: 0b00100011101010000 + 14, // lfsr bits: 0b00100100010111010 + 97948, // lfsr bits: 0b00101010100001011 + 94517, // lfsr bits: 0b00101110000010000 + 56681, // lfsr bits: 0b00110000111110111 + 67049, // lfsr bits: 0b00110101010001010 + 80774, // lfsr bits: 0b00111010001111110 + 85979, // lfsr bits: 0b00111101011010110 + 12036, // lfsr bits: 0b01000011111101001 + 77318, // lfsr bits: 0b01000111001100100 + 58436, // lfsr bits: 0b01001000000110110 + 75624, // lfsr bits: 0b01001100011110001 + 68772, // lfsr bits: 0b01010001010000010 + 63608, // lfsr bits: 0b01010100001111101 + 36087, // lfsr bits: 0b01011001000001000 + 72207, // lfsr bits: 0b01011110110010100 + 91083, // lfsr bits: 0b01100001000010100 + 17230, // lfsr bits: 0b01100100001011001 + 27492, // lfsr bits: 0b01101010110011011 + 99688, // lfsr bits: 0b01101111011101101 + 34361, // lfsr bits: 0b01110001011110001 + 5186, // lfsr bits: 0b01110111100011100 + 32696, // lfsr bits: 0b01111011001010101 + 70444, // lfsr bits: 0b01111110011110101 + 44690, // lfsr bits: 0b10000000110100010 + 20622, // lfsr bits: 0b10000110000011111 + 49852, // lfsr bits: 0b10001001101011100 + 106515, // lfsr bits: 0b10001101001000010 + 18944, // lfsr bits: 0b10010011001111011 + 46427, // lfsr bits: 0b10010101111010101 + 1696, // lfsr bits: 0b10011011010110111 + 39567, // lfsr bits: 0b10011111010111010 + 51534, // lfsr bits: 0b10100011100111101 + 22301, // lfsr bits: 0b10100111111011001 + 10307, // lfsr bits: 0b10101001000001111 + 65326, // lfsr bits: 0b10101110000001000 + 60108, // lfsr bits: 0b10110010110110100 + 30938, // lfsr bits: 0b10110101000111010 + 53267, // lfsr bits: 0b10111001000010001 + 89334, // lfsr bits: 0b10111100001011010 + 25783, // lfsr bits: 0b11000001011111011 + 24058, // lfsr bits: 0b11000100011000010 + 48136, // lfsr bits: 0b11001001101110001 + 3414, // lfsr bits: 0b11001101011011100 + 73909, // lfsr bits: 0b11010011001101001 + 87639, // lfsr bits: 0b11010101011001010 + 43008, // lfsr bits: 0b11011010010001101 + 84233, // lfsr bits: 0b11011110011100010 + 108258, // lfsr bits: 0b11100000110000001 + 41275, // lfsr bits: 0b11100111100000011 + 96227, // lfsr bits: 0b11101000111110000 + 54999, // lfsr bits: 0b11101111101111000 + 101417, // lfsr bits: 0b11110010100101100 + 13766, // lfsr bits: 0b11110101101100110 + 104835, // lfsr bits: 0b11111010010010000 + 37799, // lfsr bits: 0b11111100101010000 + }, + { + // Polynomial: 23 + 58414, // lfsr bits: 0b00000011011111100 + 70453, // lfsr bits: 0b00000101011111100 + 108296, // lfsr bits: 0b00001010011001000 + 24048, // lfsr bits: 0b00001110001100111 + 49876, // lfsr bits: 0b00010000100100001 + 85902, // lfsr bits: 0b00010101101101110 + 32633, // lfsr bits: 0b00011000111111001 + 39519, // lfsr bits: 0b00011110101001000 + 41208, // lfsr bits: 0b00100000101111000 + 77326, // lfsr bits: 0b00100110100000001 + 92795, // lfsr bits: 0b00101010110111100 + 18926, // lfsr bits: 0b00101100001000110 + 22354, // lfsr bits: 0b00110001111000001 + 89368, // lfsr bits: 0b00110100010100010 + 94522, // lfsr bits: 0b00111001011010101 + 1729, // lfsr bits: 0b00111111001110011 + 96250, // lfsr bits: 0b01000010100110011 + 63606, // lfsr bits: 0b01000110000010001 + 61899, // lfsr bits: 0b01001011111010001 + 54975, // lfsr bits: 0b01001100110111010 + 99676, // lfsr bits: 0b01010001111110010 + 80772, // lfsr bits: 0b01010110101111011 + 17, // lfsr bits: 0b01011011110001001 + 53237, // lfsr bits: 0b01011110000011001 + 15454, // lfsr bits: 0b01100000010000111 + 65304, // lfsr bits: 0b01100111000100110 + 10304, // lfsr bits: 0b01101001111000011 + 25795, // lfsr bits: 0b01101111000111110 + 101385, // lfsr bits: 0b01110010111100010 + 75595, // lfsr bits: 0b01110101010101101 + 48079, // lfsr bits: 0b01111000011100000 + 44689, // lfsr bits: 0b01111111010001001 + 82508, // lfsr bits: 0b10000010110111011 + 34394, // lfsr bits: 0b10000111111101101 + 87656, // lfsr bits: 0b10001000011110010 + 29189, // lfsr bits: 0b10001101100100100 + 84200, // lfsr bits: 0b10010011110100110 + 12031, // lfsr bits: 0b10010101110111101 + 17186, // lfsr bits: 0b10011010110010101 + 72232, // lfsr bits: 0b10011100011101011 + 3461, // lfsr bits: 0b10100010100011000 + 30896, // lfsr bits: 0b10100101101100001 + 13751, // lfsr bits: 0b10101000011100010 + 46408, // lfsr bits: 0b10101111000001011 + 8589, // lfsr bits: 0b10110000111110110 + 106596, // lfsr bits: 0b10110111101011010 + 79079, // lfsr bits: 0b10111010000101101 + 36088, // lfsr bits: 0b10111100010111000 + 56754, // lfsr bits: 0b11000010100111010 + 51607, // lfsr bits: 0b11000110100100001 + 42977, // lfsr bits: 0b11001011010111001 + 104823, // lfsr bits: 0b11001110111011011 + 68771, // lfsr bits: 0b11010001101011010 + 73894, // lfsr bits: 0b11010100000110110 + 66992, // lfsr bits: 0b11011010101101000 + 103153, // lfsr bits: 0b11011111011011010 + 5166, // lfsr bits: 0b11100000001010011 + 91071, // lfsr bits: 0b11100110111110000 + 60145, // lfsr bits: 0b11101000101100010 + 6888, // lfsr bits: 0b11101100001101010 + 37812, // lfsr bits: 0b11110011111011100 + 97942, // lfsr bits: 0b11110101110111100 + 20627, // lfsr bits: 0b11111010010011001 + 27485, // lfsr bits: 0b11111100010110100 + }, + { + // Polynomial: 24 + 94577, // lfsr bits: 0b00000000010101110 + 11, // lfsr bits: 0b00000111000000110 + 44702, // lfsr bits: 0b00001011111001001 + 17189, // lfsr bits: 0b00001111001100010 + 91089, // lfsr bits: 0b00010010000110111 + 58442, // lfsr bits: 0b00010111111011011 + 67054, // lfsr bits: 0b00011011010001000 + 96282, // lfsr bits: 0b00011100001110011 + 34380, // lfsr bits: 0b00100010010001111 + 12005, // lfsr bits: 0b00100111110010101 + 53265, // lfsr bits: 0b00101010011101010 + 39544, // lfsr bits: 0b00101101011011101 + 61894, // lfsr bits: 0b00110010100100010 + 20624, // lfsr bits: 0b00110100111000101 + 103132, // lfsr bits: 0b00111010111111000 + 48101, // lfsr bits: 0b00111111101110110 + 85935, // lfsr bits: 0b01000011101000010 + 79022, // lfsr bits: 0b01000101010000111 + 108270, // lfsr bits: 0b01001000000010000 + 3408, // lfsr bits: 0b01001111001011011 + 32666, // lfsr bits: 0b01010000100110111 + 42971, // lfsr bits: 0b01010101011111110 + 106553, // lfsr bits: 0b01011010001101111 + 10344, // lfsr bits: 0b01011101110000101 + 37772, // lfsr bits: 0b01100000011001000 + 6874, // lfsr bits: 0b01100100011100110 + 104885, // lfsr bits: 0b01101011001110110 + 8587, // lfsr bits: 0b01101111110000001 + 97983, // lfsr bits: 0b01110010111010000 + 80774, // lfsr bits: 0b01110111101100011 + 49821, // lfsr bits: 0b01111011000001011 + 46390, // lfsr bits: 0b01111101100110000 + 77342, // lfsr bits: 0b10000001110111100 + 51538, // lfsr bits: 0b10000111010011000 + 29220, // lfsr bits: 0b10001001010111110 + 101409, // lfsr bits: 0b10001101101100101 + 68779, // lfsr bits: 0b10010001010101010 + 13713, // lfsr bits: 0b10010100000000110 + 75627, // lfsr bits: 0b10011010011011011 + 15471, // lfsr bits: 0b10011101111000010 + 70424, // lfsr bits: 0b10100000100000100 + 1725, // lfsr bits: 0b10100111110101110 + 41240, // lfsr bits: 0b10101000100110000 + 87646, // lfsr bits: 0b10101111001101110 + 18913, // lfsr bits: 0b10110001110111111 + 82511, // lfsr bits: 0b10110110011111111 + 27535, // lfsr bits: 0b10111001001010110 + 99668, // lfsr bits: 0b10111110011100100 + 89386, // lfsr bits: 0b11000000110110011 + 73904, // lfsr bits: 0b11000100110000001 + 25781, // lfsr bits: 0b11001000010000010 + 60153, // lfsr bits: 0b11001101101111101 + 92807, // lfsr bits: 0b11010001100001000 + 72179, // lfsr bits: 0b11010101111011101 + 30935, // lfsr bits: 0b11011011110010011 + 36062, // lfsr bits: 0b11011110101100010 + 5156, // lfsr bits: 0b11100001100001101 + 22333, // lfsr bits: 0b11100100001110000 + 55019, // lfsr bits: 0b11101011001110111 + 56716, // lfsr bits: 0b11101100001110001 + 65281, // lfsr bits: 0b11110011000001100 + 63631, // lfsr bits: 0b11110100110010001 + 24058, // lfsr bits: 0b11111000100010011 + 84221, // lfsr bits: 0b11111100111110101 + }, + { + // Polynomial: 25 + 30946, // lfsr bits: 0b00000001010110110 + 103087, // lfsr bits: 0b00000100001001001 + 106578, // lfsr bits: 0b00001001101000110 + 36084, // lfsr bits: 0b00001100100101101 + 92818, // lfsr bits: 0b00010000001011100 + 1704, // lfsr bits: 0b00010110101110111 + 48127, // lfsr bits: 0b00011011111001111 + 67021, // lfsr bits: 0b00011111000010011 + 72206, // lfsr bits: 0b00100010001000101 + 97986, // lfsr bits: 0b00100100101111011 + 14, // lfsr bits: 0b00101011001001011 + 101389, // lfsr bits: 0b00101110110001110 + 12033, // lfsr bits: 0b00110011100101010 + 24079, // lfsr bits: 0b00110111101110100 + 44700, // lfsr bits: 0b00111010011000001 + 18898, // lfsr bits: 0b00111101010011000 + 91082, // lfsr bits: 0b01000011101011001 + 77315, // lfsr bits: 0b01000101011001111 + 51600, // lfsr bits: 0b01001011111100100 + 108269, // lfsr bits: 0b01001111001011111 + 82477, // lfsr bits: 0b01010000110000000 + 80793, // lfsr bits: 0b01010111110001010 + 8608, // lfsr bits: 0b01011000100111010 + 46370, // lfsr bits: 0b01011110010101101 + 25744, // lfsr bits: 0b01100011111101000 + 70503, // lfsr bits: 0b01100110100101001 + 75607, // lfsr bits: 0b01101000100011001 + 15492, // lfsr bits: 0b01101100100001100 + 53253, // lfsr bits: 0b01110010110110001 + 39566, // lfsr bits: 0b01110101110001011 + 58438, // lfsr bits: 0b01111001110011100 + 85934, // lfsr bits: 0b01111101111010111 + 94540, // lfsr bits: 0b10000001000111101 + 65317, // lfsr bits: 0b10000101001100100 + 22333, // lfsr bits: 0b10001000000001010 + 61903, // lfsr bits: 0b10001111000011010 + 17171, // lfsr bits: 0b10010001010111101 + 13740, // lfsr bits: 0b10010100000110001 + 87648, // lfsr bits: 0b10011001001111010 + 49863, // lfsr bits: 0b10011100111000101 + 10311, // lfsr bits: 0b10100001101100011 + 63567, // lfsr bits: 0b10100100010011010 + 20660, // lfsr bits: 0b10101000011110101 + 32677, // lfsr bits: 0b10101111000010000 + 29226, // lfsr bits: 0b10110010100001000 + 68752, // lfsr bits: 0b10110111101001100 + 73915, // lfsr bits: 0b10111010000101001 + 42982, // lfsr bits: 0b10111111011011011 + 99692, // lfsr bits: 0b11000000100101011 + 27477, // lfsr bits: 0b11000100100101011 + 37807, // lfsr bits: 0b11001010110001110 + 41245, // lfsr bits: 0b11001101101001000 + 104878, // lfsr bits: 0b11010000000100101 + 6869, // lfsr bits: 0b11010101001000110 + 60155, // lfsr bits: 0b11011000001110010 + 5131, // lfsr bits: 0b11011110110110011 + 79053, // lfsr bits: 0b11100001010100001 + 56721, // lfsr bits: 0b11100101100111010 + 96248, // lfsr bits: 0b11101011111100111 + 84259, // lfsr bits: 0b11101100101011111 + 89417, // lfsr bits: 0b11110010101001100 + 34385, // lfsr bits: 0b11110110110101100 + 3452, // lfsr bits: 0b11111000011011011 + 55011, // lfsr bits: 0b11111101111101100 + }, + { + // Polynomial: 26 + 92853, // lfsr bits: 0b00000001100000011 + 96241, // lfsr bits: 0b00000110101001011 + 10298, // lfsr bits: 0b00001010010100001 + 13775, // lfsr bits: 0b00001101110000000 + 37820, // lfsr bits: 0b00010011000111111 + 17226, // lfsr bits: 0b00010101110010110 + 108323, // lfsr bits: 0b00011000001100100 + 103135, // lfsr bits: 0b00011101101010111 + 48105, // lfsr bits: 0b00100010111110110 + 14, // lfsr bits: 0b00100101100100011 + 63610, // lfsr bits: 0b00101000100111100 + 79065, // lfsr bits: 0b00101110101001110 + 54973, // lfsr bits: 0b00110001000011010 + 70451, // lfsr bits: 0b00110101011010000 + 41272, // lfsr bits: 0b00111000001001011 + 49816, // lfsr bits: 0b00111100100000001 + 3390, // lfsr bits: 0b01000000101001110 + 42936, // lfsr bits: 0b01000101100101001 + 91143, // lfsr bits: 0b01001011100111101 + 56742, // lfsr bits: 0b01001111111000110 + 24064, // lfsr bits: 0b01010011010010010 + 12078, // lfsr bits: 0b01010100111000101 + 60193, // lfsr bits: 0b01011001101011000 + 5110, // lfsr bits: 0b01011111100010110 + 30954, // lfsr bits: 0b01100000111100101 + 46393, // lfsr bits: 0b01100101010111111 + 80741, // lfsr bits: 0b01101000101011000 + 27459, // lfsr bits: 0b01101110100100100 + 34374, // lfsr bits: 0b01110001110000001 + 15466, // lfsr bits: 0b01110110010100011 + 61853, // lfsr bits: 0b01111000101011010 + 89369, // lfsr bits: 0b01111111101001101 + 8633, // lfsr bits: 0b10000000100011101 + 51535, // lfsr bits: 0b10000111110101000 + 101372, // lfsr bits: 0b10001001010010110 + 85918, // lfsr bits: 0b10001110110100000 + 36072, // lfsr bits: 0b10010000111010100 + 84210, // lfsr bits: 0b10010111010110101 + 6864, // lfsr bits: 0b10011000110111010 + 44708, // lfsr bits: 0b10011110010001101 + 99695, // lfsr bits: 0b10100010111010101 + 32654, // lfsr bits: 0b10100111111011111 + 72206, // lfsr bits: 0b10101001101101001 + 18880, // lfsr bits: 0b10101111000101100 + 73862, // lfsr bits: 0b10110011110111101 + 75624, // lfsr bits: 0b10110110111101111 + 25786, // lfsr bits: 0b10111000111010110 + 67049, // lfsr bits: 0b10111101000101011 + 22391, // lfsr bits: 0b11000000111110000 + 29197, // lfsr bits: 0b11000110101101100 + 53265, // lfsr bits: 0b11001011011010111 + 1713, // lfsr bits: 0b11001101001011010 + 65319, // lfsr bits: 0b11010011011011110 + 77366, // lfsr bits: 0b11010111101000010 + 68753, // lfsr bits: 0b11011011111110000 + 39501, // lfsr bits: 0b11011111010001110 + 94532, // lfsr bits: 0b11100010010010000 + 58457, // lfsr bits: 0b11100101010001011 + 104802, // lfsr bits: 0b11101010111000000 + 82537, // lfsr bits: 0b11101110111010010 + 97991, // lfsr bits: 0b11110001101100101 + 106599, // lfsr bits: 0b11110100111001100 + 87643, // lfsr bits: 0b11111001101011000 + 20622, // lfsr bits: 0b11111101001111100 + }, + { + // Polynomial: 27 + 60151, // lfsr bits: 0b00000010000011110 + 41273, // lfsr bits: 0b00000110111011000 + 25766, // lfsr bits: 0b00001011110111001 + 58435, // lfsr bits: 0b00001110000011111 + 70479, // lfsr bits: 0b00010000111000011 + 13, // lfsr bits: 0b00010111110000001 + 73918, // lfsr bits: 0b00011011000010010 + 68778, // lfsr bits: 0b00011111001010010 + 82522, // lfsr bits: 0b00100011111111011 + 49870, // lfsr bits: 0b00100101101010001 + 84213, // lfsr bits: 0b00101011010110111 + 36098, // lfsr bits: 0b00101101011011011 + 85912, // lfsr bits: 0b00110001001111100 + 13755, // lfsr bits: 0b00110110001100110 + 65294, // lfsr bits: 0b00111000010000101 + 29214, // lfsr bits: 0b00111111100111011 + 108285, // lfsr bits: 0b01000000100111011 + 24055, // lfsr bits: 0b01000111011110100 + 79088, // lfsr bits: 0b01001000000010101 + 106571, // lfsr bits: 0b01001110011111100 + 54999, // lfsr bits: 0b01010010011001100 + 77360, // lfsr bits: 0b01010100110011110 + 5190, // lfsr bits: 0b01011011100010100 + 63576, // lfsr bits: 0b01011111000000101 + 61874, // lfsr bits: 0b01100001110010111 + 1711, // lfsr bits: 0b01100101100001110 + 103112, // lfsr bits: 0b01101000111111010 + 104879, // lfsr bits: 0b01101100110100110 + 15513, // lfsr bits: 0b01110000011011001 + 96237, // lfsr bits: 0b01110110100110110 + 91085, // lfsr bits: 0b01111001001110101 + 34361, // lfsr bits: 0b01111110111010001 + 6849, // lfsr bits: 0b10000011000111011 + 20618, // lfsr bits: 0b10000101011001110 + 97968, // lfsr bits: 0b10001010000010011 + 30973, // lfsr bits: 0b10001101100001001 + 53300, // lfsr bits: 0b10010010110010000 + 46408, // lfsr bits: 0b10010110101100010 + 10316, // lfsr bits: 0b10011010011100011 + 27469, // lfsr bits: 0b10011110010000001 + 22360, // lfsr bits: 0b10100000100000111 + 80776, // lfsr bits: 0b10100111001101101 + 3430, // lfsr bits: 0b10101000000001110 + 32665, // lfsr bits: 0b10101111111011000 + 12019, // lfsr bits: 0b10110010011100110 + 37769, // lfsr bits: 0b10110101010001110 + 56724, // lfsr bits: 0b10111011001001111 + 51548, // lfsr bits: 0b10111100101000001 + 92781, // lfsr bits: 0b11000001010001011 + 44721, // lfsr bits: 0b11000110011000001 + 101414, // lfsr bits: 0b11001011011111110 + 94541, // lfsr bits: 0b11001111011110110 + 89372, // lfsr bits: 0b11010000001011101 + 87652, // lfsr bits: 0b11010111110111011 + 17170, // lfsr bits: 0b11011010010011010 + 42970, // lfsr bits: 0b11011111100010011 + 99705, // lfsr bits: 0b11100000101100010 + 18907, // lfsr bits: 0b11100111110011000 + 75625, // lfsr bits: 0b11101010100001101 + 67020, // lfsr bits: 0b11101110001011001 + 8597, // lfsr bits: 0b11110011000100100 + 48171, // lfsr bits: 0b11110110100011010 + 39532, // lfsr bits: 0b11111011000000001 + 72153, // lfsr bits: 0b11111101100000000 + }, + { + // Polynomial: 28 + 15434, // lfsr bits: 0b00000011101101101 + 103095, // lfsr bits: 0b00000111110001010 + 39544, // lfsr bits: 0b00001001100000101 + 12019, // lfsr bits: 0b00001111100001000 + 68773, // lfsr bits: 0b00010011111100000 + 27501, // lfsr bits: 0b00010101000111100 + 94495, // lfsr bits: 0b00011010100001111 + 46372, // lfsr bits: 0b00011111011101000 + 10307, // lfsr bits: 0b00100000011111000 + 72209, // lfsr bits: 0b00100110100010101 + 29210, // lfsr bits: 0b00101011001111100 + 65309, // lfsr bits: 0b00101111011101101 + 87633, // lfsr bits: 0b00110011110000100 + 20612, // lfsr bits: 0b00110101010111010 + 34380, // lfsr bits: 0b00111001111100010 + 24096, // lfsr bits: 0b00111101011101100 + 6847, // lfsr bits: 0b01000011110000010 + 32635, // lfsr bits: 0b01000110110110101 + 48134, // lfsr bits: 0b01001010110111100 + 80810, // lfsr bits: 0b01001100100101100 + 104870, // lfsr bits: 0b01010011010100011 + 82513, // lfsr bits: 0b01010111101111100 + 13763, // lfsr bits: 0b01011001001100101 + 70477, // lfsr bits: 0b01011111011001101 + 99695, // lfsr bits: 0b01100010111111110 + 53263, // lfsr bits: 0b01100100010111000 + 44721, // lfsr bits: 0b01101011111001011 + 63637, // lfsr bits: 0b01101111110001100 + 60124, // lfsr bits: 0b01110010111111110 + 27, // lfsr bits: 0b01110101000011101 + 25769, // lfsr bits: 0b01111001010011101 + 67038, // lfsr bits: 0b01111111001000010 + 75585, // lfsr bits: 0b10000001110001111 + 89350, // lfsr bits: 0b10000111110111011 + 56679, // lfsr bits: 0b10001001101110110 + 84206, // lfsr bits: 0b10001100111111110 + 92811, // lfsr bits: 0b10010000001001101 + 42960, // lfsr bits: 0b10010111001111011 + 3465, // lfsr bits: 0b10011000010110110 + 108250, // lfsr bits: 0b10011100001001011 + 5152, // lfsr bits: 0b10100000000000101 + 98010, // lfsr bits: 0b10100110111001000 + 30893, // lfsr bits: 0b10101011111001111 + 73885, // lfsr bits: 0b10101110101010011 + 96217, // lfsr bits: 0b10110000010010011 + 1699, // lfsr bits: 0b10110111100011111 + 36062, // lfsr bits: 0b10111000111101111 + 91063, // lfsr bits: 0b10111110001000010 + 77378, // lfsr bits: 0b11000010111111000 + 79053, // lfsr bits: 0b11000101111101001 + 101423, // lfsr bits: 0b11001000100101110 + 58452, // lfsr bits: 0b11001100000100111 + 37796, // lfsr bits: 0b11010010000111100 + 18913, // lfsr bits: 0b11010100010001000 + 106543, // lfsr bits: 0b11011010011110100 + 85903, // lfsr bits: 0b11011101001111101 + 8598, // lfsr bits: 0b11100011010111010 + 22353, // lfsr bits: 0b11100101010100000 + 55047, // lfsr bits: 0b11101000100110010 + 17159, // lfsr bits: 0b11101101111001100 + 41262, // lfsr bits: 0b11110010100110000 + 61912, // lfsr bits: 0b11110110001111001 + 51539, // lfsr bits: 0b11111001101100010 + 49808, // lfsr bits: 0b11111100010111000 + }, + { + // Polynomial: 29 + 82506, // lfsr bits: 0b00000010000111000 + 96232, // lfsr bits: 0b00000100111010001 + 36083, // lfsr bits: 0b00001010011010001 + 20661, // lfsr bits: 0b00001100111001101 + 15465, // lfsr bits: 0b00010001011000101 + 43, // lfsr bits: 0b00010111010001100 + 89388, // lfsr bits: 0b00011011000000111 + 70459, // lfsr bits: 0b00011110011011010 + 99722, // lfsr bits: 0b00100011101100100 + 87637, // lfsr bits: 0b00100110101010011 + 79022, // lfsr bits: 0b00101010011101110 + 6888, // lfsr bits: 0b00101111000100011 + 103079, // lfsr bits: 0b00110000000111110 + 13704, // lfsr bits: 0b00110100111100100 + 37808, // lfsr bits: 0b00111011111010000 + 29259, // lfsr bits: 0b00111100011101101 + 32655, // lfsr bits: 0b01000000111110100 + 80796, // lfsr bits: 0b01000111111011011 + 46445, // lfsr bits: 0b01001011111111011 + 18863, // lfsr bits: 0b01001100011101011 + 60187, // lfsr bits: 0b01010001001010011 + 73913, // lfsr bits: 0b01010110101100001 + 77348, // lfsr bits: 0b01011001011110000 + 44718, // lfsr bits: 0b01011110110001111 + 24043, // lfsr bits: 0b01100011101110001 + 53264, // lfsr bits: 0b01100111101011110 + 5170, // lfsr bits: 0b01101011001011011 + 56714, // lfsr bits: 0b01101100110101000 + 58428, // lfsr bits: 0b01110001000101010 + 61904, // lfsr bits: 0b01110101001100000 + 27522, // lfsr bits: 0b01111011001001101 + 92795, // lfsr bits: 0b01111111010101111 + 48114, // lfsr bits: 0b10000011111110010 + 94542, // lfsr bits: 0b10000111011010001 + 63592, // lfsr bits: 0b10001001111101101 + 42954, // lfsr bits: 0b10001101000010000 + 75668, // lfsr bits: 0b10010010001111110 + 104842, // lfsr bits: 0b10010111100100101 + 106529, // lfsr bits: 0b10011000010110111 + 10318, // lfsr bits: 0b10011100101010001 + 17161, // lfsr bits: 0b10100000111101110 + 84221, // lfsr bits: 0b10100101001000100 + 11991, // lfsr bits: 0b10101001001000001 + 108285, // lfsr bits: 0b10101111100100000 + 30927, // lfsr bits: 0b10110001011111011 + 91052, // lfsr bits: 0b10110111000101000 + 97996, // lfsr bits: 0b10111011001011010 + 25793, // lfsr bits: 0b10111101001110011 + 49824, // lfsr bits: 0b11000010100101000 + 22301, // lfsr bits: 0b11000111111010000 + 3469, // lfsr bits: 0b11001000001110110 + 39544, // lfsr bits: 0b11001101001000111 + 8612, // lfsr bits: 0b11010010101100011 + 67015, // lfsr bits: 0b11010100101101111 + 34335, // lfsr bits: 0b11011001000010111 + 41233, // lfsr bits: 0b11011111111100001 + 55011, // lfsr bits: 0b11100010000110000 + 65336, // lfsr bits: 0b11100101110001110 + 101392, // lfsr bits: 0b11101000000111110 + 72201, // lfsr bits: 0b11101111110101110 + 51524, // lfsr bits: 0b11110000000100111 + 85939, // lfsr bits: 0b11110110101111110 + 1731, // lfsr bits: 0b11111000000011010 + 68731, // lfsr bits: 0b11111101001001100 + }, + { + // Polynomial: 30 + 22385, // lfsr bits: 0b00000011100011111 + 11, // lfsr bits: 0b00000100001010101 + 106601, // lfsr bits: 0b00001001101011101 + 27537, // lfsr bits: 0b00001101101000011 + 36101, // lfsr bits: 0b00010010001011010 + 97930, // lfsr bits: 0b00010101101000011 + 30961, // lfsr bits: 0b00011010001101110 + 1708, // lfsr bits: 0b00011111110111100 + 72232, // lfsr bits: 0b00100010111110101 + 48142, // lfsr bits: 0b00100111100011010 + 10306, // lfsr bits: 0b00101010010010010 + 17230, // lfsr bits: 0b00101101000111011 + 67034, // lfsr bits: 0b00110001110100000 + 3444, // lfsr bits: 0b00110100111110011 + 101398, // lfsr bits: 0b00111011110010010 + 96221, // lfsr bits: 0b00111100010100000 + 103155, // lfsr bits: 0b01000011010100101 + 49868, // lfsr bits: 0b01000111110101000 + 61891, // lfsr bits: 0b01001000111000011 + 92855, // lfsr bits: 0b01001101001110111 + 75670, // lfsr bits: 0b01010010111101111 + 70462, // lfsr bits: 0b01010111100110000 + 68751, // lfsr bits: 0b01011001110101110 + 41211, // lfsr bits: 0b01011100101100000 + 65326, // lfsr bits: 0b01100011101001101 + 39522, // lfsr bits: 0b01100100001010110 + 58428, // lfsr bits: 0b01101001110101111 + 51588, // lfsr bits: 0b01101110100010011 + 8634, // lfsr bits: 0b01110001001111001 + 46357, // lfsr bits: 0b01110110000010111 + 94517, // lfsr bits: 0b01111010000101110 + 63558, // lfsr bits: 0b01111110001110000 + 37805, // lfsr bits: 0b10000010011101011 + 73921, // lfsr bits: 0b10000111110000001 + 15477, // lfsr bits: 0b10001000111000101 + 87660, // lfsr bits: 0b10001100110100111 + 12021, // lfsr bits: 0b10010001111111101 + 56684, // lfsr bits: 0b10010110110001100 + 42990, // lfsr bits: 0b10011001110110100 + 44661, // lfsr bits: 0b10011100010000111 + 32661, // lfsr bits: 0b10100011000010010 + 25762, // lfsr bits: 0b10100100010100011 + 84205, // lfsr bits: 0b10101001111000010 + 85968, // lfsr bits: 0b10101110010001011 + 99697, // lfsr bits: 0b10110011100101001 + 6908, // lfsr bits: 0b10110100101111100 + 108262, // lfsr bits: 0b10111000100010011 + 89337, // lfsr bits: 0b10111110001110000 + 20598, // lfsr bits: 0b11000000000011011 + 5175, // lfsr bits: 0b11000110010100011 + 60183, // lfsr bits: 0b11001001001001001 + 24022, // lfsr bits: 0b11001101110101101 + 79043, // lfsr bits: 0b11010000101001000 + 82504, // lfsr bits: 0b11010101010011100 + 80786, // lfsr bits: 0b11011011011101011 + 55031, // lfsr bits: 0b11011100011010010 + 18932, // lfsr bits: 0b11100000001001000 + 29242, // lfsr bits: 0b11100111010101010 + 104876, // lfsr bits: 0b11101000100111001 + 13735, // lfsr bits: 0b11101110011100010 + 91066, // lfsr bits: 0b11110001111010100 + 53279, // lfsr bits: 0b11110110101010100 + 34406, // lfsr bits: 0b11111011001001011 + 77335, // lfsr bits: 0b11111100111001001 + }, + { + // Polynomial: 31 + 72162, // lfsr bits: 0b00000010101101100 + 22338, // lfsr bits: 0b00000101010111100 + 49849, // lfsr bits: 0b00001001101011101 + 25776, // lfsr bits: 0b00001110010001010 + 82504, // lfsr bits: 0b00010000111100100 + 42968, // lfsr bits: 0b00010100101000101 + 60180, // lfsr bits: 0b00011000011010010 + 39526, // lfsr bits: 0b00011111101001110 + 70436, // lfsr bits: 0b00100001101101000 + 3444, // lfsr bits: 0b00100111111101100 + 30925, // lfsr bits: 0b00101000011100011 + 56741, // lfsr bits: 0b00101101011010100 + 8591, // lfsr bits: 0b00110000111110011 + 101402, // lfsr bits: 0b00110111010101000 + 103151, // lfsr bits: 0b00111000010101010 + 5135, // lfsr bits: 0b00111110111011111 + 32660, // lfsr bits: 0b01000001000111010 + 36113, // lfsr bits: 0b01000110111000010 + 65295, // lfsr bits: 0b01001011001101011 + 1714, // lfsr bits: 0b01001111100010000 + 67026, // lfsr bits: 0b01010000100010110 + 106559, // lfsr bits: 0b01010110001100110 + 80787, // lfsr bits: 0b01011001101100001 + 104873, // lfsr bits: 0b01011100110001110 + 68762, // lfsr bits: 0b01100011001001010 + 43, // lfsr bits: 0b01100110110100011 + 51552, // lfsr bits: 0b01101011001000110 + 92826, // lfsr bits: 0b01101110010001011 + 63577, // lfsr bits: 0b01110011110100000 + 44645, // lfsr bits: 0b01110101111111001 + 108245, // lfsr bits: 0b01111000101110100 + 27486, // lfsr bits: 0b01111101100010010 + 89379, // lfsr bits: 0b10000010011011100 + 18907, // lfsr bits: 0b10000101101111100 + 46407, // lfsr bits: 0b10001000110001010 + 17204, // lfsr bits: 0b10001110000000110 + 12036, // lfsr bits: 0b10010010111110001 + 97960, // lfsr bits: 0b10010110100111110 + 61863, // lfsr bits: 0b10011001011001000 + 6863, // lfsr bits: 0b10011110110010001 + 85948, // lfsr bits: 0b10100000100100101 + 29221, // lfsr bits: 0b10100100111010000 + 91094, // lfsr bits: 0b10101001100000001 + 10302, // lfsr bits: 0b10101111001010100 + 34388, // lfsr bits: 0b10110010011111100 + 96267, // lfsr bits: 0b10110110001011111 + 48140, // lfsr bits: 0b10111011001001100 + 84224, // lfsr bits: 0b10111111100110101 + 58470, // lfsr bits: 0b11000000010100011 + 54969, // lfsr bits: 0b11000100011001001 + 73927, // lfsr bits: 0b11001000011001011 + 75637, // lfsr bits: 0b11001101110111010 + 37812, // lfsr bits: 0b11010011110011000 + 79060, // lfsr bits: 0b11010100101100001 + 77330, // lfsr bits: 0b11011000000000100 + 15453, // lfsr bits: 0b11011110010110101 + 13780, // lfsr bits: 0b11100010001000101 + 94529, // lfsr bits: 0b11100100100000111 + 20634, // lfsr bits: 0b11101010110011110 + 87695, // lfsr bits: 0b11101111101111111 + 24035, // lfsr bits: 0b11110010000011101 + 53307, // lfsr bits: 0b11110111001010001 + 99680, // lfsr bits: 0b11111010000011011 + 41223, // lfsr bits: 0b11111100111011101 + }, +}; + +#endif /* __LH2_CHECKPOINTS_H_ */ diff --git a/bsp/lh2_decoder.h b/bsp/lh2_decoder.h new file mode 100644 index 0000000..07a606e --- /dev/null +++ b/bsp/lh2_decoder.h @@ -0,0 +1,92 @@ +#ifndef __LH2_DECODER_H_ +#define __LH2_DECODER_H_ + +/** + * @defgroup bsp_lh2_decoder LightHouse 2 decoder algorithms + * @ingroup bsp_lh2 + * @brief Algorithm to decode the lighthouse pulses, no hardware dependencies. + * + * @{ + * @file + * @author Said Alvarado-Marin + * @copyright Inria, 2025-present + * @} + */ + +#include +#include +#include "lh2.h" + +//=========================== defines ========================================== + +#define LH2_POLYNOMIAL_ERROR_INDICATOR 0xFF ///< indicate the polynomial index is invalid +#define LH2_LFSR_SEARCH_ERROR_INDICATOR 0xFFFFFFFF ///< indicate the polynomial index is invalid +// Un-comment the following line if you want to enable the Anti-Mocap fiter +#define LH2_MOCAP_FILTER 1 ///< Defined when the LH2 needs to coexits with a Qualysis Mocap system. It enables harsher anti-outlier filters + +// Dynamic checkpoints for the lsfr index search +typedef struct { + uint32_t bits[LH2_POLYNOMIAL_COUNT][LH2_SWEEP_COUNT]; ///< lfsr pseudo-random bits of the checkpoints + uint32_t count[LH2_POLYNOMIAL_COUNT][LH2_SWEEP_COUNT]; ///< corresponding lfsr index of the checkpoints +} _lfsr_checkpoint_t; + +//=========================== public =========================================== +/** + * @brief + * @param[in] sample_buffer: SPI samples loaded into a local buffer + * @return chipsH: 64-bits of demodulated data + */ +uint64_t _demodulate_light(uint8_t *sample_buffer); + +/** + * @brief from a 17-bit sequence and a polynomial, generate up to 64-17=47 bits as if the LFSR specified by poly were run forwards for numbits cycles, all little endian + * + * @param[in] poly: 17-bit polynomial + * @param[in] bits: starting seed + * @param[in] numbits: number of bits + * + * @return sequence of bits resulting from running the LFSR forward + */ +uint64_t _poly_check(uint32_t poly, uint32_t bits, uint8_t numbits); + +/** + * @brief find out which LFSR polynomial the bit sequence is a member of + * + * @param[in] chipsH1: input sequences of bits from demodulation + * @param[in] start_val: number of bits between the envelope falling edge and the beginning of the sequence where valid data has been found + * + * @return polynomial, indicating which polynomial was found, or FF for error (polynomial not found). + */ +uint8_t _determine_polynomial(uint64_t chipsH1, int8_t *start_val); + +/** + * @brief counts the number of 1s in a 64-bit + * + * @param[in] bits_in: arbitrary bits + * + * @return cumulative number of 1s inside of bits_in + */ +uint64_t _hamming_weight(uint64_t bits_in); + +/** + * @brief finds the position of a 17-bit sequence (bits) in the sequence generated by polynomial3 with initial seed 1 + * + * @param[in] checkpoints: structure with dynamic checkpoints + * @param[in] index: index of polynomial + * @param[in] bits: 17-bit sequence + * + * @return count: location of the sequence + */ +uint32_t _lfsr_index_search(_lfsr_checkpoint_t *checkpoints, uint8_t index, uint32_t bits); + +/** + * @brief checks an SPI capture for signs of Qualysis Mocap pulses interference. + * returns true if interference is found, returns false otherwise + * + * @param[in] arr: pointer to the array with the SPI capture to check + * @param[in] size: size of the buffer array to check + * @return True if interference is found, False otherwise + */ +bool _check_mocap_interference(uint8_t *arr, uint8_t size); + +#endif /* __LH2_DECODER_H_ */ diff --git a/bsp/nrf/lh2_decoder.c b/bsp/nrf/lh2_decoder.c new file mode 100644 index 0000000..0d59824 --- /dev/null +++ b/bsp/nrf/lh2_decoder.c @@ -0,0 +1,621 @@ +/** + * @file + * @ingroup bsp_lh2 + * + * @brief RP2040-specific definition of the "lh2" bsp module. + * + * @author Filip Maksimovic + * @author Said Alvarado-Marin + * @author Alexandre Abadie + * + * @copyright Inria, 2022 + */ +#include +#include +#include +#include +#include + +#include "lh2.h" +#include "lh2_decoder.h" +#include "lh2_checkpoints.h" + +//=========================== defines ========================================= + +#define FUZZY_CHIP 0xFF ///< not sure what this is about +#define POLYNOMIAL_BIT_ERROR_INITIAL_THRESHOLD 0 ///< tolerate no errors in received data +// #define POLYNOMIAL_BIT_ERROR_INITIAL_THRESHOLD 4 ///< initial threshold of polynomial error +#define HASH_TABLE_BITS 6 ///< How many bits will be used for the hashtable for the _end_buffers +#define HASH_TABLE_MASK ((1 << HASH_TABLE_BITS) - 1) ///< Mask selecting the HAS_TABLE_BITS least significant bits + +// Define variables useful for debuging +typedef uint32_t lfsr_17bits_t; + +//=========================== public =========================================== + +uint64_t _demodulate_light(uint8_t *sample_buffer) { // bad input variable name!! + // TODO: rename sample_buffer + // TODO: make it a void and have chips be a modified pointer thingie + // FIXME: there is an edge case where I throw away an initial "1" and do not count it in the bit-shift offset, resulting in an incorrect error of 1 in the LFSR location + uint8_t chip_index; + uint8_t local_buffer[128]; + uint8_t zccs_1[128]; + uint8_t chips1[128]; // TODO: give this a better name. + uint8_t temp_byte_N; // TODO: bad variable name "temp byte" + uint8_t temp_byte_M; // TODO: bad variable name "temp byte" + + // initialize loop variables + uint8_t ii = 0x00; + int jj = 0; + int kk = 0; + uint64_t gg = 0; + + // initialize temporary "ones counter" variable that counts consecutive ones + int ones_counter = 0; + + // initialize result: + uint64_t chipsH1 = 0; + + // FIND ZERO CROSSINGS + chip_index = 0; + zccs_1[chip_index] = 0x01; + + memcpy(local_buffer, sample_buffer, 128); + + // for loop over bytes of the SPI buffer (jj), nested with a for loop over bits in each byte (ii) + for (jj = 0; jj < 128; jj++) { + // edge case - check if last bit (LSB) of previous byte is the same as first bit (MSB) of current byte + // if it is not, increment chip_index and reset count + if (jj != 0) { + temp_byte_M = (local_buffer[jj - 1]) & (0x01); // previous byte's LSB + temp_byte_N = (local_buffer[jj] >> 7) & (0x01); // current byte's MSB + if (temp_byte_M != temp_byte_N) { + chip_index++; + zccs_1[chip_index] = 1; + } else { + zccs_1[chip_index] += 1; + } + } + // look at one byte at a time + for (ii = 7; ii > 0; ii--) { + temp_byte_M = ((local_buffer[jj]) >> (ii)) & (0x01); // bit shift by ii and mask + temp_byte_N = ((local_buffer[jj]) >> (ii - 1)) & (0x01); // bit shift by ii-1 and mask + if (temp_byte_M == temp_byte_N) { + zccs_1[chip_index] += 1; + } else { + chip_index++; + zccs_1[chip_index] = 1; + } + } + } + + // threshold the zero crossings into: likely one chip, likely two zero chips, or fuzzy + for (jj = 0; jj < 128; jj++) { + // not memory efficient, but ok for readability, turn ZCCS into chips by thresholding + if (zccs_1[jj] >= 5) { + chips1[jj] = 0; // it's a very likely zero + } else if (zccs_1[jj] <= 3) { + chips1[jj] = 1; // it's a very likely one + } else { + chips1[jj] = FUZZY_CHIP; // fuzzy + } + } + // final bit is bugged, make it fuzzy: + // chips1[127] = 0xFF; + + // DEMODULATION: + // basic principles, in descending order of importance: + // 1) an odd number of ones in a row is not allowed - this must be avoided at all costs + // 2) finding a solution to #1 given a set of data is quite cumbersome without certain assumptions + // a) a fuzzy before an odd run of 1s is almost always a 1 + // b) a fuzzy between two even runs of 1s is almost always a 0 + // c) a fuzzy after an even run of 1s is usually a a 0 + // 3) a detected 1 is rarely wrong, but detected 0s can be, this is especially common in low-SNR readings + // exception: if the first bit is a 1 it is NOT reliable because the capture is asynchronous + // 4) this is not perfect, but the earlier the chip, the more likely that it is correct. Polynomials can be used to fix bit errors later in the reading + // known bugs/issues: + // 1) if there are many ones at the very beginning of the reading, the algorithm will mess it up + // 2) in some instances, the count value will be off by approximately 5, the origin of this bug is unknown at the moment + // DEMODULATE PACKET: + + // reset variables: + kk = 0; + ones_counter = 0; + jj = 0; + for (jj = 0; jj < 128;) { // TODO: 128 is such an easy magic number to get rid of... + gg = 0; // TODO: this is not used here? + if (chips1[jj] == 0x00) { // zero, keep going, reset state + jj++; + ones_counter = 0; + } + if (chips1[jj] == 0x01) { // one, keep going, keep track of the # of ones + // k_msleep(10); + if (jj == 0) { // edge case - first chip = 1 is unreliable, do not increment 1s counter + jj++; + } else { + jj = jj + 1; + ones_counter = ones_counter + 1; + } + } + + if ((jj == 127) & (chips1[jj] == FUZZY_CHIP)) { + chips1[jj] = 0x00; + } else if ((chips1[jj] == FUZZY_CHIP) & (ones_counter == 0)) { // fuzz after a zero + // k_msleep(10); + if (chips1[jj + 1] == 0) { // zero then fuzz then zero -> fuzz is a zero + jj++; + chips1[jj - 1] = 0; + } else if (chips1[jj + 1] == FUZZY_CHIP) { // zero then fuzz then fuzz -> just move on, you're probably screwed + // k_msleep(10); + jj += 2; + } else if (chips1[jj + 1] == 1) { // zero then fuzz then one -> investigate + kk = 1; + ones_counter = 0; + while (chips1[jj + kk] == 1) { + ones_counter++; + kk++; + } + if (ones_counter % 2 == 1) { // fuzz -> odd ones, the fuzz is a 1 + jj++; + chips1[jj - 1] = 1; + ones_counter = 1; + } else if (ones_counter % 2 == 0) { // fuzz -> even ones, move on for now, it's indeterminate + jj++; + ones_counter = 0; // temporarily treat as a 0 for counting purposes + } else { // catch statement + jj++; + } + } + } else if ((chips1[jj] == FUZZY_CHIP) & (ones_counter != 0)) { // ones then fuzz + // k_msleep(10); + if ((ones_counter % 2 == 0) & (chips1[jj + 1] == 0)) { // even ones then fuzz then zero, fuzz is a zero + jj++; + chips1[jj - 1] = 0; + ones_counter = 0; + } + if ((ones_counter % 2 == 0) & (chips1[jj + 1] != 0)) { // even ones then fuzz then not zero - investigate + if (chips1[jj + 1] == 1) { // subsequent bit is a 1 + kk = 1; + while (chips1[jj + kk] == 1) { + ones_counter++; + kk++; + } + if (ones_counter % 2 == 1) { // indicates an odd # of 1s, so the fuzzy has to be a 1 + jj++; + chips1[jj - 1] = 1; + ones_counter = 1; // not actually 1, but it's ok for modulo purposes + } else if (ones_counter % 2 == 0) { // even ones -> fuzz -> even ones, indeterminate + jj++; + ones_counter = 0; + } + } else if (chips1[jj + 1] == FUZZY_CHIP) { // subsequent bit is a fuzzy - skip for now... + jj++; + } + } else if ((ones_counter % 2 == 1) & (chips1[jj + 1] == FUZZY_CHIP)) { // odd ones then fuzz then fuzz, fuzz is 1 then 0 + jj += 2; + chips1[jj - 1] = 0; + chips1[jj - 2] = 1; + ones_counter = 0; + } else if ((ones_counter % 2 == 1) & (chips1[jj + 1] != 0)) { // odd ones then fuzz then not zero - the fuzzy has to be a 1 + jj++; + ones_counter++; + chips1[jj - 1] = 1; + } else { // catch statement + jj++; + } + } + } + // finish up demodulation, pick off straggling fuzzies and odd runs of 1s + for (jj = 0; jj < 128;) { + if (chips1[jj] == 0x00) { // zero, keep going, reset state + if (ones_counter % 2 == 1) { // implies an odd # of 1s + chips1[jj - ones_counter - 1] = 1; // change the bit before the run of 1s to a 1 to make it even + } + jj++; + ones_counter = 0; + } else if (chips1[jj] == 0x01) { // one, keep going, keep track of the # of ones + if (jj == 0) { // edge case - first chip = 1 is unreliable, do not increment 1s counter + jj++; + } else { + jj = jj + 1; + ones_counter = ones_counter + 1; + } + } else if (chips1[jj] == FUZZY_CHIP) { + // if (ones_counter==0) { // fuzz after zeros, if the next chip is a 1, make it a 1, else make it a zero + // if (chips1[jj+1]==1) { + // jj+1; + // chips1[jj-1] = 1; + // ones_counter++; + // } + // else { + // jj++; + // } + // } <---- this is commented out because this is a VERY rare edge case and seems to be causing occasional problems w/ otherwise clean packets + if ((ones_counter != 0) & (ones_counter % 2 == 0)) { // fuzz after even ones - at this point this is almost always a 0 + jj++; + chips1[jj - 1] = 0; + ones_counter = 0; + } else if (ones_counter % 2 == 1) { // fuzz after odd ones - exceedingly uncommon at this point, make it a 1 + jj++; + chips1[jj - 1] = 1; + ones_counter++; + } else { // catch statement + jj++; + } + } else { // catch statement + jj++; + } + } + + // next step in demodulation: take the resulting array of 1 and 0 chips and put them into a single 64-bit unsigned int + // this is primarily for easy manipulation for polynomial searching + chip_index = 0; // TODO: rename "chip index" it's not descriptive + chipsH1 = 0; + gg = 0; // looping/while break indicating variable, reset to 0 + while (gg < 64) { // very last one - make all remaining fuzzies 0 and load it into two 64-bit longs + if (chip_index > 127) { + gg = 65; // break + } + if ((chip_index == 0) & (chips1[chip_index] == 0x01)) { // first bit is a 1 - ignore it + chip_index = chip_index + 1; + } else if ((chip_index == 0) & (chips1[chip_index] == FUZZY_CHIP)) { // first bit is fuzzy - ignore it + chip_index = chip_index + 1; + } else if (gg == 63) { // load the final bit + if (chips1[chip_index] == 0) { + chipsH1 &= 0xFFFFFFFFFFFFFFFE; + gg = gg + 1; + chip_index = chip_index + 1; + } else if (chips1[chip_index] == FUZZY_CHIP) { + chipsH1 &= 0xFFFFFFFFFFFFFFFE; + gg = gg + 1; + chip_index = chip_index + 1; + } else if (chips1[chip_index] == 0x01) { + chipsH1 |= 0x0000000000000001; + gg = gg + 1; + chip_index = chip_index + 2; + } + } else { // load the bit in!! + if (chips1[chip_index] == 0) { + chipsH1 &= 0xFFFFFFFFFFFFFFFE; + chipsH1 = chipsH1 << 1; + gg = gg + 1; + chip_index = chip_index + 1; + } else if (chips1[chip_index] == FUZZY_CHIP) { + chipsH1 &= 0xFFFFFFFFFFFFFFFE; + chipsH1 = chipsH1 << 1; + gg = gg + 1; + chip_index = chip_index + 1; + } else if (chips1[chip_index] == 0x01) { + chipsH1 |= 0x0000000000000001; + chipsH1 = chipsH1 << 1; + gg = gg + 1; + chip_index = chip_index + 2; + } + } + } + return chipsH1; +} + +uint64_t _poly_check(uint32_t poly, uint32_t bits, uint8_t numbits) { + uint64_t bits_out = 0; + uint8_t shift_counter = 1; + uint8_t b1 = 0; + uint32_t buffer = bits; // mask to prevent bit overflow + poly &= 0x00001FFFF; // mask to prevent silliness + bits_out |= buffer; // initialize 17 LSBs of result + bits_out &= 0x00000000FFFFFFFF; // mask because I didn't want to re-cast the buffer + + while (shift_counter <= numbits) { + bits_out = bits_out << 1; // shift left (forward in time) by 1 + + b1 = __builtin_popcount(buffer & poly) & 0x01; // mask the buffer w/ the selected polynomial + buffer = ((buffer << 1) | b1) & (0x0001FFFF); + + bits_out |= ((b1) & (0x01)); // put result of the XOR operation into the new bit + shift_counter++; + } + return bits_out; +} + +uint8_t _determine_polynomial(uint64_t chipsH1, int8_t *start_val) { + // check which polynomial the bit sequence is part of + // TODO: make function a void and modify memory directly + // TODO: rename chipsH1 to something relevant... like bits? + + // Handle the edgecase of a full zero input + if (chipsH1 == 0x00) { + return LH2_POLYNOMIAL_ERROR_INDICATOR; + } + + *start_val = 8; // TODO: remove this? possible that I modify start value during the demodulation process + + int32_t bits_N_for_comp = 47 - *start_val; + uint32_t bit_buffer1 = (uint32_t)(((0xFFFF800000000000) & chipsH1) >> 47); + uint64_t bits_from_poly[LH2_POLYNOMIAL_COUNT] = { 0 }; + uint8_t weights[LH2_POLYNOMIAL_COUNT] = { 0xFF }; + uint8_t selected_poly = LH2_POLYNOMIAL_ERROR_INDICATOR; // initialize to error condition + uint8_t min_weight_idx = LH2_POLYNOMIAL_ERROR_INDICATOR; + uint64_t min_weight = LH2_POLYNOMIAL_ERROR_INDICATOR; + uint64_t bits_to_compare = 0; + int32_t threshold = POLYNOMIAL_BIT_ERROR_INITIAL_THRESHOLD; + +#if defined(LH2_MOCAP_FILTER) + // tighten threshold if we expect MoCap interference + threshold = 0; +#endif + + // try polynomial vs. first buffer bits + // this search takes 17-bit sequences and runs them forwards through the polynomial LFSRs. + // if the remaining detected bits fit well with the chosen 17-bit sequence and a given polynomial, it is treated as "correct" + // in case of bit errors at the beginning of the capture, the 17-bit sequence is shifted (to a max of 8 bits) + // in case of bit errors at the end of the capture, the ending bits are removed (to a max of + // removing bits reduces the threshold correspondingly, as incorrect packet detection will cause a significant delay in location estimate + + // run polynomial search on the first capture + while (1) { + + // TODO: do this math stuff in multiple operations to: (a) make it readable (b) ensure order-of-execution + bit_buffer1 = (uint32_t)(((0xFFFF800000000000 >> (*start_val)) & chipsH1) >> (64 - 17 - (*start_val))); + bits_to_compare = (chipsH1 & (0xFFFFFFFFFFFFFFFF << (64 - 17 - (*start_val) - bits_N_for_comp))); + // reset the minimum polynomial match found + min_weight_idx = LH2_POLYNOMIAL_ERROR_INDICATOR; + min_weight = LH2_POLYNOMIAL_ERROR_INDICATOR; + // Check against all the known polynomials + for (uint8_t i = 0; i < LH2_POLYNOMIAL_COUNT; i++) { + bits_from_poly[i] = (((_poly_check(_polynomials[i], bit_buffer1, bits_N_for_comp)) << (64 - 17 - (*start_val) - bits_N_for_comp)) | (chipsH1 & (0xFFFFFFFFFFFFFFFF << (64 - (*start_val))))); + weights[i] = __builtin_popcount(bits_from_poly[i] ^ bits_to_compare); + // Keep track of the minimum weight value and which polinimial generated it. + if (weights[i] < min_weight) { + min_weight_idx = i; + min_weight = weights[i]; + } + } + + // If you found a sufficiently good value, then return which polinomial generated it + if (min_weight <= (uint64_t)threshold) { + selected_poly = min_weight_idx; + break; + // match failed, try again removing bits from the end + } else if (*start_val > 8) { + *start_val = 8; + bits_N_for_comp = bits_N_for_comp - 9; + if (threshold > 2) { + threshold = threshold - 1; + } else if (threshold == 2) { // keep threshold at ones, but you're probably screwed with an unlucky bit error + threshold = 2; + } + } else { + *start_val = *start_val + 1; + bits_N_for_comp -= 1; + } + + // too few bits to reliably compare, give up + if (bits_N_for_comp < 19) { + selected_poly = LH2_POLYNOMIAL_ERROR_INDICATOR; // mark the poly as "wrong" + break; + } + } + return selected_poly; +} + +// uint8_t _determine_polynomial_2(uint64_t input_bits, int8_t *start_val) { +// // check which polynomial the bit sequence is part of +// // TODO: make function a void and modify memory directly + +// // Handle the edgecase of a full zero input +// if (input_bits == 0x00) { +// return LH2_POLYNOMIAL_ERROR_INDICATOR; +// } + +// *start_val = 8; // how many bits to ignore from the START of the sequence (MSB) +// uint8_t end_val = 0; // how many bits to ignore from the END of the sequence (LSB) +// int32_t bits_N_for_comp = 64 - 17 - *start_val - end_val; // How many bits will be used to comparison. 64bit - start and end offset - 17bit from the sequence extended. +// uint64_t bits_to_compare = 0; // input bit sub-sequence used for the comparison. +// uint32_t lfsr_buffer = 0; // 17 bits sequence that will be extended using the known polynomials +// uint64_t predicted_bits[LH2_POLYNOMIAL_COUNT] = { 0 }; // bits predicted using the known polynomials, based on the input +// uint8_t weights[LH2_POLYNOMIAL_COUNT] = { 0xFF }; // score of how well each polynomial matches the input bits (lower the better, 0 is a perfect match) +// uint8_t selected_poly = LH2_POLYNOMIAL_ERROR_INDICATOR; // initialize to error condition +// uint8_t min_weight_idx = LH2_POLYNOMIAL_ERROR_INDICATOR; +// uint64_t min_weight = LH2_POLYNOMIAL_ERROR_INDICATOR; +// int32_t threshold = 0; // we don't tolerate a single bit error between the input bits and the predicted data. + +// // try polynomial vs. first buffer bits +// // this search takes 17-bit sequences and runs them forwards through the polynomial LFSRs. +// // if the remaining detected bits fit well with the chosen 17-bit sequence and a given polynomial, it is treated as "correct" +// // in case of bit errors at the beginning of the capture, the 17-bit sequence is shifted (to a max of 8 bits) +// // in case of bit errors at the end of the capture, the ending bits are removed (to a max of +// // removing bits reduces the threshold correspondingly, as incorrect packet detection will cause a significant delay in location estimate + +// // run polynomial search on the first capture +// while (1) { + +// // Select which 17bit sequence will be used to predict the rest of the sequence +// uint64_t mask_lfsr_buffer = 0xFFFF800000000000 >> (*start_val); // create a mask in the proper place +// mask_lfsr_buffer = mask_lfsr_buffer & input_bits; // apply the mask +// lfsr_buffer = (uint32_t)(mask_lfsr_buffer >> (64 - 17 - (*start_val))); // Move the masked bit to the right (right justify-them) + +// // TODO: do this math stuff in multiple operations to: (a) make it readable (b) ensure order-of-execution +// bits_to_compare = (input_bits & (0xFFFFFFFFFFFFFFFF << (64 - 17 - (*start_val) - bits_N_for_comp))); +// // reset the minimum polynomial match found +// min_weight_idx = LH2_POLYNOMIAL_ERROR_INDICATOR; +// min_weight = LH2_POLYNOMIAL_ERROR_INDICATOR; +// // Check against all the known polynomials +// for (uint8_t i = 0; i < LH2_POLYNOMIAL_COUNT; i++) { +// predicted_bits[i] = (((_poly_check(_polynomials[i], bit_buffer1, bits_N_for_comp)) << (64 - 17 - (*start_val) - bits_N_for_comp)) | (chipsH1 & (0xFFFFFFFFFFFFFFFF << (64 - (*start_val))))); +// weights[i] = __builtin_popcount(predicted_bits[i] ^ bits_to_compare); +// // Keep track of the minimum weight value and which polinimial generated it. +// if (weights[i] < min_weight) { +// min_weight_idx = i; +// min_weight = weights[i]; +// } +// } + +// // If you found a sufficiently good value, then return which polinomial generated it +// if (min_weight <= (uint64_t)threshold) { +// selected_poly = min_weight_idx; +// break; +// // match failed, try again removing bits from the end +// } else if (*start_val > 8) { +// *start_val = 8; +// bits_N_for_comp = bits_N_for_comp - 9; +// if (threshold > 2) { +// threshold = threshold - 1; +// } else if (threshold == 2) { // keep threshold at ones, but you're probably screwed with an unlucky bit error +// threshold = 2; +// } +// } else { +// *start_val = *start_val + 1; +// bits_N_for_comp -= 1; +// } + +// // too few bits to reliably compare, give up +// if (bits_N_for_comp < 19) { +// selected_poly = LH2_POLYNOMIAL_ERROR_INDICATOR; // mark the poly as "wrong" +// break; +// } +// } +// return selected_poly; +// } + +uint64_t _hamming_weight(uint64_t bits_in) { // TODO: bad name for function? or is it, it might be a good name for a function, because it describes exactly what it does + uint64_t weight = bits_in; + weight = weight - ((weight >> 1) & 0x5555555555555555); // find # of 1s in every 2-bit block + weight = (weight & 0x3333333333333333) + ((weight >> 2) & 0x3333333333333333); // find # of 1s in every 4-bit block + weight = (weight + (weight >> 4)) & 0x0F0F0F0F0F0F0F0F; // find # of 1s in every 8-bit block + weight = (weight + (weight >> 8)) & 0x00FF00FF00FF00FF; // find # of 1s in every 16-bit block + weight = (weight + (weight >> 16)) & 0x0000FFFF0000FFFF; // find # of 1s in every 32-bit block + weight = (weight + (weight >> 32)); // add the two 32-bit block results together + weight = weight & 0x000000000000007F; // mask final result, max value of 64, 0'b01000000 + return weight; +} + +uint32_t _lfsr_index_search(_lfsr_checkpoint_t *checkpoint, uint8_t index, uint32_t bits) { + + lfsr_17bits_t bits_local = bits & 0x0001FFFF; // initialize buffer to initial bits, masked + lfsr_17bits_t buffer_down = bits_local; + lfsr_17bits_t buffer_up = bits_local; + + uint32_t count_down = 0; + uint32_t count_up = 0; + int32_t count_final = 0; // There is a chance for overflow near the roll-over point of the lfsr sequence (sequence very high (>120k), hitting a very low check point (~20)) + uint32_t b17 = 0; + uint32_t b1 = 0; + uint32_t masked_buff = 0; + uint8_t hash_down = 0; + uint8_t hash_up = 0; + bool success = false; // True if the LFSR search produced a valid result + + // Copy const variables (Flash) into local variables (RAM) to speed up execution. + uint32_t _lfsr_hash_table_local[NUM_LSFR_COUNT_CHECKPOINTS] = { 0 }; + uint32_t _lfsr_index_table_local[NUM_LSFR_COUNT_CHECKPOINTS] = { 0 }; + uint32_t polynomials_local = _polynomials[index]; + for (size_t i = 0; i < NUM_LSFR_COUNT_CHECKPOINTS; i++) { + _lfsr_hash_table_local[i] = _lfsr_hash_table[index][i]; + _lfsr_index_table_local[i] = _lfsr_index_table[index][i]; + } + + // Start the iterative search + while (buffer_up != 0x00 && buffer_down != 0x00) { // Check that the count has not fallen into an invalid state { + + // + // CHECKPOINT CHECKING + // + + // Check lfsr backward count against precomputed checkpoints + hash_down = (buffer_down >> 11) & HASH_TABLE_MASK; + if (buffer_down == _lfsr_hash_table_local[hash_down]) { + count_final = count_down + _lfsr_index_table_local[hash_down]; + success = true; // mark the success of the search + break; + } + + // Check lfsr forward count against precomputed checkpoints + hash_up = (buffer_up >> 11) & HASH_TABLE_MASK; + if (buffer_up == _lfsr_hash_table_local[hash_up]) { + count_final = _lfsr_index_table_local[hash_up] - count_up; + success = true; // mark the success of the search + break; + } + + // Check the dynamical checkpoints, backward + // Sweep 0 + if (buffer_down == checkpoint->bits[index][0]) { + count_final = count_down + checkpoint->count[index][0]; + success = true; // mark the success of the search + break; + } + // Sweep 1 + if (buffer_down == checkpoint->bits[index][1]) { + count_final = count_down + checkpoint->count[index][1]; + success = true; // mark the success of the search + break; + } + + // Check the dynamical checkpoints, forward + // Sweep 0 + if (buffer_up == checkpoint->bits[index][0]) { + count_final = checkpoint->count[index][0] - count_up; + success = true; // mark the success of the search + break; + } + // Sweep 1 + if (buffer_up == checkpoint->bits[index][1]) { + count_final = checkpoint->count[index][1] - count_up; + success = true; // mark the success of the search + break; + } + + // + // LSFR UPDATE + // + + // LSFR backward update + b17 = buffer_down & 0x00000001; // save the "newest" bit of the buffer + buffer_down = (buffer_down & (0x0001FFFE)) >> 1; // shift the buffer right, backwards in time + masked_buff = (buffer_down) & (polynomials_local); // mask the buffer w/ the selected polynomial + buffer_down = buffer_down | (((__builtin_popcount(masked_buff) ^ b17) & 0x00000001) << 16); // This weird line propagates the LSFR one bit into the past + count_down++; + + // LSFR forward update + b1 = __builtin_popcount(buffer_up & polynomials_local) & 0x01; // mask the buffer w/ the selected polynomial + buffer_up = ((buffer_up << 1) | b1) & (0x0001FFFF); + count_up++; + } + + // Return the found lfsr value + if (success) { + // Handle overflows + if (count_final < 0) { + // wrap around the number + count_final += 131071; // 2^17 -1 (the full lenght of the sequence) + } + // Turn result back to unsigned before returning + return (uint32_t)count_final; + } else { + return LH2_LFSR_SEARCH_ERROR_INDICATOR; + } +} + +bool _check_mocap_interference(uint8_t *arr, uint8_t size) { + + // Qualysis Mocap cameras pulse IR light modulated with a regular square wave at 1Mhz. + // At the 32Mhz speed we sample the SPI, that corresponds to an alternating 0xFF,0xFF,0xFF,0x00,0x00,0x00 pattern + + // Check only the bottom half of the array, that should be enough to catch an error. + for (int i = 0; i < size / 2; i++) { + // Check for 3 consecutive 0xFF + if (arr[i] == 0xFF && arr[i + 1] == 0xFF && arr[i + 2] == 0xFF) { + return true; // Error for 3 consecutive 0xFF + } + + // Check for 3 consecutive 0x00 + if (arr[i] == 0x00 && arr[i + 1] == 0x00 && arr[i + 2] == 0x00) { + return true; // Error for 3 consecutive 0x00 + } + } + return false; // No error found +} + +//=========================== private ========================================== + +//=========================== interrupts ======================================= diff --git a/bsp/nrf/lh2_default.c b/bsp/nrf/lh2_default.c index 2fe8075..e508739 100644 --- a/bsp/nrf/lh2_default.c +++ b/bsp/nrf/lh2_default.c @@ -19,6 +19,8 @@ #include "gpio.h" #include "lh2.h" +#include "lh2_decoder.h" +#include "lh2_checkpoints.h" #include "timer_hf.h" #include "board_config.h" @@ -83,569 +85,52 @@ typedef struct { uint8_t count; // Number of arrays in buffer } lh2_ring_buffer_t; -typedef struct { - uint8_t spi_rx_buffer[SPI_BUFFER_SIZE]; ///< buffer where data coming from SPI are stored - lh2_ring_buffer_t data; ///< array containing demodulation data of each locations -} lh2_vars_t; - -//=========================== variables ======================================== - -static const uint32_t _polynomials[LH2_POLYNOMIAL_COUNT] = { - 0x0001D258, - 0x00017E04, - 0x0001FF6B, - 0x00013F67, - 0x0001B9EE, - 0x000198D1, - 0x000178C7, - 0x00018A55, +///< List of rotational periods (in microseconds) of the lighthouse basestation in all its 16 modes. +static const uint16_t _lh2_sweep_period_us[LH2_BASESTATION_COUNT] = { + 19979, + 19938, + 19854, + 19771, + 19729, + 19646, + 19604, + 19563, + 19521, + 19354, + 19146, + 18979, + 18896, + 18771, + 18604, + 18479, }; static const uint32_t _periods[LH2_BASESTATION_COUNT] = { 959000, 957000, 953000, - 951000, + 949000, + 947000, + 943000, + 941000, + 939000, + 937000, + 929000, + 919000, + 911000, + 907000, + 901900, + 893000, + 887000, }; -static const uint32_t _end_buffers[LH2_POLYNOMIAL_COUNT][NUM_LSFR_COUNT_CHECKPOINTS] = { - { - // p0 - 0x00000000000000001, // [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1] starting seed, little endian - 0b10000000000011010, - 0b10000001010110001, - 0b10111000000110000, - 0b10101010110011101, - 0b10100001010111011, - 0b01011000111100110, - 0b00011011100000011, - 0b10001010101011010, - 0b01001010001111101, - 0b00010010100011000, - 0b00000100111000011, - 0b11001100100000010, - 0b00111111101111011, - 0b10110010010110001, - 0b01110001000110111, - 0b01100101100011111, - 0b11010001101010100, - 0b00011011101110011, - 0b10001110100000011, - 0b10010001101011110, - 0b11011011010100011, - 0b11011111100110001, - 0b00010100010110011, - 0b10100011001011111, - 0b00111110110000100, - 0b10001100001010011, - 0b11100011011100000, - 0b11110001010110001, - 0b11101000000111110, - 0b00011010010010011, - 0b10101010010100101, - 0b10111000110011011, - 0b10111111000001001, - 0b00101101110010101, - 0b10100100100011100, - 0b10100110100011110, - 0b11001000101110010, - 0b11100111100101101, - 0b00111101010100010, - 0b11001101100010000, - 0b00001001001100101, - 0b10001010111010001, - 0b01000111000001001, - 0b01000101110011111, - 0b00111100011000011, - 0b11111111000001001, - 0b11101101110000010, - 0b11100101011110101, - 0b01000010100110110, - 0b10110111000100001, - 0b10010110011001011, - 0b01001001110110111, - 0b01011011110010010, - 0b01000110110010010, - 0b01100101110010010, - 0b11011100110011101, - 0b01000011010111101, - 0b10010110101000000, - 0b01011111011001111, - 0b10000110101101011, - 0b00101100111011001, - 0b10010101110100110, - 0b00001110011011111, - }, - { - // p1 - 0x00000000000000001, // [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1] starting seed, little endian - 0b00000001111100000, - 0b11111111000111010, - 0b10111000111011000, - 0b11010000110111110, - 0b10001100001111010, - 0b10010111100011101, - 0b10011100011010010, - 0b10110111100111100, - 0b11101101100100000, - 0b11110110110010101, - 0b01110110111101110, - 0b11000010101101111, - 0b01101111000011101, - 0b01000000000111001, - 0b01010101101000101, - 0b00101110001101110, - 0b11010000111010000, - 0b00001100001001010, - 0b11011100001000011, - 0b01000011000110100, - 0b00001101001011100, - 0b11010100111100011, - 0b10100011000111100, - 0b00010001010011110, - 0b01011011010101010, - 0b10101110010010010, - 0b10100001010111011, - 0b10100101111010001, - 0b01010111100110110, - 0b11110110001100000, - 0b10000101000110111, - 0b10011000000100001, - 0b00110001110110000, - 0b10100001010001101, - 0b11100111111101000, - 0b01110011011010110, - 0b11010000101111011, - 0b10101001001000100, - 0b00010000111001111, - 0b00100011101000011, - 0b00110110001000011, - 0b11110011101001111, - 0b10100101011110000, - 0b10111011010000101, - 0b11001010000111101, - 0b11101011111010011, - 0b00000001110111100, - 0b00110010100110110, - 0b00101111010110001, - 0b11101110010000001, - 0b10011100010011101, - 0b01000111111100110, - 0b01100111101100011, - 0b10100100000010011, - 0b11011100110100101, - 0b10001101000111011, - 0b01001010000111000, - 0b11100110011110111, - 0b11111000000100100, - 0b00111100110011100, - 0b11011000110000110, - 0b00011011111011000, - 0b10011000101010001, - }, - { - // p2 - 0x00000000000000001, // [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1] starting seed, little endian - 0b11001110010011010, - 0b00111011100000111, - 0b10011010101111011, - 0b00011011011000100, - 0b01100001111001001, - 0b00100011000101100, - 0b01110100001110110, - 0b01011101010010110, - 0b00011111001011100, - 0b11111101101001011, - 0b00110100010100010, - 0b11001011001101010, - 0b01100110111001010, - 0b01000010000110001, - 0b00011011111101001, - 0b01110001111011010, - 0b01011010100110111, - 0b10010110101101111, - 0b01001001010111011, - 0b10110110011111010, - 0b10010001010110000, - 0b11001011000000110, - 0b00001011000001000, - 0b10110001110000001, - 0b11111010001101100, - 0b01110110010001010, - 0b00100000010110111, - 0b10001001011101001, - 0b00100101110000111, - 0b10001100100001100, - 0b10000011101111100, - 0b00000010011101011, - 0b01010000011010001, - 0b01011110000100010, - 0b00100100000010110, - 0b01100010101111011, - 0b01101010010110001, - 0b00110111001111111, - 0b11010110101011110, - 0b00111000001101111, - 0b01000010110010001, - 0b01010110110011001, - 0b00110011110100111, - 0b10101011100111000, - 0b11010010001000100, - 0b11001011111100111, - 0b01001000000110001, - 0b01111110101111111, - 0b01111000110111110, - 0b11101100001001001, - 0b00011010000000010, - 0b01000011110101010, - 0b11111111111010011, - 0b10001011001010010, - 0b00100100100111000, - 0b01001011100000011, - 0b11111101110110110, - 0b10111111010001011, - 0b10101111001100000, - 0b00010110111101110, - 0b10100010011011000, - 0b01111001011100111, - 0b10000110110011101, - }, - { - // p3 - 0x00000000000000001, // [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1] starting seed, little endian - 0b00101100000100010, - 0b10001100001111000, - 0b10001110100110011, - 0b11011011110010110, - 0b00010010100101011, - 0b01001100111011111, - 0b00110011010010101, - 0b11000100000001101, - 0b01010011010101100, - 0b01111100110100001, - 0b10011011011110001, - 0b11100011000010110, - 0b00010000010000010, - 0b10110110011111000, - 0b00110111011100001, - 0b00011111010001100, - 0b00000101100001100, - 0b01011000011110010, - 0b10111011011111111, - 0b11000001011110011, - 0b11011000000000011, - 0b00011011000101100, - 0b10100101100010011, - 0b10011101110001010, - 0b11110010001000101, - 0b10001011101110001, - 0b01010010000000110, - 0b00001011001111000, - 0b10000000110111001, - 0b00010001010100001, - 0b10100111110001010, - 0b00111100010000101, - 0b11001101011101111, - 0b11000010010010010, - 0b01100010001001001, - 0b01001111001010100, - 0b10000000010000100, - 0b11010011011101100, - 0b01000111000101000, - 0b01011010010110011, - 0b10100000101001111, - 0b10101110100001100, - 0b00010101100111011, - 0b11111101010001100, - 0b01100000101101000, - 0b10001011110011100, - 0b10001100100101101, - 0b00110101011011111, - 0b11010110000110010, - 0b11101011101110000, - 0b00010111001011011, - 0b01110110010101011, - 0b00111001000001010, - 0b10111101110100011, - 0b11001111000000011, - 0b00010000110100010, - 0b01111110100101011, - 0b00011001010001101, - 0b11111001111101101, - 0b00010111110101110, - 0b10011101110100010, - 0b10011100001001111, - 0b00101011101001101, - }, - { - // p4 - 0x00000000000000001, // [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1] starting seed, little endian - 0b00111101010111100, - 0b01010011100100100, - 0b01100001100011000, - 0b11000011111110101, - 0b00100100011111011, - 0b00010000110000011, - 0b10001000111100101, - 0b01111110000100101, - 0b11010110111101011, - 0b01110001000011100, - 0b10101100100110100, - 0b01011100011111100, - 0b11001111011011111, - 0b00100101010010110, - 0b00010011000100100, - 0b11001000111100000, - 0b10110111000100001, - 0b00110000001111000, - 0b10101100001001111, - 0b00010001010010110, - 0b01001001110100010, - 0b01010001110000110, - 0b00101110010101101, - 0b00100010100111011, - 0b01000010110100110, - 0b01110110111010010, - 0b10101110001110110, - 0b10111101100101000, - 0b01000010111011011, - 0b11010100011001110, - 0b01010011110010111, - 0b01000101010111010, - 0b11110110100000001, - 0b01101011000100010, - 0b01101101111000101, - 0b10111101100011011, - 0b10011110001001000, - 0b00110101110101111, - 0b10011111101011101, - 0b11110100111101000, - 0b10110000011111110, - 0b00001100010101110, - 0b11100011111011001, - 0b11100010000111100, - 0b11001001011110111, - 0b10000011010010101, - 0b01010001101001001, - 0b11010010101101010, - 0b01001101001100111, - 0b00110110011011100, - 0b00111000010100101, - 0b01101100110010010, - 0b01000010000010001, - 0b01001000111110101, - 0b10101110010001100, - 0b11111000100010000, - 0b10111001000011000, - 0b00100101111101011, - 0b00111011000100010, - 0b00111011101100011, - 0b10001010110100100, - 0b10011010101100001, - 0b10111100101010110, - }, - { - // p5 - 0x00000000000000001, // [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1] starting seed, little endian - 0b10000110010011101, - 0b10010100110011101, - 0b11101111001011001, - 0b11001000010011110, - 0b01111111110111110, - 0b00100011010001111, - 0b01011101110101000, - 0b10011010101100010, - 0b00111101111110011, - 0b00110010000110101, - 0b10100111011001111, - 0b01100111010001011, - 0b00100010110011110, - 0b00011010000101110, - 0b11001001101001100, - 0b11011011100110100, - 0b00000010111000100, - 0b11111011010010001, - 0b00100100000011000, - 0b01001000001001100, - 0b10111011101111001, - 0b00111001100101000, - 0b00111011000011100, - 0b11000001001111010, - 0b10010010011100111, - 0b11000001101100001, - 0b11010010110000101, - 0b11001000010010000, - 0b00010111101011110, - 0b01000110001101000, - 0b01110001010000100, - 0b10001110110110000, - 0b00111111101100011, - 0b01000000111011101, - 0b11000001100011101, - 0b11111001001100101, - 0b10000110101001011, - 0b01011111100010011, - 0b11110001000101010, - 0b01100001010010111, - 0b01101011100011111, - 0b01101110000100100, - 0b00101101001000111, - 0b01000110101100010, - 0b10010000010110000, - 0b01111011100011110, - 0b00110011110101011, - 0b11010011000101000, - 0b01011110110001100, - 0b00101011110111001, - 0b00010100001111011, - 0b01011001111000111, - 0b00010100011100111, - 0b11011110010111101, - 0b11111000111011101, - 0b10011010110011010, - 0b01101010000110010, - 0b10101111110000010, - 0b00110111001010101, - 0b00001001000001110, - 0b00000010110111000, - 0b11010000101110001, - 0b01101010111000011, - }, - { - // p6 - 0x00000000000000001, // [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1] starting seed, little endian - 0b00010010000111001, - 0b01001101111111100, - 0b00010100111011111, - 0b01110110101110110, - 0b01010101000001110, - 0b00111001110010110, - 0b00011000111001010, - 0b00111111000100011, - 0b00111010001001001, - 0b10010001101110110, - 0b10011110001110100, - 0b10011010110110011, - 0b11110010100110101, - 0b11100001000101111, - 0b11010000111111101, - 0b11110001001110000, - 0b10010001111000110, - 0b10100011001000001, - 0b10001000011101000, - 0b10001101001000111, - 0b11100111010110100, - 0b00001010100010001, - 0b01110010010010001, - 0b01001000110110000, - 0b01011010000010000, - 0b01100110100001100, - 0b10111001000100001, - 0b01000011100101101, - 0b10111010001110010, - 0b11011001111000001, - 0b10110000010001111, - 0b00100110001001001, - 0b11000011000110001, - 0b11110011100010110, - 0b01011101101010000, - 0b11001011101000100, - 0b11100001011010110, - 0b11111111100000101, - 0b10000100111001101, - 0b11001011011100111, - 0b11101110011001010, - 0b11001100100001001, - 0b10001001000101101, - 0b11001101100101000, - 0b01011001111000100, - 0b01111010110011010, - 0b00110011110100011, - 0b00100011001101100, - 0b11101010000001011, - 0b11110100100010110, - 0b11011011000111000, - 0b01011101001100000, - 0b11000100010110001, - 0b10000111011101111, - 0b10010001111111101, - 0b11111001011001111, - 0b11101011111101111, - 0b00100101001100010, - 0b10100000011000110, - 0b01001101000100110, - 0b11000110110101010, - 0b01101010101001110, - 0b00010101100100011, - }, - { - // p7 - 0x00000000000000001, // [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1] starting seed, little endian - 0b11111111111001011, - 0b10101101101100110, - 0b00100101101010000, - 0b01000010111001111, - 0b10010001000110001, - 0b10010100011110001, - 0b10010110111000011, - 0b00011111000011111, - 0b00011000111000111, - 0b01101000010001001, - 0b00001010011011000, - 0b00100101010100111, - 0b01110010111010110, - 0b00101101000111111, - 0b11111010001011001, - 0b10001110011000110, - 0b10010110011101110, - 0b11001101111111010, - 0b01001101110010110, - 0b01000011011111110, - 0b11101100100011100, - 0b10000101011010011, - 0b11111111100101101, - 0b01001001000001101, - 0b11001101110001101, - 0b01000000110011101, - 0b11000001101011011, - 0b01110011110100100, - 0b01110011011101110, - 0b01010001111111000, - 0b01011101100100000, - 0b10010000110101010, - 0b11111001001110010, - 0b10000001100101101, - 0b10000001000010111, - 0b01010001101010011, - 0b10110010100011000, - 0b11001101110101011, - 0b01000101000110100, - 0b00011011000110101, - 0b10101100110101110, - 0b10010110011010111, - 0b00110100110001110, - 0b11001100101110100, - 0b11110100100010010, - 0b11011011001101110, - 0b10100101000101111, - 0b10011000101101111, - 0b10000111001010110, - 0b01001100000100100, - 0b00101010011110001, - 0b10100001000111100, - 0b11010101101110010, - 0b11111000011101010, - 0b11000101010011110, - 0b11110100001010000, - 0b00000111000000100, - 0b01000100101100001, - 0b01101001011000111, - 0b01010010010011110, - 0b10001111110000100, - 0b11100110010111101, - 0b10000101011010000, - }, -}; +typedef struct { + uint8_t spi_rx_buffer[SPI_BUFFER_SIZE]; ///< buffer where data coming from SPI are stored + lh2_ring_buffer_t data; ///< array containing demodulation data of each locations + _lfsr_checkpoint_t checkpoint; ///< Dynamic checkpoints for the lsfr index search +} lh2_vars_t; + +//=========================== variables ======================================== static uint16_t _end_buffers_hashtable[HASH_TABLE_SIZE] = { 0 }; @@ -684,43 +169,6 @@ static lh2_vars_t _lh2_vars; ///< local data of the LH2 driver */ bool _initialize_ts4231(const gpio_t *gpio_d, const gpio_t *gpio_e); -/** - * @brief - * @param[in] sample_buffer: SPI samples loaded into a local buffer - * @return chipsH: 64-bits of demodulated data - */ -uint64_t _demodulate_light(uint8_t *sample_buffer); - -/** - * @brief from a 17-bit sequence and a polynomial, generate up to 64-17=47 bits as if the LFSR specified by poly were run forwards for numbits cycles, all little endian - * - * @param[in] poly: 17-bit polynomial - * @param[in] bits: starting seed - * @param[in] numbits: number of bits - * - * @return sequence of bits resulting from running the LFSR forward - */ -uint64_t _poly_check(uint32_t poly, uint32_t bits, uint8_t numbits); - -/** - * @brief find out which LFSR polynomial the bit sequence is a member of - * - * @param[in] chipsH1: input sequences of bits from demodulation - * @param[in] start_val: number of bits between the envelope falling edge and the beginning of the sequence where valid data has been found - * - * @return polynomial, indicating which polynomial was found, or FF for error (polynomial not found). - */ -uint8_t _determine_polynomial(uint64_t chipsH1, int8_t *start_val); - -/** - * @brief counts the number of 1s in a 64-bit - * - * @param[in] bits_in: arbitrary bits - * - * @return cumulative number of 1s inside of bits_in - */ -uint64_t _hamming_weight(uint64_t bits_in); - /** * @brief finds the position of a 17-bit sequence (bits) in the sequence generated by polynomial3 with initial seed 1 * @@ -780,13 +228,6 @@ void _add_to_spi_ring_buffer(lh2_ring_buffer_t *cb, uint8_t *data, uint32_t time */ bool _get_from_spi_ring_buffer(lh2_ring_buffer_t *cb, uint8_t *data, uint32_t *timestamp); -/** - * @brief generates a hashtable from the LSFR checpoints and stores it in an array. - * - * @param[in] hash_table pointer to the array where the hashtable will be stored - */ -void _fill_hash_table(uint16_t *hash_table); - /** * @brief Accesses the global tables _lfsr_checkpoint_hashtable & _lfsr_checkpoint_count * and updates them with the last found polynomial count @@ -794,8 +235,9 @@ void _fill_hash_table(uint16_t *hash_table); * @param[in] polynomial: index of polynomial * @param[in] bits: 17-bit sequence * @param[in] count: position of the received laser sweep in the LSFR sequence + * @param[in] sweep: index of the sweep (0 or 1) */ -void _update_lfsr_checkpoints(uint8_t polynomial, uint32_t bits, uint32_t count); +void _update_lfsr_checkpoints(uint8_t polynomial, uint32_t bits, uint32_t count, uint8_t sweep); /** * @brief LH2 sweeps come with an almost perfect 20ms difference. @@ -808,14 +250,6 @@ void _update_lfsr_checkpoints(uint8_t polynomial, uint32_t bits, uint32_t count) */ uint8_t _select_sweep(db_lh2_t *lh2, uint8_t polynomial, uint32_t timestamp); -/** - * @brief checks an SPI capture for signs of Qualysis Mocap pulses interference. - * returns true if interference is found, returns false otherwise - * - * @param[in] arr: pointer to the array with the SPI capture to check - * @return True if interference is found, False otherwise - */ -bool _check_mocap_interference(uint8_t *arr); //=========================== public =========================================== bool db_lh2_init(db_lh2_t *lh2, const gpio_t *gpio_d, const gpio_t *gpio_e) { @@ -856,9 +290,6 @@ bool db_lh2_init(db_lh2_t *lh2, const gpio_t *gpio_d, const gpio_t *gpio_e) { } memset(_lh2_vars.data.buffer[0], 0, LH2_BUFFER_SIZE); - // Initialize the hash table for the lsfr checkpoints - _fill_hash_table(_end_buffers_hashtable); - // initialize GPIOTEs _gpiote_setup(gpio_e); @@ -892,6 +323,7 @@ void db_lh2_reset(db_lh2_t *lh2) { } void db_lh2_process_location(db_lh2_t *lh2) { + // There is no TS4231 data to process, return early. if (_lh2_vars.data.count == 0) { return; } @@ -912,18 +344,18 @@ void db_lh2_process_location(db_lh2_t *lh2) { return; } - // Check if Qualysis Mocap data is interfering with the SPI capture +// Check if Qualysis Mocap data is interfering with the SPI capture #if defined(LH2_MOCAP_FILTER) - if (_check_mocap_interference(temp_spi_bits)) { + if (_check_mocap_interference(temp_spi_bits, SPI_BUFFER_SIZE)) { return; // if a qualysis pulse caused a false spi trigger, leave the function. } #endif - // perform the demodulation + poly search on the received packets - // convert the SPI reading to bits via zero-crossing counter demodulation and differential/biphasic manchester decoding + // perform the demodulation received packets + // convert the SPI reading to bits via zero-crossing counter demodulation and differential/biphasic manchester decoding. uint64_t temp_bits_sweep = _demodulate_light(temp_spi_bits); - // figure out which polynomial each one of the two samples come from. + // figure out which polynomial the data belongs to int8_t temp_bit_offset = 0; // default offset uint8_t temp_selected_polynomial = _determine_polynomial(temp_bits_sweep, &temp_bit_offset); @@ -932,29 +364,43 @@ void db_lh2_process_location(db_lh2_t *lh2) { return; } - // Figure in which of the two sweep slots we should save the new data. + // Figure out in which of the two sweep slots we should save the new data. uint8_t sweep = _select_sweep(lh2, temp_selected_polynomial, temp_timestamp); - // Put the newly read polynomials in the data structure (polynomial 0,1 must map to LH0, 2,3 to LH1. This can be accomplish by integer-dividing the selected poly in 2, a shift >> accomplishes this.) - // This structur always holds the two most recent sweeps from any lighthouse + // Compute which basestation the sweep came from (polynomial 0,1 must map to LH0, 2,3 to LH1, etc... This can be accomplish by integer-dividing the selected poly in 2, a shift >> accomplishes this.) uint8_t basestation = temp_selected_polynomial >> 1; //*********************************************************************************// - // Compute Polynomial Count // + // Compute LFSR Position // //*********************************************************************************// + // Select the valid bits of the lfsr by applying the offset (he first few bits might be invalid, as detected by _determine_polynomial()) + uint32_t temp_lfsr_bits = temp_bits_sweep >> (47 - temp_bit_offset); + // Sanity check, make sure you don't start the LFSR search with a bit-sequence full of zeros. - if ((temp_bits_sweep >> (47 - temp_bit_offset)) == 0x000000) { + if (temp_lfsr_bits == 0x000000) { // Mark the data as wrong and keep going lh2->data_ready[sweep][basestation] = DB_LH2_NO_NEW_DATA; return; } - // Compute and save the lsfr count. - uint32_t temp_lfsr_counts = _reverse_count_p( - temp_selected_polynomial, - temp_bits_sweep >> (47 - temp_bit_offset)) - - temp_bit_offset; + // Compute the lfsr location. + uint32_t temp_lfsr_loc = _lfsr_index_search(&_lh2_vars.checkpoint, + temp_selected_polynomial, + temp_lfsr_bits); + + // Check that the count didn't fall on an illegal value + if (temp_lfsr_loc != LH2_LFSR_SEARCH_ERROR_INDICATOR) { + // Save a new dynamic checkpoint + _update_lfsr_checkpoints(temp_selected_polynomial, temp_lfsr_bits, temp_lfsr_loc, sweep); + } else { + // Mark the data as wrong and keep going + lh2->data_ready[sweep][basestation] = DB_LH2_NO_NEW_DATA; + return; + } + + // Undo the bit offset introduced above, to get the LFSR position of the first bit that hit the sensor. + temp_lfsr_loc -= temp_bit_offset; //*********************************************************************************// // Store results // @@ -963,7 +409,7 @@ void db_lh2_process_location(db_lh2_t *lh2) { // Save raw data information lh2->timestamps[sweep][basestation] = temp_timestamp; // Save processed location information - lh2->locations[sweep][basestation].lfsr_counts = temp_lfsr_counts; + lh2->locations[sweep][basestation].lfsr_counts = temp_lfsr_loc; lh2->locations[sweep][basestation].selected_polynomial = temp_selected_polynomial; // Mark the data point as processed lh2->data_ready[sweep][basestation] = DB_LH2_PROCESSED_DATA_AVAILABLE; @@ -1143,480 +589,6 @@ bool _initialize_ts4231(const gpio_t *gpio_d, const gpio_t *gpio_e) { return true; } -uint64_t _demodulate_light(uint8_t *sample_buffer) { // bad input variable name!! - // TODO: rename sample_buffer - // TODO: make it a void and have chips be a modified pointer thingie - // FIXME: there is an edge case where I throw away an initial "1" and do not count it in the bit-shift offset, resulting in an incorrect error of 1 in the LFSR location - uint8_t chip_index; - uint8_t local_buffer[128]; - uint8_t zccs_1[128]; - uint8_t chips1[128]; // TODO: give this a better name. - uint8_t temp_byte_N; // TODO: bad variable name "temp byte" - uint8_t temp_byte_M; // TODO: bad variable name "temp byte" - - // initialize loop variables - uint8_t ii = 0x00; - int jj = 0; - int kk = 0; - uint64_t gg = 0; - - // initialize temporary "ones counter" variable that counts consecutive ones - int ones_counter = 0; - - // initialize result: - uint64_t chipsH1 = 0; - - // FIND ZERO CROSSINGS - chip_index = 0; - zccs_1[chip_index] = 0x01; - - memcpy(local_buffer, sample_buffer, 128); - - // for loop over bytes of the SPI buffer (jj), nested with a for loop over bits in each byte (ii) - for (jj = 0; jj < 128; jj++) { - // edge case - check if last bit (LSB) of previous byte is the same as first bit (MSB) of current byte - // if it is not, increment chip_index and reset count - if (jj != 0) { - temp_byte_M = (local_buffer[jj - 1]) & (0x01); // previous byte's LSB - temp_byte_N = (local_buffer[jj] >> 7) & (0x01); // current byte's MSB - if (temp_byte_M != temp_byte_N) { - chip_index++; - zccs_1[chip_index] = 1; - } else { - zccs_1[chip_index] += 1; - } - } - // look at one byte at a time - for (ii = 7; ii > 0; ii--) { - temp_byte_M = ((local_buffer[jj]) >> (ii)) & (0x01); // bit shift by ii and mask - temp_byte_N = ((local_buffer[jj]) >> (ii - 1)) & (0x01); // bit shift by ii-1 and mask - if (temp_byte_M == temp_byte_N) { - zccs_1[chip_index] += 1; - } else { - chip_index++; - zccs_1[chip_index] = 1; - } - } - } - - // threshold the zero crossings into: likely one chip, likely two zero chips, or fuzzy - for (jj = 0; jj < 128; jj++) { - // not memory efficient, but ok for readability, turn ZCCS into chips by thresholding - if (zccs_1[jj] >= 5) { - chips1[jj] = 0; // it's a very likely zero - } else if (zccs_1[jj] <= 3) { - chips1[jj] = 1; // it's a very likely one - } else { - chips1[jj] = FUZZY_CHIP; // fuzzy - } - } - // final bit is bugged, make it fuzzy: - // chips1[127] = 0xFF; - - // DEMODULATION: - // basic principles, in descending order of importance: - // 1) an odd number of ones in a row is not allowed - this must be avoided at all costs - // 2) finding a solution to #1 given a set of data is quite cumbersome without certain assumptions - // a) a fuzzy before an odd run of 1s is almost always a 1 - // b) a fuzzy between two even runs of 1s is almost always a 0 - // c) a fuzzy after an even run of 1s is usually a a 0 - // 3) a detected 1 is rarely wrong, but detected 0s can be, this is especially common in low-SNR readings - // exception: if the first bit is a 1 it is NOT reliable because the capture is asynchronous - // 4) this is not perfect, but the earlier the chip, the more likely that it is correct. Polynomials can be used to fix bit errors later in the reading - // known bugs/issues: - // 1) if there are many ones at the very beginning of the reading, the algorithm will mess it up - // 2) in some instances, the count value will be off by approximately 5, the origin of this bug is unknown at the moment - // DEMODULATE PACKET: - - // reset variables: - kk = 0; - ones_counter = 0; - jj = 0; - for (jj = 0; jj < 128;) { // TODO: 128 is such an easy magic number to get rid of... - gg = 0; // TODO: this is not used here? - if (chips1[jj] == 0x00) { // zero, keep going, reset state - jj++; - ones_counter = 0; - } - if (chips1[jj] == 0x01) { // one, keep going, keep track of the # of ones - // k_msleep(10); - if (jj == 0) { // edge case - first chip = 1 is unreliable, do not increment 1s counter - jj++; - } else { - jj = jj + 1; - ones_counter = ones_counter + 1; - } - } - - if ((jj == 127) & (chips1[jj] == FUZZY_CHIP)) { - chips1[jj] = 0x00; - } else if ((chips1[jj] == FUZZY_CHIP) & (ones_counter == 0)) { // fuzz after a zero - // k_msleep(10); - if (chips1[jj + 1] == 0) { // zero then fuzz then zero -> fuzz is a zero - jj++; - chips1[jj - 1] = 0; - } else if (chips1[jj + 1] == FUZZY_CHIP) { // zero then fuzz then fuzz -> just move on, you're probably screwed - // k_msleep(10); - jj += 2; - } else if (chips1[jj + 1] == 1) { // zero then fuzz then one -> investigate - kk = 1; - ones_counter = 0; - while (chips1[jj + kk] == 1) { - ones_counter++; - kk++; - } - if (ones_counter % 2 == 1) { // fuzz -> odd ones, the fuzz is a 1 - jj++; - chips1[jj - 1] = 1; - ones_counter = 1; - } else if (ones_counter % 2 == 0) { // fuzz -> even ones, move on for now, it's indeterminate - jj++; - ones_counter = 0; // temporarily treat as a 0 for counting purposes - } else { // catch statement - jj++; - } - } - } else if ((chips1[jj] == FUZZY_CHIP) & (ones_counter != 0)) { // ones then fuzz - // k_msleep(10); - if ((ones_counter % 2 == 0) & (chips1[jj + 1] == 0)) { // even ones then fuzz then zero, fuzz is a zero - jj++; - chips1[jj - 1] = 0; - ones_counter = 0; - } - if ((ones_counter % 2 == 0) & (chips1[jj + 1] != 0)) { // even ones then fuzz then not zero - investigate - if (chips1[jj + 1] == 1) { // subsequent bit is a 1 - kk = 1; - while (chips1[jj + kk] == 1) { - ones_counter++; - kk++; - } - if (ones_counter % 2 == 1) { // indicates an odd # of 1s, so the fuzzy has to be a 1 - jj++; - chips1[jj - 1] = 1; - ones_counter = 1; // not actually 1, but it's ok for modulo purposes - } else if (ones_counter % 2 == 0) { // even ones -> fuzz -> even ones, indeterminate - jj++; - ones_counter = 0; - } - } else if (chips1[jj + 1] == FUZZY_CHIP) { // subsequent bit is a fuzzy - skip for now... - jj++; - } - } else if ((ones_counter % 2 == 1) & (chips1[jj + 1] == FUZZY_CHIP)) { // odd ones then fuzz then fuzz, fuzz is 1 then 0 - jj += 2; - chips1[jj - 1] = 0; - chips1[jj - 2] = 1; - ones_counter = 0; - } else if ((ones_counter % 2 == 1) & (chips1[jj + 1] != 0)) { // odd ones then fuzz then not zero - the fuzzy has to be a 1 - jj++; - ones_counter++; - chips1[jj - 1] = 1; - } else { // catch statement - jj++; - } - } - } - // finish up demodulation, pick off straggling fuzzies and odd runs of 1s - for (jj = 0; jj < 128;) { - if (chips1[jj] == 0x00) { // zero, keep going, reset state - if (ones_counter % 2 == 1) { // implies an odd # of 1s - chips1[jj - ones_counter - 1] = 1; // change the bit before the run of 1s to a 1 to make it even - } - jj++; - ones_counter = 0; - } else if (chips1[jj] == 0x01) { // one, keep going, keep track of the # of ones - if (jj == 0) { // edge case - first chip = 1 is unreliable, do not increment 1s counter - jj++; - } else { - jj = jj + 1; - ones_counter = ones_counter + 1; - } - } else if (chips1[jj] == FUZZY_CHIP) { - // if (ones_counter==0) { // fuzz after zeros, if the next chip is a 1, make it a 1, else make it a zero - // if (chips1[jj+1]==1) { - // jj+1; - // chips1[jj-1] = 1; - // ones_counter++; - // } - // else { - // jj++; - // } - // } <---- this is commented out because this is a VERY rare edge case and seems to be causing occasional problems w/ otherwise clean packets - if ((ones_counter != 0) & (ones_counter % 2 == 0)) { // fuzz after even ones - at this point this is almost always a 0 - jj++; - chips1[jj - 1] = 0; - ones_counter = 0; - } else if (ones_counter % 2 == 1) { // fuzz after odd ones - exceedingly uncommon at this point, make it a 1 - jj++; - chips1[jj - 1] = 1; - ones_counter++; - } else { // catch statement - jj++; - } - } else { // catch statement - jj++; - } - } - - // next step in demodulation: take the resulting array of 1 and 0 chips and put them into a single 64-bit unsigned int - // this is primarily for easy manipulation for polynomial searching - chip_index = 0; // TODO: rename "chip index" it's not descriptive - chipsH1 = 0; - gg = 0; // looping/while break indicating variable, reset to 0 - while (gg < 64) { // very last one - make all remaining fuzzies 0 and load it into two 64-bit longs - if (chip_index > 127) { - gg = 65; // break - } - if ((chip_index == 0) & (chips1[chip_index] == 0x01)) { // first bit is a 1 - ignore it - chip_index = chip_index + 1; - } else if ((chip_index == 0) & (chips1[chip_index] == FUZZY_CHIP)) { // first bit is fuzzy - ignore it - chip_index = chip_index + 1; - } else if (gg == 63) { // load the final bit - if (chips1[chip_index] == 0) { - chipsH1 &= 0xFFFFFFFFFFFFFFFE; - gg = gg + 1; - chip_index = chip_index + 1; - } else if (chips1[chip_index] == FUZZY_CHIP) { - chipsH1 &= 0xFFFFFFFFFFFFFFFE; - gg = gg + 1; - chip_index = chip_index + 1; - } else if (chips1[chip_index] == 0x01) { - chipsH1 |= 0x0000000000000001; - gg = gg + 1; - chip_index = chip_index + 2; - } - } else { // load the bit in!! - if (chips1[chip_index] == 0) { - chipsH1 &= 0xFFFFFFFFFFFFFFFE; - chipsH1 = chipsH1 << 1; - gg = gg + 1; - chip_index = chip_index + 1; - } else if (chips1[chip_index] == FUZZY_CHIP) { - chipsH1 &= 0xFFFFFFFFFFFFFFFE; - chipsH1 = chipsH1 << 1; - gg = gg + 1; - chip_index = chip_index + 1; - } else if (chips1[chip_index] == 0x01) { - chipsH1 |= 0x0000000000000001; - chipsH1 = chipsH1 << 1; - gg = gg + 1; - chip_index = chip_index + 2; - } - } - } - return chipsH1; -} - -uint64_t _poly_check(uint32_t poly, uint32_t bits, uint8_t numbits) { - uint64_t bits_out = 0; - uint8_t shift_counter = 1; - uint8_t b1 = 0; - uint32_t buffer = bits; // mask to prevent bit overflow - poly &= 0x00001FFFF; // mask to prevent silliness - bits_out |= buffer; // initialize 17 LSBs of result - bits_out &= 0x00000000FFFFFFFF; // mask because I didn't want to re-cast the buffer - - while (shift_counter <= numbits) { - bits_out = bits_out << 1; // shift left (forward in time) by 1 - - b1 = __builtin_popcount(buffer & poly) & 0x01; // mask the buffer w/ the selected polynomial - buffer = ((buffer << 1) | b1) & (0x0001FFFF); - - bits_out |= ((b1) & (0x01)); // put result of the XOR operation into the new bit - shift_counter++; - } - return bits_out; -} - -uint8_t _determine_polynomial(uint64_t chipsH1, int8_t *start_val) { - // check which polynomial the bit sequence is part of - // TODO: make function a void and modify memory directly - // TODO: rename chipsH1 to something relevant... like bits? - - *start_val = 8; // TODO: remove this? possible that I modify start value during the demodulation process - - int32_t bits_N_for_comp = 47 - *start_val; - uint32_t bit_buffer1 = (uint32_t)(((0xFFFF800000000000) & chipsH1) >> 47); - uint64_t bits_from_poly[LH2_POLYNOMIAL_COUNT] = { 0 }; - uint64_t weights[LH2_POLYNOMIAL_COUNT] = { 0xFFFFFFFFFFFFFFFF }; - uint8_t selected_poly = LH2_POLYNOMIAL_ERROR_INDICATOR; // initialize to error condition - uint8_t min_weight_idx = LH2_POLYNOMIAL_ERROR_INDICATOR; - uint64_t min_weight = LH2_POLYNOMIAL_ERROR_INDICATOR; - uint64_t bits_to_compare = 0; - int32_t threshold = POLYNOMIAL_BIT_ERROR_INITIAL_THRESHOLD; - -#if defined(LH2_MOCAP_FILTER) - threshold = 0; -#endif - - // try polynomial vs. first buffer bits - // this search takes 17-bit sequences and runs them forwards through the polynomial LFSRs. - // if the remaining detected bits fit well with the chosen 17-bit sequence and a given polynomial, it is treated as "correct" - // in case of bit errors at the beginning of the capture, the 17-bit sequence is shifted (to a max of 8 bits) - // in case of bit errors at the end of the capture, the ending bits are removed (to a max of - // removing bits reduces the threshold correspondingly, as incorrect packet detection will cause a significant delay in location estimate - - // run polynomial search on the first capture - while (1) { - - // TODO: do this math stuff in multiple operations to: (a) make it readable (b) ensure order-of-execution - bit_buffer1 = (uint32_t)(((0xFFFF800000000000 >> (*start_val)) & chipsH1) >> (64 - 17 - (*start_val))); - bits_to_compare = (chipsH1 & (0xFFFFFFFFFFFFFFFF << (64 - 17 - (*start_val) - bits_N_for_comp))); - // reset the minimum polynomial match found - min_weight_idx = LH2_POLYNOMIAL_ERROR_INDICATOR; - min_weight = LH2_POLYNOMIAL_ERROR_INDICATOR; - // Check against all the known polynomials - for (uint8_t i = 0; i < LH2_POLYNOMIAL_COUNT; i++) { - bits_from_poly[i] = (((_poly_check(_polynomials[i], bit_buffer1, bits_N_for_comp)) << (64 - 17 - (*start_val) - bits_N_for_comp)) | (chipsH1 & (0xFFFFFFFFFFFFFFFF << (64 - (*start_val))))); - // weights[i] = _hamming_weight(bits_from_poly[i] ^ bits_to_compare); - weights[i] = __builtin_popcount(bits_from_poly[i] ^ bits_to_compare); - // Keep track of the minimum weight value and which polinimial generated it. - if (weights[i] < min_weight) { - min_weight_idx = i; - min_weight = weights[i]; - } - } - - // If you found a sufficiently good value, then return which polinomial generated it - if (min_weight <= (uint64_t)threshold) { - selected_poly = min_weight_idx; - break; - // match failed, try again removing bits from the end - } else if (*start_val > 8) { - *start_val = 8; - bits_N_for_comp = bits_N_for_comp - 9; - if (threshold > 2) { - threshold = threshold - 1; - } else if (threshold == 2) { // keep threshold at ones, but you're probably screwed with an unlucky bit error - threshold = 2; - } - } else { - *start_val = *start_val + 1; - bits_N_for_comp -= 1; - } - - // too few bits to reliably compare, give up - if (bits_N_for_comp < 19) { - selected_poly = LH2_POLYNOMIAL_ERROR_INDICATOR; // mark the poly as "wrong" - break; - } - } - return selected_poly; -} - -uint64_t _hamming_weight(uint64_t bits_in) { // TODO: bad name for function? or is it, it might be a good name for a function, because it describes exactly what it does - uint64_t weight = bits_in; - weight = weight - ((weight >> 1) & 0x5555555555555555); // find # of 1s in every 2-bit block - weight = (weight & 0x3333333333333333) + ((weight >> 2) & 0x3333333333333333); // find # of 1s in every 4-bit block - weight = (weight + (weight >> 4)) & 0x0F0F0F0F0F0F0F0F; // find # of 1s in every 8-bit block - weight = (weight + (weight >> 8)) & 0x00FF00FF00FF00FF; // find # of 1s in every 16-bit block - weight = (weight + (weight >> 16)) & 0x0000FFFF0000FFFF; // find # of 1s in every 32-bit block - weight = (weight + (weight >> 32)); // add the two 32-bit block results together - weight = weight & 0x000000000000007F; // mask final result, max value of 64, 0'b01000000 - return weight; -} - -uint32_t _reverse_count_p(uint8_t index, uint32_t bits) { - - bits = bits & 0x0001FFFF; // initialize buffer to initial bits, masked - uint32_t buffer_down = bits; - uint32_t buffer_up = bits; - - uint32_t count_down = 0; - uint32_t count_up = 0; - uint32_t b17 = 0; - uint32_t b1 = 0; - uint32_t masked_buff = 0; - uint8_t hash_index_down = 0; - uint8_t hash_index_up = 0; - - // Copy const variables (Flash) into local variables (RAM) to speed up execution. - uint32_t _end_buffers_local[NUM_LSFR_COUNT_CHECKPOINTS] = { 0 }; - uint32_t polynomials_local = _polynomials[index]; - for (size_t i = 0; i < NUM_LSFR_COUNT_CHECKPOINTS; i++) { - _end_buffers_local[i] = _end_buffers[index][i]; - } - - while (buffer_up != _end_buffers_local[0]) // do until buffer reaches one of the saved states - { - - // - // CHECKPOINT CHECKING - // - - // Check end_buffer backward count - // Lower hash option in the hash table - hash_index_down = _end_buffers_hashtable[(buffer_down >> 2) & HASH_TABLE_MASK] & CHECKPOINT_TABLE_MASK_LOW; - if (buffer_down == _end_buffers_local[hash_index_down]) { - count_down = count_down + 2048 * hash_index_down - 1; - _update_lfsr_checkpoints(index, bits, count_down); - return count_down; - } - // Upper hash option in the hash table - hash_index_down = (_end_buffers_hashtable[(buffer_down >> 2) & HASH_TABLE_MASK] & CHECKPOINT_TABLE_MASK_HIGH) >> CHECKPOINT_TABLE_BITS; - if (buffer_down == _end_buffers_local[hash_index_down]) { - count_down = count_down + 2048 * hash_index_down - 1; - _update_lfsr_checkpoints(index, bits, count_down); - return count_down; - } - - // Check end_buffer forward count - // Lower hash option in the hash table - hash_index_up = _end_buffers_hashtable[(buffer_up >> 2) & HASH_TABLE_MASK] & CHECKPOINT_TABLE_MASK_LOW; - if (buffer_up == _end_buffers_local[hash_index_up]) { - count_up = 2048 * hash_index_up - count_up - 1; - _update_lfsr_checkpoints(index, bits, count_up); - return count_up; - } - // Upper hash option in the hash table - hash_index_up = (_end_buffers_hashtable[(buffer_up >> 2) & HASH_TABLE_MASK] & CHECKPOINT_TABLE_MASK_HIGH) >> CHECKPOINT_TABLE_BITS; - if (buffer_up == _end_buffers_local[hash_index_up]) { - count_up = 2048 * hash_index_up - count_up - 1; - _update_lfsr_checkpoints(index, bits, count_up); - return count_up; - } - - // Check the dynamical checkpoints, backward - if (buffer_down == _lfsr_checkpoint_bits[index][0]) { - count_down = count_down + _lfsr_checkpoint_count[index][0]; - _update_lfsr_checkpoints(index, bits, count_down); - return count_down; - } - if (buffer_down == _lfsr_checkpoint_bits[index][1]) { - count_down = count_down + _lfsr_checkpoint_count[index][1]; - _update_lfsr_checkpoints(index, bits, count_down); - return count_down; - } - - // Check the dynamical checkpoints, forward - if (buffer_up == _lfsr_checkpoint_bits[index][0]) { - count_up = _lfsr_checkpoint_count[index][0] - count_up; - _update_lfsr_checkpoints(index, bits, count_up); - return count_up; - } - if (buffer_up == _lfsr_checkpoint_bits[index][1]) { - count_up = _lfsr_checkpoint_count[index][1] - count_up; - _update_lfsr_checkpoints(index, bits, count_up); - return count_up; - } - - // - // LSFR UPDATE - // - // LSFR backward update - b17 = buffer_down & 0x00000001; // save the "newest" bit of the buffer - buffer_down = (buffer_down & (0x0001FFFE)) >> 1; // shift the buffer right, backwards in time - masked_buff = (buffer_down) & (polynomials_local); // mask the buffer w/ the selected polynomial - buffer_down = buffer_down | (((__builtin_popcount(masked_buff) ^ b17) & 0x00000001) << 16); // This weird line propagates the LSFR one bit into the past - count_down++; - - // LSFR forward update - b1 = __builtin_popcount(buffer_up & polynomials_local) & 0x01; // mask the buffer w/ the selected polynomial - buffer_up = ((buffer_up << 1) | b1) & (0x0001FFFF); - count_up++; - } - return count_up; -} - void _lh2_pin_set_input(const gpio_t *gpio) { // Configure Data pin as INPUT, with no pullup or pull down. nrf_port[gpio->port]->PIN_CNF[gpio->pin] = (GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) | @@ -1737,41 +709,20 @@ bool _get_from_spi_ring_buffer(lh2_ring_buffer_t *cb, uint8_t *data, uint32_t *t return true; } - -void _fill_hash_table(uint16_t *hash_table) { - - // Iterate over all the checkpoints and save the HASH_TABLE_BITS 11 bits as a a index for the hashtable - for (size_t poly = 0; poly < LH2_POLYNOMIAL_COUNT; poly++) { - for (size_t checkpoint = 1; checkpoint < NUM_LSFR_COUNT_CHECKPOINTS; checkpoint++) { - if (hash_table[(_end_buffers[poly][checkpoint] >> 2) & HASH_TABLE_MASK] == 0) { // We shift by 2 to the right because we precomputed that that hash has the least amount of collisions in the hash table - - hash_table[(_end_buffers[poly][checkpoint] >> 2) & HASH_TABLE_MASK] = checkpoint & CHECKPOINT_TABLE_MASK_LOW; // that element of the hash table is empty, copy the checkpoint into the lower 6 bits - } else { - hash_table[(_end_buffers[poly][checkpoint] >> 2) & HASH_TABLE_MASK] |= (checkpoint << CHECKPOINT_TABLE_BITS) & CHECKPOINT_TABLE_MASK_HIGH; // If the element is already occupied, use the upper 6 bits - } - } - } -} - -void _update_lfsr_checkpoints(uint8_t polynomial, uint32_t bits, uint32_t count) { - - // Update the current running weighted sum. 75% of old value +25% of new value - _lsfr_checkpoint_average = (((_lsfr_checkpoint_average * 3) >> 2) + (count >> 2)); - - // Is the new count higher or lower than the current running average. - uint8_t index = count <= _lsfr_checkpoint_average ? 0 : 1; +void _update_lfsr_checkpoints(uint8_t polynomial, uint32_t bits, uint32_t count, uint8_t sweep) { // Save the new count in the correct place in the checkpoint array - _lfsr_checkpoint_bits[polynomial][index] = bits; - _lfsr_checkpoint_count[polynomial][index] = count; + _lh2_vars.checkpoint.bits[polynomial][sweep] = bits; + _lh2_vars.checkpoint.count[polynomial][sweep] = count; } uint8_t _select_sweep(db_lh2_t *lh2, uint8_t polynomial, uint32_t timestamp) { // TODO: check the exact, per-mode period of each polynomial instead of using a blanket 20ms - uint8_t basestation = polynomial >> 1; ///< each base station uses 2 polynomials. integer dividing by 2 maps the polynomial number to the basestation number. - uint32_t now = db_timer_hf_now(LH2_TIMER_DEV); - // check that current data stored is not too old. + uint8_t basestation = polynomial >> 1; ///< each base station uses 2 polynomials. integer dividing by 2 maps the polynomial number to the basestation number. + uint16_t sweep_period = _lh2_sweep_period_us[basestation]; + uint32_t now = db_timer_hf_now(LH2_TIMER_DEV); + for (size_t sweep = 0; sweep < 2; sweep++) { if (now - lh2->timestamps[0][basestation] > LH2_MAX_DATA_VALID_TIME_US) { // Remove data that is too old. @@ -1798,8 +749,8 @@ uint8_t _select_sweep(db_lh2_t *lh2, uint8_t polynomial, uint32_t timestamp) { case LH2_SWEEP_FIRST_SLOT_EMPTY: { // check that the filled slot is not a perfect 20ms match to the new data. - uint32_t diff = (timestamp - lh2->timestamps[1][basestation]) % LH2_SWEEP_PERIOD_US; - diff = diff < LH2_SWEEP_PERIOD_US - diff ? diff : LH2_SWEEP_PERIOD_US - diff; + uint32_t diff = (timestamp - lh2->timestamps[1][basestation]) % sweep_period; + diff = diff < sweep_period - diff ? diff : sweep_period - diff; if (diff < LH2_SWEEP_PERIOD_THRESHOLD_US) { // match: use filled slot @@ -1814,8 +765,8 @@ uint8_t _select_sweep(db_lh2_t *lh2, uint8_t polynomial, uint32_t timestamp) { case LH2_SWEEP_SECOND_SLOT_EMPTY: { // check that the filled slot is not a perfect 20ms match to the new data. - uint32_t diff = (timestamp - lh2->timestamps[0][basestation]) % LH2_SWEEP_PERIOD_US; - diff = diff < LH2_SWEEP_PERIOD_US - diff ? diff : LH2_SWEEP_PERIOD_US - diff; + uint32_t diff = (timestamp - lh2->timestamps[0][basestation]) % sweep_period; + diff = diff < sweep_period - diff ? diff : sweep_period - diff; if (diff < LH2_SWEEP_PERIOD_THRESHOLD_US) { // match: use filled slot @@ -1830,10 +781,10 @@ uint8_t _select_sweep(db_lh2_t *lh2, uint8_t polynomial, uint32_t timestamp) { case LH2_SWEEP_BOTH_SLOTS_FULL: { // How far away is this new pulse from the already stored data - uint32_t diff_0 = (timestamp - lh2->timestamps[0][basestation]) % LH2_SWEEP_PERIOD_US; - diff_0 = diff_0 < LH2_SWEEP_PERIOD_US - diff_0 ? diff_0 : LH2_SWEEP_PERIOD_US - diff_0; - uint32_t diff_1 = (timestamp - lh2->timestamps[1][basestation]) % LH2_SWEEP_PERIOD_US; - diff_1 = diff_1 < LH2_SWEEP_PERIOD_US - diff_1 ? diff_1 : LH2_SWEEP_PERIOD_US - diff_1; + int64_t diff_0 = ((timestamp - lh2->timestamps[0][basestation]) % sweep_period); + diff_0 = diff_0 < sweep_period - diff_0 ? diff_0 : sweep_period - diff_0; + int64_t diff_1 = ((timestamp - lh2->timestamps[1][basestation]) % sweep_period); + diff_1 = diff_1 < sweep_period - diff_1 ? diff_1 : sweep_period - diff_1; // Use the one that is closest to 20ms if (diff_0 <= diff_1) { @@ -1855,25 +806,6 @@ uint8_t _select_sweep(db_lh2_t *lh2, uint8_t polynomial, uint32_t timestamp) { return selected_sweep; } -bool _check_mocap_interference(uint8_t *arr) { - - // Qualysis Mocap cameras pulse IR light modulated with a regular square wave at 1Mhz. - // At the 32Mhz speed we sample the SPI, that corresponds to an alternating 0xFF,0xFF,0xFF,0x00,0x00,0x00 pattern - - // Check only the bottom half of the array, that should be enough to catch an error. - for (int i = 0; i < SPI_BUFFER_SIZE / 2; i++) { - // Check for 3 consecutive 0xFF - if (arr[i] == 0xFF && arr[i + 1] == 0xFF && arr[i + 2] == 0xFF) { - return true; // Error for 3 consecutive 0xFF - } - // Check for 3 consecutive 0x00 - if (arr[i] == 0x00 && arr[i + 1] == 0x00 && arr[i + 2] == 0x00) { - return true; // Error for 3 consecutive 0x00 - } - } - return false; // No error found -} - void db_lh2_handle_isr(void) { // Reenable the PPI channel db_lh2_start(); diff --git a/doc/sphinx/bsp.md b/doc/sphinx/bsp.md index fbc0bac..8a14d84 100644 --- a/doc/sphinx/bsp.md +++ b/doc/sphinx/bsp.md @@ -16,6 +16,8 @@ _api/bsp_gpio _api/bsp_i2c _api/bsp_ipc _api/bsp_lh2 +_api/bsp_lh2_decoder +_api/bsp_lh2_checkpoints _api/bsp_nvmc _api/bsp_partition _api/bsp_pwm