Advertisement
Solingen

z12.1.cpp

Dec 22nd, 2024
15
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.28 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4.  
  5. // Умножение полиномов над F2 (без сокращения по модулю x^n)
  6. unsigned int polyMul(unsigned int a, unsigned int b)
  7. {
  8. // a и b в двоичном представлении
  9. // например, a=101(2) = x^2 + 1
  10. // Перемножаем как биты над F2
  11. unsigned int res = 0;
  12. while (b > 0)
  13. {
  14. if (b & 1) res ^= a; // XOR вместо +
  15. a <<= 1;
  16. b >>= 1;
  17. }
  18. return res;
  19. }
  20.  
  21. // Проверка, делится ли p(x) на q(x) над F2 (где deg(q)<deg(p)?)
  22. // Можно выполнить обычное полиномиальное деление по модулю 2
  23. bool isDivisible(unsigned int p, unsigned int q)
  24. {
  25. // копируем
  26. unsigned int r = p;
  27. // получим степени
  28. int degP = 31 - __builtin_clz(r);
  29. int degQ = 31 - __builtin_clz(q);
  30.  
  31. while (degP >= degQ)
  32. {
  33. // Сдвигаем q, чтобы выровнять старший бит с r
  34. unsigned int shift = degP - degQ;
  35. r ^= (q << shift);
  36. // новый degP
  37. if (r == 0) return true;
  38. degP = 31 - __builtin_clz(r);
  39. }
  40. return (r == 0);
  41. }
  42.  
  43. // Проверка неприводимости
  44. bool isIrreducible(unsigned int poly, int n)
  45. {
  46. // Старший бит (x^n) должен быть = 1 (иначе степень меньше n)
  47. // poly < 2^n -> это значит старший коэффициент не 1. Нам нужны именно степени ровно n.
  48. // Поэтому poly должен быть в диапазоне [2^(n), 2^(n+1)-1].
  49. // Также не должно быть делителя степени < n
  50. // Перебираем все полиномы степени от 1 до n-1 и проверяем делимость
  51. for (int d = 1; d < n; d++)
  52. {
  53. // перебираем все полиномы степени d
  54. unsigned int start = 1u << d; // 100..0 (d+1 бит)
  55. unsigned int end = (1u << (d+1)) - 1; // 111..1 (d+1 бит)
  56. for (unsigned int q = start; q <= end; q++)
  57. {
  58. // Если q делит poly, то poly приводим
  59. if (isDivisible(poly, q))
  60. {
  61. return false;
  62. }
  63. }
  64. }
  65. return true;
  66. }
  67.  
  68. int main()
  69. {
  70. int n;
  71. cout << "Введите n (<=8): ";
  72. cin >> n;
  73.  
  74. // Перебираем многочлены от 2^n (100...0b) до 2^(n+1)-1 (111...1b)
  75. unsigned int start = 1u << n;
  76. unsigned int end = (1u << (n+1)) - 1;
  77.  
  78. int countIrred = 0;
  79. for (unsigned int poly = start; poly <= end; poly++)
  80. {
  81. if (isIrreducible(poly, n))
  82. {
  83. countIrred++;
  84. // Выводим двоичное представление
  85. cout << "Неприводимый: ";
  86. for (int bit = n; bit >= 0; bit--)
  87. {
  88. cout << ((poly >> bit) & 1);
  89. if (bit > 0) cout << " ";
  90. }
  91. cout << endl;
  92. }
  93. }
  94.  
  95. cout << "Всего неприводимых: " << countIrred << endl;
  96. return 0;
  97. }
  98.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement